在python的doc中,我看到一个例子:
m = re.match("([abc])+", "abc")
m.groups() # ('c',)
这是怎么发生的?我认为子组应该是'a'。
答案 0 :(得分: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']
这里,整个序列被捕获为一个组,然后拆分。
答案 1 :(得分: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()
返回所有捕获组匹配的元组。由于只有一个捕获组,因此您将获得一个元素元组。