2011-12-13 31 views
2

想象一下:如何使用正則表達式將該字符串分爲兩部分?

a = "('a','b','c'),('d','e','f')" 

我想重新使用拆分它,這樣我會得到2個元素,包含"('a','b','c')"('d','e','f')的數組。我想:

matches = re.split("(?:\)),(?:\()",a) 

但是這給我的結果:

'(2,3,4' 
'1,6,7)' 

我可以分析它的,每個字符,但如果一個正則表達式的解決方案是可能的,我會更喜歡它。

回答

3

您需要分割前面有)後跟一個(的逗號。但括號本身不應該成爲分歧點的一部分。對於那些需要使用正向前查找和正面看斷言背後爲:

matches = re.split("(?<=\)),(?=\()",a) 

See it

+0

我從這個正則表達式出現語法錯誤。 – Geo

+0

@Tempus:現在怎麼樣? – codaddict

+0

現在沒關係,謝謝! – Geo

2

試試這個:

from ast import literal_eval 
a = "('a','b','c'),('d','e','f')" 
x, y = literal_eval(a) 

在此之後,x('a', 'b', 'c')可與str(x)被stringized ,或者,如果有空間的話,

"(%s)" % ",".join(repr(z) for z in x) 
2

split這裏是錯誤的工具。你想findall

import re 
a = "('a','b','c'),('d','e','f')" 
matches = re.findall("\([^)]*\)", a) 

或幾乎等同,

matches = re.findall("\(.*?\)", a) 
+0

+1就像這樣,簡單得多,但這會更好:''re.findall(「\([^()] * \)」,s)':你想要任何不是'或')'。 – juliomalegria

+0

好吧,另一個開放的支撐並不會真的傷害任何 - 你只需要禁止關閉的那個,所以貪婪的星星知道在哪裏停止。開括號不會造成任何問題。可以肯定的是,如果在字符串中有任何帶引號的右括號,這種方法就會失效,但只用正則表達式而不是解析器就不能正確處理。它也不檢查括號內是否有逗號。 – Amadan

+0

你的回答對於OP的問題是100%準確的。我的評論只是一種改進,可以讓它在其他情況下工作。例如,如果他有:'s ='((1,2,3),(4,5,6))',你的解決方案會給我們:'['((1,2,3)', '(4,5,6)']'(而不是額外的開口大括號),而在我修改的情況下,'matches'將是:'['(1,2,3)','(4,5,6) ']' – juliomalegria

相關問題