小编典典

re.search 和 re.match 有什么区别?

all

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

我已阅读文档当前文档),但我似乎从未记得它。我一直不得不查找并重新学习它。我希望有人会用例子清楚地回答它,以便(也许)它会留在我的脑海中。或者至少我会有一个更好的地方来回答我的问题,并且重新学习它需要更少的时间。


阅读 92

收藏
2022-03-06

共1个答案

小编典典

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

正如re.match 文档所说:

如果字符串开头的 零个或多个字符
与正则表达式模式匹配,则返回相应的MatchObject实例。None如果字符串与模式不匹配则返回;请注意,这与零长度匹配不同。

注意:如果要在字符串中的任何位置找到匹配项,请search() 改用。

re.search如文档所述,搜索整个字符串:

扫描字符串
以查找正则表达式模式产生匹配的位置,并返回相应的MatchObject实例。None如果字符串中没有位置与模式匹配,则返回;请注意,这与在字符串中的某个点找到零长度匹配不同。

因此,如果您需要匹配字符串的开头,或者匹配整个字符串,请使用match. 它更快。否则使用search.

该文档有一个针对vs.的特定部分,match``search其中也涵盖了多行字符串:

Python 基于正则表达式提供了两种不同的原始操作: 仅在字符串的开头*match检查 匹配,而在字符串中的 任何位置 检查匹配
(这是 Perl 默认所做的)。
search ***

请注意, 即使使用以:开头的正则表达式match也可能有所不同,仅匹配字符串的开头,或者在 模式下也紧跟换行符。 仅当模式在 字符串的 _ 开头*_ 匹配( 无论模式如何)或在可选 参数给出的起始位置(无论是否有换行符在其前面)时,“”
“”操作才会成功。search``'^'``'^'``MULTILINE``match _
*_pos

现在,足够的谈话。是时候看一些示例代码了:

# 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
2022-03-06