4

(下面的所有代码都假设一个import re已经被评估过的上下文。)

有关 running 与 running之间差异的文档re.match,并re.search专门比较re.match(pattern, ...)了 running 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)

(请注意,如果 in 中的原始模式pattern恰好是 type unicode,那么 in 中的修改后的模式也是r'\A' + pattern,非常方便。)

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

为了更笼统地表达这个问题,我正在寻找 , ,等的组合pattern,使得in的最终值flagsstringkwargsm

r0 = re.compile(pattern, flags=flags)
m = r0.match(string, **kwargs)

不同于min的最终值

r1 = re.compile(r'\A' + pattern, flags=flags)
m = r1.search(string, **kwargs)

可能不存在输入patternflagsstring和的这种组合kwargs,但要能够自信地做出此断言,需要深入了解 Python 正则表达式引擎的内部结构。IOW,与“肯定答案”(即仅由所描述的一种输入组合组成的答案)相反,对这个问题的“否定答案”相当于一个相当权威的陈述,因此要令人信服,需要案例是在更深层次上做出(比“积极”的答案)。

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

  1. pattern, flags,string和的组合将在上面给出的最后两种情况下kwargs产生不同的值;m
  2. 基于 Python 正则表达式内部知识的权威“否定”答案(即不存在这样的输入组合)。

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

4

1 回答 1

0

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

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

  2. 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 ...>
于 2013-08-29T12:28:51.523 回答