Python:" re.match(pattern)" v / s" re.search(' ^' +模式)"

时间:2018-01-20 11:16:17

标签: python regex

在阅读文档时,我发现re.match()re.search()之间的全部区别在于re.match()仅从字符串的开头开始检查。

>>> import re
>>> a = 'abcde'
>>> re.match(r'b', a)
>>> re.search(r'b', a)
<_sre.SRE_Match object at 0xffe25c98>
>>> re.search(r'^b', a)
>>>

我有什么误解,或者re.search('^' + pattern)re.match(pattern)之间没有任何区别吗?

仅使用re.search()是一种好习惯吗?

2 个答案:

答案 0 :(得分:4)

您应该查看Python's re.search() vs. re.match()文件,其中明确提到了另一个区别:

  

但请注意,MULTILINE模式match()仅匹配字符串的开头,而使用search()正则表达式以&#39; ^&#开头39;将在每行的开头匹配

     
    

>>> re.match('X', 'A\nB\nX', re.MULTILINE) # No match

         

>>> re.search('^X', 'A\nB\nX', re.MULTILINE) # Match

         

<_sre.SRE_Match object; span=(4, 5), match='X'>

  

第一个区别(对于未来的读者)是:

  

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

     
    

例如:

         

>>> re.match("c", "abcdef") # No match

         

>>> re.search("c", "abcdef") # Match

         

<_sre.SRE_Match object; span=(2, 3), match='c'>

  
     

以&#39; ^&#39;开头的正则表达式可以与search()一起使用来限制字符串开头的匹配

     
    

>>> re.match("c", "abcdef") # No match

         

>>> re.search("^c", "abcdef") # No match

         

>>> re.search("^a", "abcdef") # Match

         

<_sre.SRE_Match object; span=(0, 1), match='a'>

  

答案 1 :(得分:2)

如果你从代码高尔夫的角度来看这个,我会说有一些用来保持两个功能分开。

如果您从字符串的开头查找re.match,则优于re.search,因为前者的名称中只有一个字符,因此节省了一个字节。此外,使用re.search,您还必须添加行首锚^以表示从头开始的匹配。您不需要使用re.match指定此内容,因为它是隐含的,进一步保存了另一个字节。