为什么正则表达式的“非捕获”组不能工作?

2024-04-26 17:47:24 发布

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

在下面的代码段中,匹配结果中应忽略非捕获组"(?:aaa)"

结果应仅为"_bbb"

然而,我在匹配结果中得到"aaa_bbb";只有当我指定组(2)时,它才会显示"_bbb"

>>> import re
>>> s = "aaa_bbb"
>>> print(re.match(r"(?:aaa)(_bbb)", s).group())

aaa_bbb

Tags: importre代码段matchgroupprintbbbaaa
3条回答

group()group(0)将返回整个匹配项。后续组是实际的捕获组

>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(0))
aaa_bbb
>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(1))
_bbb
>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(2))
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
IndexError: no such group

如果您想要与group()相同的行为:

" ".join(re.match(r"(?:aaa)(_bbb)", string1).groups())

TFM

class re.MatchObject

group([group1, ...])

返回匹配项的一个或多个子组。如果只有一个参数,则结果是一个字符串;如果有多个参数,则结果是一个元组,每个参数有一个项如果没有参数,group1默认为零(返回整个匹配项)。如果groupN参数为零,则相应的返回值为整个匹配字符串。

我认为你误解了“非捕获群体”的概念。由非捕获组匹配的文本仍然成为整个正则表达式匹配的一部分

regex(?:aaa)(_bbb)和regex(aaa)(_bbb)都返回aaa_bbb作为整体匹配。不同之处在于,第一个正则表达式有一个捕获组返回_bbb作为其匹配项,而第二个正则表达式有两个捕获组返回aaa_bbb作为其各自的匹配项。在Python代码中,要获得_bbb,需要对第一个正则表达式使用group(1),对第二个正则表达式使用group(2)

非捕获组的主要好处是,您可以将它们添加到正则表达式中,而不会打乱正则表达式中捕获组的编号。它们还提供(稍微)更好的性能,因为正则表达式引擎不必跟踪非捕获组匹配的文本

如果确实要从整个正则表达式匹配中排除aaa,则需要使用lookaround。在这种情况下,正向查找会起作用:(?<=aaa)_bbb。使用这个正则表达式,group()在Python中返回_bbb。不需要捕获组

我的建议是,如果您能够使用捕获组来获取正则表达式匹配的一部分,请使用该方法,而不是四处查看

相关问题 更多 >