Python re模块中的search()和match()函数有什么区别?

我读过Python 2文档(Python 3文档),但我似乎从来都不记得它。我得不停地查资料,重新学习。我希望有人能用例子清楚地回答这个问题,这样(也许)我就能记住它了。或者至少我可以有一个更好的地方带着我的问题回来,重新学习的时间也会更少。


当前回答

区别在于,re.match()会误导任何习惯Perl、grep或sed正则表达式匹配的人,而re.search()则不会。: -)

更严肃地说,就像John D. Cook所说的,re.match()“表现得好像每个模式都有^的前缀。”换句话说,re.match('pattern')等于re.search('^pattern')。所以它锚定了图案的左侧。但它也没有锚定模式的右侧:这仍然需要一个终止$。

坦率地说,鉴于上述情况,我认为re.match()应该被弃用。我很想知道保留它的原因。

其他回答

更短:

搜索扫描整个字符串。 Match只扫描字符串的开头。

以下是前任说的:

>>> a = "123abc"
>>> re.match("[a-z]+",a)
None
>>> re.search("[a-z]+",a)
abc

搜索:在字符串的任何地方查找,并返回一个匹配对象。

Match:查找字符串开头的内容并返回一个匹配对象。

Re.match锚定在字符串的开头。这与换行符无关,因此它与在模式中使用^是不同的。

正如re.match文档所说:

属性中的零或多个字符 字符串开头匹配正则表达式模式,返回 对应的MatchObject实例。 如果字符串没有,则返回None 匹配模式;注意这是 不同于零长度匹配。 注意:如果您想找到一个匹配 在字符串中的任何位置,使用search() 代替。

Re.search搜索整个字符串,如文档所示:

扫描字符串寻找a 正则表达式所在的位置 模式生成匹配,并返回 对应的MatchObject实例。 类中没有位置则返回None 字符串匹配模式;请注意, 这和求 中的某个点上的零长度匹配 字符串。

所以如果你需要匹配字符串的开头,或者匹配整个字符串使用match。它更快。否则使用搜索。

文档中有一个特定的部分用于匹配与搜索,也包括多行字符串:

Python offers two different primitive operations based on regular expressions: match checks for a match only at the beginning of the string, while search checks for a match anywhere in the string (this is what Perl does by default). Note that match may differ from search even when using a regular expression beginning with '^': '^' matches only at the start of the string, or in MULTILINE mode also immediately following a newline. The “match” operation succeeds only if the pattern matches at the start of the string regardless of mode, or at the starting position given by the optional pos argument regardless of whether a newline precedes it.

好了,说够了。下面来看一些示例代码:

# example code:
string_with_newlines = """something
someotherthing"""

import re

print re.match('some', string_with_newlines) # matches
print re.match('someother', 
               string_with_newlines) # won't match
print re.match('^someother', string_with_newlines, 
               re.MULTILINE) # also won't match
print re.search('someother', 
                string_with_newlines) # finds something
print re.search('^someother', string_with_newlines, 
                re.MULTILINE) # also finds something

m = re.compile('thing$', re.MULTILINE)

print m.match(string_with_newlines) # no match
print m.match(string_with_newlines, pos=4) # matches
print m.search(string_with_newlines, 
               re.MULTILINE) # also matches

区别在于,re.match()会误导任何习惯Perl、grep或sed正则表达式匹配的人,而re.search()则不会。: -)

更严肃地说,就像John D. Cook所说的,re.match()“表现得好像每个模式都有^的前缀。”换句话说,re.match('pattern')等于re.search('^pattern')。所以它锚定了图案的左侧。但它也没有锚定模式的右侧:这仍然需要一个终止$。

坦率地说,鉴于上述情况,我认为re.match()应该被弃用。我很想知道保留它的原因。

Re.match尝试匹配字符串开头的模式。Re.search尝试在整个字符串中匹配模式,直到找到匹配。