正则表达式
就是正则不作解释
- ‘00\d’ 匹配 007 不能匹配 00a
- ‘\d\d\d’ 匹配三位数字
- ‘\w\w\d’ 匹配两位英文+一位数字
- ‘.’ 匹配任意
- ‘py.’ 匹配pyc,pyo,py!等
要匹配变长的字符串,在正则中用表示
**’‘ 表示任意个字符 +** 表示至少一个字符
解读’\d{3}\s+\d{3,8}’
表示三个随意的数字 后面添加一个空白或者Tab按键 再添加3-8个数字
解读\d{3}-\d{3,8}
010-12345 因为-需要转移 所以使用\表示转义
进阶
- [0-9a-zA-Z_] 表示 可以匹配一个数字字母或者下划线
- [0-9a-zA-Z_]+ 以匹配至少由一个数字、字母或者下划线组成的字符串’a100’,’0_Z’,’Py3000’
- [a-zA-Z_][0-9a-zA-Z_]* 可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量
- [a-zA-Z_][0-9a-zA-Z_]{0, 19} 更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)
A|B 表示匹配A表达式或者B表达式 (P|p)ython 表示匹配Python 或者python
^表示开头 ^\d表示必须以数字开头
$表示结束 ^\d表示以数字结束
‘py’ 可以匹配python
^py$ 只能匹配py
re模块
python提供re模块 包含所有正则表达式功能
由于Python的字符串本身也用\转义,所以要特别注意:
1 | s = 'ABC\\-001' # Python的字符串 |
使用Python的r前缀,就不用考虑转义的问题了
1 | s = r'ABC\-001' # Python的字符串 |
正则的使用
1 | import re |
匹配成功 match返回一个match对象 否则返回一个None
匹配格式
1 | test = '用户输入的字符串' |
切分字符串
1 | s = 'a b ;, c' |
分组
除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)
^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码
1 | a = '010-12345' |
1 | t = '19:05:30' |
贪婪匹配
最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0:
1 | >>> re.match(r'^(\d+)(0*)$', '102300').groups() |
由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。
必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:
1 | >>> re.match(r'^(\d+?)(0*)$', '102300').groups() |
编译
当我们使用正则表达式的时候 re模块内部干了两件事
- 编译正则表达式,如果是错误的正则表达式 ,python会报错
- 使用编译以后的正则表达式去匹配字符串
假若一个正则表达式多次使用 则我们可以预编译 在后续的调用过程中不在编译 节省时间
1 | import re #导入模块 |