[英]Looking for difference between re.match(pattern, …) and re.search(r'\A' + pattern, …)
(以下所有代码都假设已经评估了import re
的上下文。)
关于re.match
和re.search
之间差异的文档专门比较了运行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
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
值; 1 \\A
将匹配锚定到字符串的开头,而不管匹配是否为多行。 顺便说一下,字符串结尾匹配的\\A
对应是\\Z
令人讨厌的是,Python的\\Z
对应于Perl的\\z
,而不是 Perl的\\Z
当我写这篇文章的早期版本时,这让我感到沮丧。 (顺便说一句,在Python regexes \\z
中没有特殊含义;它只匹配z
。)感谢John Y发现我的错误。
可能有一些我在这里看不到的东西,但我认为区别很明显。
re.match()
仅在您要查找的模式位于字符串的开头时返回成功匹配,并且从文档中的示例外观看起来re.match()
使用\\A
来锚定匹配项到字符串的开头而不是多行模式的行首。
只要有匹配, re.search()
返回一个成功的匹配, 无论模式在目标字符串中的哪个位置,当然只要你没有故意锚定模式。
现在回答你的主要问题,关于re.match(pattern, …)
和re.search(r'\\A' + pattern, …)
之间的区别是什么?
好吧没有任何区别,它只是一个方便的方法,所以你不必每次输入r'\\A' + pattern
我想如果你想锚定你的匹配,我认为发生了很多。
您可以更加确定re.match()
\\A
内部使用\\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 ...>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.