在python的文档,我看到一个例子:如何使用正则表达式如R蟒蛇交易 '([ABC])+'
m = re.match("([abc])+", "abc")
m.groups() # ('c',)
如何发生的?我认为这个小组应该是'a'。
在python的文档,我看到一个例子:如何使用正则表达式如R蟒蛇交易 '([ABC])+'
m = re.match("([abc])+", "abc")
m.groups() # ('c',)
如何发生的?我认为这个小组应该是'a'。
>>> 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()
返回所有捕获组匹配的元组。由于只有一个捕获组,你可以得到一个元素的元组。
我相信这种行为是未指定的。在重复运算符中使用捕获组时,通常会捕获最后一次匹配。但是,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']
这里,整个序列捕获为一个组,然后分裂。
我在Python 2.7.3和3.2.3中都得到'['c']'。啊,你正在使用IronPython? IPython是否可以在内部使用.NET正则表达式引擎?这将是a)意想不到的和b)令人敬畏的,因为.NET是允许访问重复组的单个捕获的少数引擎之一。 – 2013-02-19 06:45:21
@TimPietzcker:要说清楚,你是否用我的代码或OP获得了'['c']'?我的代码在CPython 2.7.3上生成'['a','b','c']'(没有用Python 3测试过,但我希望它能做到这一点)。 – NPE 2013-02-19 06:48:45
@NPE:你显示的正则表达式很奇怪。你正在捕获'[abc] +'(一个序列而不是像问题中的单个字符),但是你仍然得到每个单独的字符?编辑:没关系,'list()'将按字符分割字符串。 – nhahtdh 2013-02-19 06:53:30
重复捕获组时,它将返回最后一个实例。 – nhahtdh 2013-02-19 06:29:42