正则杂记
关于re模块中search()、match()、findall()的区别
首先看search()跟match()的区别
import re a = ‘python Python CDpython CDPython‘ re1 = re.search(r‘(p|P)ython‘,a) print(re1.groups()) print(re1) re2 = re.match(r‘(P|p)ython‘,a) print(re2.groups()) print(re2)#out(‘p‘,)<re.Match object; span=(0, 6), match=‘python‘>(‘p‘,)<re.Match object; span=(0, 6), match=‘python‘>
发现search跟match这样匹配都是可以的。
再来看一下
import re a = ‘apython Python CDpython CDPython‘ #多了一个a re1 = re.search(r‘(p|P)ython‘,a) print(re1.groups()) print(re1) re2 = re.match(r‘(P|p)ython‘,a) # print(re2.groups()) 这里会报错,原因是没有匹配到子表达式 print(re2) #out (‘p‘,) <re.Match object; span=(1, 7), match=‘python‘> None
通过上面返回内容不一样,可以看出,match函数匹配时会按照从左到右顺序匹配元字符,如果首字符不是子表达式里面的,就什么也匹配不到。会返回None,结束匹配。
至于groups()去提取匹配结果就更不用说了。
所以,search就会实用一点,match看实际需求吧
再来看findall
re3 = re.findall(r‘(p|P)ython‘,a) print(re3) #out [‘p‘, ‘P‘, ‘p‘, ‘P‘]
可以看出findall就有意思多了,它把每个边界的字符都匹配到了,返回一个字典,很直观。
参考:https://www.cnblogs.com/Angliu/archive/2018/06/30/9247611.html