在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