Python re模块中的search()和match()函数有什么区别?
我已经阅读了文档 ( 当前文档 ),但是我似乎从未记得它。 我一直在查找并重新学习它。 我希望有人会用示例清楚地回答它,以便(也许)它会贴在我的头上。 或者至少我将有一个更好的地方来回答我的问题,并且重新学习它的时间会更少。
#1楼
re.match锚定在字符串的开头。 这与换行符无关,因此与在模式中使用^并不相同。
如重新匹配文档所述 :
如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的
MatchObject实例。 如果字符串与模式不匹配,则返回None否则返回None。 请注意,这与零长度匹配不同。注意:如果要在字符串中的任何位置找到匹配项,请改用
search()。
re.search搜索整个字符串,如文档所述 :
扫描字符串以查找正则表达式模式产生匹配的位置,然后返回相应的
MatchObject实例。 如果字符串中没有位置与模式匹配,则返回None否则返回None请注意,这与在字符串中的某个点找到零长度匹配不同。
因此,如果您需要匹配字符串的开头,或者匹配整个字符串,请使用match 。 它更快。 否则使用search 。
该文档有一个特定的部分,用于match和search ,其中还涵盖了多行字符串:
Python根据正则表达式提供了两种不同的基本操作:
match仅在字符串的开头检查匹配,而search在字符串的任何位置检查匹配(这是Perl的默认设置)。请注意,即使使用以
'^'开头的正则表达式,match也可能与search不同:'^'仅在字符串的开头或在MULTILINE模式下也紧接换行符之后才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
#2楼
re.match尝试匹配字符串开头的模式。 re.search尝试在整个字符串中匹配模式,直到找到匹配项。
#3楼
re.search 搜索 ES在整个字符串的模式,而re.match 不会搜索模式; 如果没有,则除了在字符串开头匹配外 ,别无选择。
#4楼
您可以参考以下示例以了解re.match和re.search的工作方式
a = "123abc"
t = re.match("[a-z]+",a)
t = re.search("[a-z]+",a)
re.match将不返回none ,但re.search将返回abc 。
#5楼
区别在于, re.match()误导习惯于Perl , grep或sed正则表达式匹配的任何人,而re.search()不会。 :-)
更为清醒的是, 正如John D. Cook所说的那样 , re.match()行为“好像每个模式都以^开头。” 换句话说, re.match('pattern')等于re.search('^pattern') 。 因此,它锚定了图案的左侧。 但这也没有固定模式的右侧:仍然需要终止$ 。
坦白地说,我认为不建议使用re.match() 。 我很想知道应该保留它的原因。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3160379