正则表达式中的匹配'//'或EOL'$'在分组时给出不一致的结果(在Python中)? [重复]

问题描述 投票:-1回答:2
[有人知道为什么试图匹配'//'或'$'时这两个正则表达式会给出不同的结果吗? (Python 3.6.4)

    (a)(//|$):匹配'a'和'a //'
  • (a)(//)|($):匹配'a //',但
  • not'a'
>>> at = re.compile('(a)(//|$)') >>> m = at.match('a') >>> m <_sre.SRE_Match object; span=(0, 1), match='a'> >>> m = at.match('a//') >>> m <_sre.SRE_Match object; span=(0, 3), match='a//'> >>>
vs

>>> at = re.compile('(a)(//)|($)') >>> m = at.match('a//') >>> m <_sre.SRE_Match object; span=(0, 3), match='a//'> >>> m = at.match('a') >>> m >>> type(m) <class 'NoneType'> >>>

python regex
2个回答
2
投票
regex引擎将在评估之前在管道的每一侧对表达式进行分组。在第一种情况下

  • (a)(//|$)

    implies将匹配must在[[a//(即EOL)

    之前的$的字符串。因此,在这种情况下,第一个替代方案是//,第二个替代方案是$,两者都必须遵循a在此表达式中,捕获组为

    a

    • //$
  • (a)(//)|($)
  • implies将匹配

    必须为 a//$

    的字符串因此,在这种情况下,第一种选择是a//,第二种选择是$在此表达式中,捕获组为

    任一

    a

    • //
  • OR
  • $

    实际上,在第二个示例中分组无关紧要,a//|$将给出相同的结果,因为正则表达式引擎会将其评估为(a//)|$(请注意,在我的示例中,括号只是象征性的,它们不是代表捕获组语法)。
  • regex tester中试用。它将告诉您每个表达式的替代方案

1
投票
请参见此处以了解有关优先级的更多详细信息-https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04_08
© www.soinside.com 2019 - 2024. All rights reserved.