寻找re.match(pattern,...)和re.search(r' \ A' + pattern,...)之间的区别

时间:2013-08-29 12:17:44

标签: python regex

(以下所有代码都假定已经评估过import re的上下文。)

re.matchre.search之间差异的documentation专门比较正在运行的re.match(pattern, ...)和正在运行的re.search('^' + pattern, ...)。这在我看来有点像草,因为真正的考验是将re.match(pattern, ...)re.search(r'\A' + pattern, ...) 1 进行比较。

更具体地说,我不能轻易想出patternstring的组合

的结果
m = re.match(pattern, string)

的结果不同
m = re.search(r'\A' + pattern, string)

(请注意,如果pattern中的原始模式恰好是unicode类型,那么r'\A' + pattern中的修改模式也是如此,方便的就足够了。)

让我强调,在这里,我对性能,便利性等方面的可能差异感兴趣。目前我只对最终结果的差异感兴趣(即最终结果的差异)值m)。

为了更一般地说明问题,我正在寻找patternflagsstringkwargs的组合,以便{的最终值

中的{1}}
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) patternflagsstring的这种组合,但能够充满信心地做出这种说法需要深入了解Python正则表达式引擎的内部结构。 IOW,与“肯定答案”(即仅由一个输入组合组成的一个)相比,对这个问题的“否定答案”相当于一个相当权威的陈述,所以对于它来说要有说服力,要求在更深层次上提出案件(而不是“积极”答案)。

总结一下:我正在寻找两种可能的答案之一:

  1. kwargspatternflagsstring的组合,在上面给出的最后两种情况下会产生kwargs的不同值; < / LI>
  2. 基于对Python正则表达式内部的了解,提供权威的“否定”答案(即不存在这样的输入组合)。

  3. 1 m将匹配锚定到字符串的开头,而不管匹配是否为多行。顺便说一下,\A对应的字符串结尾匹配是\A。令人讨厌的是,Python的\Z对应于Perl的\Z,而不是对应于Perl的\z。当我写这篇文章的早期版本时,这让我感到沮丧。 (顺便说一句,在Python正则表达式\Z中没有特殊含义;它只匹配\z。)感谢John Y发现我的错误。

1 个答案:

答案 0 :(得分:0)

我可能会在这里看到一些东西,但我认为区别很明显。

  1. re.match()仅在您要查找的模式位于字符串的开头时才返回成功匹配,并且从文档中的示例外观看来re.match()使用\A将匹配锚定到字符串的开头,以多行模式开头。

  2. re.search()返回成功匹配无论,只要有匹配项,模式就在目标字符串中,当然只要您不锚定故意模式。

  3. 现在回答您的主要问题,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 ...>