【发布时间】:2013-09-01 21:05:24
【问题描述】:
(下面的所有代码都假定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 和 kwargs 的此类组合,但要能够满怀信心地做出此断言,需要深入了解Python 正则表达式引擎的内部结构。 IOW,与“肯定答案”(即仅由描述的输入的一个组合组成的答案)相反,对这个问题的“否定答案”相当于一个相当权威的陈述,因此它要令人信服,需要在更深层次上提出案例(而不是“肯定”答案)。
总结一下:我正在寻找两种可能的答案之一:
-
pattern、flags、string和kwargs的组合将在上面给出的最后两种情况下产生不同的m值; - 基于 Python 正则表达式内部知识的权威“否定”答案(即不存在这样的输入组合)。
1\A 将匹配锚定到字符串的开头,无论匹配是否为多行。顺便说一句,用于字符串结尾匹配的\A 的对应项是\Z。很烦人的是,Python 的 \Z 对应于 Perl 的 \z,而 不 对应于 Perl 的 \Z。当我写这篇文章的早期版本时,这让我大吃一惊。 (顺便说一句,在 Python 正则表达式中 \z 没有特殊含义;它只匹配 z。)感谢 John Y 发现我的错误。
【问题讨论】:
-
你的助记词错了。根据您链接到的文档,
\A的对应项是\Z。在这两种情况下都是大写字母。可以肯定的是,我在交互式 Python 会话中对其进行了测试,并且行为与文档相匹配。\z(小写)的行为与z相同(即反斜杠没有区别,这对于 Python 中没有任何特殊正则表达式含义的字符来说是正常的)。 -
感谢您发现我的错误!我现在已经修好了。我记错了 Perl 的特殊正则表达式序列,就好像它们是 Python 的一样。我真正需要的是保持这两个笔直的助记符!