在阅读文档时,我发现re.match()
和re.search()
之间的全部区别在于re.match()
仅从字符串的开头开始检查。
>>> import re
>>> a = 'abcde'
>>> re.match(r'b', a)
>>> re.search(r'b', a)
<_sre.SRE_Match object at 0xffe25c98>
>>> re.search(r'^b', a)
>>>
我有什么误解,或者re.search('^' + pattern)
和re.match(pattern)
之间没有任何区别吗?
仅使用re.search()
是一种好习惯吗?
答案 0 :(得分:4)
您应该查看Python's re.search()
vs. re.match()
文件,其中明确提到了另一个区别:
但请注意,
MULTILINE
模式match()
仅匹配字符串的开头,而使用search()
的正则表达式以&#39; ^&#开头39;将在每行的开头匹配。
>>> re.match('X', 'A\nB\nX', re.MULTILINE) # No match
>>> re.search('^X', 'A\nB\nX', re.MULTILINE) # Match
<_sre.SRE_Match object; span=(4, 5), match='X'>
第一个区别(对于未来的读者)是:
Python提供了两种基于正则表达式的不同原语操作:
re.match()
仅在字符串的开头检查匹配,而re.search()
检查字符串中任何位置的匹配(这就是Perl默认情况下)。例如:
>>> re.match("c", "abcdef") # No match
>>> re.search("c", "abcdef") # Match
<_sre.SRE_Match object; span=(2, 3), match='c'>
以&#39; ^&#39;开头的正则表达式可以与
search()
一起使用来限制字符串开头的匹配:
>>> re.match("c", "abcdef") # No match
>>> re.search("^c", "abcdef") # No match
>>> re.search("^a", "abcdef") # Match
<_sre.SRE_Match object; span=(0, 1), match='a'>
答案 1 :(得分:2)
如果你从代码高尔夫的角度来看这个,我会说有一些用来保持两个功能分开。
如果您从字符串的开头查找re.match
,则优于re.search
,因为前者的名称中只有一个字符,因此节省了一个字节。此外,使用re.search
,您还必须添加行首锚^
以表示从头开始的匹配。您不需要使用re.match
指定此内容,因为它是隐含的,进一步保存了另一个字节。