(下面的所有代码都假设一个import re
已经被评估过的上下文。)
有关 running 与 running之间差异的文档re.match
,并re.search
专门比较re.match(pattern, ...)
了 running 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)
(请注意,如果 in 中的原始模式pattern
恰好是 type unicode
,那么 in 中的修改后的模式也是r'\A' + pattern
,非常方便。)
让我强调一下,在这里我对性能、便利性等方面可能存在的差异不感兴趣。目前我只对最终结果的差异(即 的最终值的差异)感兴趣m
。
为了更笼统地表达这个问题,我正在寻找 , ,等的组合pattern
,使得in的最终值flags
string
kwargs
m
r0 = re.compile(pattern, flags=flags)
m = r0.match(string, **kwargs)
不同于m
in的最终值
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发现我的错误。