正则表达式
1. 正则表达式是用来匹配字符串的,使用模块re进行匹配;
2. 特殊字符:
- . 任意字符(除了换行都包括)
- * 任意次数,+任意≥1次数,{2}出现2次,{2,}出现≥2次,{2,5}出现2-5次
- ^a 以a开头
- $a 以a结尾
- [A-Za-z0-9_]限定范围,[^]限定不是
- \s 空格,\S不是空格,\w任意字符,\W不是字符(空格)
- \d 数字
- | 或者,取并集
3.分组
使用()进行分组,再运用.group()方法捕获分组;
import re line='11/27/2012' datapat=re.compile(r'(\d+)/(\d+)/(\d+)') m=datapat.match(line) print(m.groups())
( '11', '27', '2012')
print(m.group(0))
'11/27/2012'
print(m.group(1))
'11'
4. re模块的重要函数方法
.compile():预编译;
.match():用于判断是否匹配成功,如果匹配成功,则返回一个match对象;否则返回None;
import re line='Today is 11/27/2012. Pycon starts 3/13/2013.' datapat=re.compile(r'.*(\d+)/(\d+)/(\d+)') m=datapat.match(line) print(m.groups())
('3', '13', '2013') %%贪婪匹配的结果
re.match(r'正则表达式',test);或者datapat.match(test);datapat是预编译好的正则表达式。
.findall():用于查找任意部分的模式出现位置;
使用Python的r前缀可以不用考虑\转义的问题;
5.贪婪匹配
python默认的匹配方式是最长的可能匹配;要获得非贪婪匹配时需要用到特殊字符?
import re
line='Today is 11/27/2012. Pycon starts 3/13/2013.'
datapat=re.compile(r'.*?(\d+)/(\d+)/(\d+)')
m=datapat.match(line)
print(m.groups()) ('11', '27', '2012')
datapat=re.compile(r'.*(\d+)/(\d+)/(\d+)')
m=datapat.match(line)
print(m.groups()) ('3', '13', '2013')
如果你将点(.)号放在开始与结束符(比如引号)之间的时候,那么匹配操作会查找符合模式的最长可能匹配。 这样通常会导致很多中间的被开始与结束符包含的文本被忽略掉,并最终被包含在匹配结果字符串中返回。通过在*或者+这样的不确定性限制符之后加?可以强制将算法改成寻找最短可能匹配,即非贪婪算法。
参考资料:
1. http://python3-cookbook.readthedocs.io/zh_CN/latest/c02/p07_specify_regexp_for_shortest_match.html

浙公网安备 33010602011771号