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

荒凉一梦 提交于 2020-02-25 18:32:11

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

我已经阅读了文档当前文档 ),但是我似乎从未记得它。 我一直在查找并重新学习它。 我希望有人会用示例清楚地回答它,以便(也许)它会贴在我的头上。 或者至少我将有一个更好的地方来回答我的问题,并且重新学习它的时间会更少。


#1楼

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

重新匹配文档所述

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

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

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

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

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

该文档有一个特定的部分,用于matchsearch ,其中还涵盖了多行字符串:

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()误导习惯于Perlgrepsed正则表达式匹配的任何人,而re.search()不会。 :-)

更为清醒的是, 正如John D. Cook所说的那样re.match()行为“好像每个模式都以^开头。” 换句话说, re.match('pattern')等于re.search('^pattern') 。 因此,它锚定了图案的左侧。 但这也没有固定模式的右侧:仍然需要终止$

坦白地说,我认为不建议使用re.match() 。 我很想知道应该保留它的原因。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!