1

在 python 的文档中,我看到了一个例子:

m = re.match("([abc])+", "abc")
m.groups() # ('c',)

这是怎么发生的?我认为子组应该是'a'。

4

2 回答 2

3

我相信这种行为是未指定的。当您在重复运算符中使用捕获组时,它通常会捕获最后一个匹配项。然而,Python Issue 7132中的讨论表明情况并非总是如此:

是的,但这对于组索引的完全一致性是必要的。当前返回值显然不一致(通常它返回捕获组的最后一次出现,但我发现情况并非总是如此,因为回溯后返回的匹配......)

但是,很容易修改您的示例以返回每个字符:

In [7]: m = re.match("([abc]+)", "abc") # a slightly different regex

In [8]: list(m.groups()[0])
Out[8]: ['a', 'b', 'c']

在这里,整个序列被捕获为一个组,然后拆分。

于 2013-02-19T06:38:13.830 回答
2
>>> m = re.match("([abc])+", "abc")
>>> m.group(0)
'abc'
>>> m.group(1)
'c'
>>> m.groups()
('c',)

正则表达式([abc])+匹配整个字符串(请参阅参考资料m.group(0))。

该匹配是通过捕获单个字符[abc],将结果捕获到第 1 组中,然后重复该过程来获得的。所以该组将首先是a,然后(在下一次重复中)b,最后是c

.groups()返回所有捕获组匹配的元组。由于只有一个捕获组,因此您将获得一个单元素元组。

于 2013-02-19T06:32:07.247 回答