(以下所有代码都假定已经评估过import re
的上下文。)
re.match
与re.search
之间差异的documentation专门比较正在运行的re.match(pattern, ...)
和正在运行的re.search('^' + pattern, ...)
。这在我看来有点像草,因为真正的考验是将re.match(pattern, ...)
与re.search(r'\A' + pattern, ...)
1 进行比较。
更具体地说,我不能轻易想出pattern
和string
的组合
m = re.match(pattern, string)
与
的结果不同m = re.search(r'\A' + pattern, string)
(请注意,如果pattern
中的原始模式恰好是unicode
类型,那么r'\A' + pattern
中的修改模式也是如此,方便的就足够了。)
让我强调,在这里,我不对性能,便利性等方面的可能差异感兴趣。目前我只对最终结果的差异感兴趣(即最终结果的差异)值m
)。
为了更一般地说明问题,我正在寻找pattern
,flags
,string
和kwargs
的组合,以便{的最终值
m
与
中r0 = re.compile(pattern, flags=flags)
m = r0.match(string, **kwargs)
的最终值不同
m
可能没有输入r1 = re.compile(r'\A' + pattern, flags=flags)
m = r1.search(string, **kwargs)
,pattern
,flags
和string
的这种组合,但能够充满信心地做出这种说法需要深入了解Python正则表达式引擎的内部结构。 IOW,与“肯定答案”(即仅由一个输入组合组成的一个)相比,对这个问题的“否定答案”相当于一个相当权威的陈述,所以对于它来说要有说服力,要求在更深层次上提出案件(而不是“积极”答案)。
总结一下:我正在寻找两种可能的答案之一:
kwargs
,pattern
,flags
和string
的组合,在上面给出的最后两种情况下会产生kwargs
的不同值; < / LI>
1 m
将匹配锚定到字符串的开头,而不管匹配是否为多行。顺便说一下,\A
对应的字符串结尾匹配是\A
。令人讨厌的是,Python的\Z
对应于Perl的\Z
,而不是对应于Perl的\z
。当我写这篇文章的早期版本时,这让我感到沮丧。 (顺便说一句,在Python正则表达式\Z
中没有特殊含义;它只匹配\z
。)感谢John Y发现我的错误。
答案 0 :(得分:0)
我可能会在这里看到一些东西,但我认为区别很明显。
re.match()
仅在您要查找的模式位于字符串的开头时才返回成功匹配,并且从文档中的示例外观看来re.match()
使用\A
将匹配锚定到字符串的开头,不以多行模式开头。
re.search()
返回成功匹配无论,只要有匹配项,模式就在目标字符串中,当然只要您不锚定故意模式。
现在回答您的主要问题,re.match(pattern, …)
和re.search(r'\A' + pattern, …)
之间的区别是什么?
嗯,没有任何区别,它只是一种方便的方法,所以你不必每次都输入r'\A' + pattern
,如果你想锚定你的匹配,我想这很多。
通过查看您发布的比较链接中的最后一个示例,您可以更加确信re.match()
内部使用\A
:
>>> re.match('X', 'A\nB\nX', re.MULTILINE) # No match
>>> re.search('^X', 'A\nB\nX', re.MULTILINE) # Match
<_sre.SRE_Match object at ...>