问:在Python正则模式中search()和match()的区别是什么?
我已经阅读了现有的相关文档,但是我总是记不住,碰到类似的问题,我还要不断地查找再学习,我希望某个大神能够给个清晰的案例,让我能够很好的记住,或者至少能够在Stackoverflow上有个地方能够让我再学习的时候方便地找到。
答:
re.match位于字符串的开头。它与新行无关,因此它在模式上与^的用法不同。
正如re.match文档所说:
如果在字符串的开头有0个或更多个字符符合正则表达式模式,返回相关匹配的实例对象,如果字符串不符合正则表达式模式则返回None.(注这个跟0长度的匹配是有区别的)
注:如果你想要在字符串中定位任意一个匹配位置的话,请转用search()。
re.search搜索整个字符串,正如re.search文档所说:
扫描整个字符串,如果产生了一个匹配正则模式就寻找到这个位置,返回相关匹配的对象。如果没有位置能够匹配这个模式则返回None.(注意这个跟在字符的某处有0长度的匹配是有区别的。)
所以,如果你想要从字符串的一开始就进行匹配或匹配整个字符串的话就使用match。它更加快速,否则请使用search。
该文档有个专门的章节讲述match和search同样覆盖了多行字符串:
Python根据正则表达式提供两种不同的基本操作:match只在字符串的开始确认一个匹配,而search在字符串的任何匹配的位置都确认。(Perl默认就是这么设置的)
注意即使在使用以^开始的正则表达式时match也可能不同于search:
^只在字符串的开头匹配,或在多行模式立刻紧跟一个新行。
不管出于什么模式,match操作只有在一开始字符串匹配的情况下能够成功,或者在可选参数pos给定的开始位置。(不管在这之前有没有新行)
概念说的足够多了,下面给大家上些例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 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 |
译者注:
1.re.match() 从第一个字符开始找, 如果第一个字符就不匹配就返回None, 不继续匹配. 用于判断字符串开头或整个字符串是否匹配,速度快.
2.re.search() 会整个字符串查找,直到找到一个匹配。
3.re.MULTILINE 匹配多行模式。