2013-02-19 66 views

回答

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()返回所有捕獲組匹配的元組。由於只有一個捕獲組,你可以得到一個元素的元組。

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'] 

這裏,整個序列捕獲爲一個組,然後分裂。

+0

我在Python 2.7.3和3.2.3中都得到'['c']'。啊,你正在使用IronPython? IPython是否可以在內部使用.NET正則表達式引擎?這將是a)意想不到的和b)令人敬畏的,因爲.NET是允許訪問重複組的單個捕獲的少數引擎之一。 – 2013-02-19 06:45:21

+0

@TimPietzcker:要說清楚,你是否用我的代碼或OP獲得了'['c']'?我的代碼在CPython 2.7.3上生成'['a','b','c']'(沒有用Python 3測試過,但我希望它能做到這一點)。 – NPE 2013-02-19 06:48:45

+0

@NPE:你顯示的正則表達式很奇怪。你正在捕獲'[abc] +'(一個序列而不是像問題中的單個字符),但是你仍然得到每個單獨的字符?編輯:沒關係,'list()'將按字符分割字符串。 – nhahtdh 2013-02-19 06:53:30