Python 查找重新匹配(模式,…)和重新搜索(r';\A';+;模式,…)之间的差异
(以下所有代码均假定已对Python 查找重新匹配(模式,…)和重新搜索(r';\A';+;模式,…)之间的差异,python,regex,Python,Regex,(以下所有代码均假定已对import re进行了评估。) 关于re.match和re.search之间的差异,特别是将运行re.match(pattern,…)与运行re.search(“^”+pattern,…)进行比较。在我看来,这有点像救命稻草,因为真正的测试将是比较re.match(pattern,…)与re.search(r'\a'+pattern,…)1 更具体地说,我不能轻易地提出一个组合的模式和字符串,其结果是 m = re.match(pattern, string) m =
import re
进行了评估。)
关于re.match
和re.search
之间的差异,特别是将运行re.match(pattern,…)
与运行re.search(“^”+pattern,…)
进行比较。在我看来,这有点像救命稻草,因为真正的测试将是比较re.match(pattern,…)
与re.search(r'\a'+pattern,…)
1
更具体地说,我不能轻易地提出一个组合的模式
和字符串
,其结果是
m = re.match(pattern, string)
m = re.search(r'\A' + pattern, string)
将不同于
m = re.match(pattern, string)
m = re.search(r'\A' + pattern, string)
(请注意,如果pattern
中的原始模式恰好是unicode
类型,那么r'\A'+pattern
中的修订模式也是如此。)
我要强调的是,我对性能、便利性等方面可能存在的差异不感兴趣。目前我只对最终结果的差异感兴趣(即m
最终值的差异)
为了更概括地表达这个问题,我正在寻找模式
、标志
、字符串
、和kwargs
的组合,以便在
r0 = re.compile(pattern, flags=flags)
m = r0.match(string, **kwargs)
r1 = re.compile(r'\A' + pattern, flags=flags)
m = r1.search(string, **kwargs)
与中的m
的最终值不同
r0 = re.compile(pattern, flags=flags)
m = r0.match(string, **kwargs)
r1 = re.compile(r'\A' + pattern, flags=flags)
m = r1.search(string, **kwargs)
可能不存在输入模式
、标志
、字符串
、和kwargs
的这种组合,但要能够自信地做出这种断言,需要深入了解Python正则表达式引擎的内部结构。因此,与“肯定回答”(即仅由所述的一组输入组成的回答)相比,对这个问题的“否定回答”相当于一个权威性的陈述,因此,要使其具有说服力,需要在更深层次上(而不是“肯定”回答)陈述案情
总而言之:我正在寻找两种可能的答案之一:
模式
、标志
、字符串
和kwargs
的组合,在上述最后两种情况下,将产生不同的m
值李>
1
\A
将匹配锚定到字符串的开头,无论匹配是否为多行。顺便说一句,字符串结尾匹配的\A
的对应项是\Z
。令人烦恼的是,Python的\Z
对应于Perl的\Z
,而不是Perl的\Z
。当我写这篇文章的早期版本时,这让我大吃一惊。(顺便说一句,在Python正则表达式中,\z
没有特殊意义;它只是匹配了z
)感谢您发现了我的错误。这里可能有我没有看到的东西,但我认为区别很明显
re.match()
仅当您要查找的模式位于字符串的开头,并且从文档中的示例看,似乎re.match()时,才会返回成功的匹配
在多行模式下使用\A
将匹配锚定到字符串的开头,而不锚定到行的开头re.search()
re.match(pattern,…)
和re.search(r'\A'+pattern,…)
之间的区别是什么
好吧,没有什么区别,这只是一个方便的方法,这样你就不必每次都键入r'\a'+模式
,我想如果你想锚定你的比赛,我想这会经常发生
通过查看您发布的比较链接中的最后一个示例,您可以更确定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 ...>
重新匹配('X','A\nB\nX',重新多行)#不匹配
>>>重新搜索(“^X”、“A\nB\nX”、重新多行)#匹配
我想你误解了我的问题;我在我的帖子中添加了一些措辞(主要是在结尾),希望能减少这种误解。@kjo我想我理解你问的两个问题中的第1个,我不是权威人士,但我相信你不会发现这两个问题的结合。问题是:我也可以这么说“我确信”我不会找到这样的组合“,我真正的意思是,我只是想不出一个,甚至想不出怎么会有一个。因此,对我来说,发布这样一个问题的唯一目的是,要么(从比我更专业/更了解幕后情况的人那里)确认这个“确定性”,要么反驳这个“确定性”(以一个例子的形式表明我的“确定性”实际上是没有根据的——毕竟正则表达式是一个众所周知的违反直觉的概念。)@kjo我明白你的意思。我想如果他们调用了方法
startsWith
,会更方便。尽管如此,我还是觉得可以,因为我知道无论何时调用这两种方法,我都会从中得到什么,而不知道它们内部是如何工作的,这对我来说很好。你的助记符是错误的。根据您链接到的文档,与\A
相对应的是\Z
。在这两种情况下都使用大写字母。当然,我在一个交互式Python会话中对其进行了测试,其行为与文档相符\z
(小写)的行为与z
相同(即反斜杠没有区别,这是正常的)