正则杂记

关于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