为什么第一次交替不匹配?

2024-05-01 21:53:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个following regular expression(Python),我在下面这一点上不明白。为什么它和第一次的不匹配呢?你知道吗

正则表达式(用空格隔开以便更好地理解):

(?:
  \$\{
    (?P<braced>
       [_a-zA-Z][a-zA-Z0-9]*(?::[_a-zA-Z][_a-zA-Z0-9]*)+
    )
  \}
)
|   ### SECOND ALTERNATION ###
(?:
  \$
   (?P<named>
     [_a-zA-Z][a-zA-Z0-9]*(?::[_a-zA-Z][_a-zA-Z0-9]*)+
   )
)

测试字符串:

阿斯达斯德$自闭症:sd+${asd123:asd}$主页$$asd

匹配的内容:

asdasd$房间隔缺损:sd+${asd123:asd}$主页$$asd

根据上面的正则表达式模式,第一个替换也应该出现,即:

${asd123:asd}

我好像不太明白交替的模式?你知道吗


Tags: 模式主页sdnamedfollowing空格secondexpression
3条回答

您的模式运行得很好,您只需将其与finditer一起使用即可执行全局研究并获得整个匹配:

>>> for m in re.finditer(pattern, text):
...     print 'whole match: %s' (m.group(0))
...     print 'group "braced": %s' % (m.group('braced'))
...     print 'group "named": %s\n' % (m.group('named'))

findall(也执行全局研究)的问题是,当模式中有捕获组时,结果只包含捕获组内容的列表,而不包含整个匹配结果。因此,根据stribizhev的建议,将所有内容都包含在一个捕获组中可以是一种使用findall的方法。你知道吗

您需要添加g修饰符来获取regex101.com上的所有匹配项

https://www.regex101.com/r/nP8pK0/1

为了捕获${...},您需要移除?:,将非捕获组变成捕获组。你也可以叫他们名字。而且[\u a-zA-Z0-9]等于\w,因此我们可以稍微缩短您的正则表达式:

(?P<Alternation1>
 \$\{(?P<braced>[_a-zA-Z][a-zA-Z0-9]*(?::[_a-zA-Z]\w*)+)
 \}
 )
 |
 (?P<Alternation2>
  \$(?P<named>[_a-zA-Z][a-zA-Z0-9]*(?::[_a-zA-Z]\w*)+
 )
)

看看demo。这个regex需要使用x选项(以及regex101.com上的g选项来显示所有匹配项,在Python中,您可以使用findallfinditer)。你知道吗

有关non-capturing groups的更多信息,请访问SO和regular-expressions.info。你知道吗

要在Python中获取所有匹配项,可以使用finditer如下所示:

import re
p = re.compile(ur'''(?P<Alternation1>
     \$\{(?P<braced>[_a-zA-Z][a-zA-Z0-9]*(?::[_a-zA-Z]\w*)+)
     \}
     )
     |
     (?P<Alternation2>
      \$(?P<named>[_a-zA-Z][a-zA-Z0-9]*(?::[_a-zA-Z]\w*)+
     )
    )
''', re.VERBOSE)
test_str = u"asdasd $asd:sd + ${asd123:asd} $HOME $$asd"

print [x for x in re.findall(p, test_str)]

IDEONE demo

相关问题 更多 >