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
  • 一个权威的“否定”答案(即不存在这样的输入组合),基于Python正则表达式的内部知识


  • 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
    相同(即反斜杠没有区别,这是正常的)