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

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


当前回答

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尝试匹配字符串开头的模式。Re.search尝试在整个字符串中匹配模式,直到找到匹配。

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

更短:

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

以下是前任说的:

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

Re.search在整个字符串中搜索模式,而re.match不搜索模式;如果不匹配,则只能在字符串的开头匹配它。

您可以参考下面的示例来了解re.match和re.search的工作原理

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

Re.match将返回none,但re.search将返回abc。