2017-04-01 26 views
-2

我都面臨着以下問題:正則表達式得到subgoups

change = "1,23 2,54 1,85 " 
results = re.findall(r"((\d+),(\d+))+((\d+),(\d+))+", change) 
print(results) 

結果是:

('2,54 ', '2', '54', '1,85 ', '1', '85') 

但我想是這樣的:

('1,23 ', '1', '23', '2,54 ', '2', '54', '1,85 ', '1', '85') 

我還沒有發現任何不幸的解決方案

+0

解釋爲什麼你用第三和第六'+'和(只)的'((\ d +兩次),(\ d +))'。 – Yunnosch

回答

2

您對regex組的重複是多餘的。你應該簡單地使用1,只是做findall。我已經使用了itertools.chain,但您也可以通過簡單的列表理解來實現它。

change = "1,23 2,54 1,85 " 
results = re.findall(r"((\d+),(\d+))", change) 
print(results) 
# [('1,23 ', '1', '23'), ('2,54 ', '2', '54'), ('1,85 ', '1', '85')] 
from itertools import chain 
print(list(chain(*results))) 
# ['1,23 ', '1', '23', '2,54 ', '2', '54', '1,85 ', '1', '85'] 
# simple list comprehension 
print([single for group in results for single in group]) 
# ['1,23 ', '1', '23', '2,54 ', '2', '54', '1,85 ', '1', '85'] 
+1

如果你想將結果傳遞給'chain',你也可以使用're.finditer()',它返回一個迭代器而不是一個列表。 – Kasramvd

+0

@Ashish Nitin Patil:謝謝! –

0

用下面的辦法:

change = "1,23 2,54 1,85 " 
results = [n for t in re.findall(r"((\d+),(\d+))", change) for n in t] 
print(results) 

輸出:

['1,23', '1', '23', '2,54', '2', '54', '1,85', '1', '85']