2016-11-14 47 views

回答

4

不需要更改您的圖案。只需要使用正確的功能來完成這項工作。 re.findall將返回組的列表,如果模式中有捕獲組。要獲得整個匹配項,請改爲使用re.finditer,以便您可以從每個實際匹配對象中獲得extract the full match

pattern = re.compile(r"(.+?)\1+") 
[match.group(0) for match in pattern.finditer('44442(2)2(2)44')] 
+0

Ooo,甚至更好。每天學點東西:D – Amadan

0

你可以這樣做:

[i[0] for i in re.findall(r'((\d)(?:[()]*\2*[()]*)*)', s)] 

在這裏,正則表達式是:

((\d)(?:[()]*\2*[()]*)*) 

將輸出包含兩個拍攝組的元組的列表,我們是唯一的興趣din第一個因此i[0]

例子:

In [15]: s 
Out[15]: '44442(2)2(2)44' 

In [16]: [i[0] for i in re.findall(r'((\d)(?:[()]*\2*[()]*)*)', s)] 
Out[16]: ['4444', '2(2)2(2)', '44'] 
3

以最小的變化OP的正則表達式:

[m[0] for m in re.compile(r"((.+?)\2+)").findall('44442(2)2(2)44')] 

findall會給你全場比賽如果沒有團體或團體如果有一些。所以鑑於你需要組讓你的正則表達式工作,我們只需添加另一個組來包含完整匹配,然後提取它。

相關問題