想象一下:如何使用正則表達式將該字符串分爲兩部分?
a = "('a','b','c'),('d','e','f')"
我想重新使用拆分它,這樣我會得到2個元素,包含"('a','b','c')"
和('d','e','f')
的數組。我想:
matches = re.split("(?:\)),(?:\()",a)
但是這給我的結果:
'(2,3,4'
'1,6,7)'
我可以分析它的,每個字符,但如果一個正則表達式的解決方案是可能的,我會更喜歡它。
想象一下:如何使用正則表達式將該字符串分爲兩部分?
a = "('a','b','c'),('d','e','f')"
我想重新使用拆分它,這樣我會得到2個元素,包含"('a','b','c')"
和('d','e','f')
的數組。我想:
matches = re.split("(?:\)),(?:\()",a)
但是這給我的結果:
'(2,3,4'
'1,6,7)'
我可以分析它的,每個字符,但如果一個正則表達式的解決方案是可能的,我會更喜歡它。
您需要分割前面有)
後跟一個(
的逗號。但括號本身不應該成爲分歧點的一部分。對於那些需要使用正向前查找和正面看斷言背後爲:
matches = re.split("(?<=\)),(?=\()",a)
試試這個:
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)
split
這裏是錯誤的工具。你想findall
:
import re
a = "('a','b','c'),('d','e','f')"
matches = re.findall("\([^)]*\)", a)
或幾乎等同,
matches = re.findall("\(.*?\)", a)
+1就像這樣,簡單得多,但這會更好:''re.findall(「\([^()] * \)」,s)':你想要任何不是'或')'。 – juliomalegria
好吧,另一個開放的支撐並不會真的傷害任何 - 你只需要禁止關閉的那個,所以貪婪的星星知道在哪裏停止。開括號不會造成任何問題。可以肯定的是,如果在字符串中有任何帶引號的右括號,這種方法就會失效,但只用正則表達式而不是解析器就不能正確處理。它也不檢查括號內是否有逗號。 – Amadan
你的回答對於OP的問題是100%準確的。我的評論只是一種改進,可以讓它在其他情況下工作。例如,如果他有:'s ='((1,2,3),(4,5,6))',你的解決方案會給我們:'['((1,2,3)', '(4,5,6)']'(而不是額外的開口大括號),而在我修改的情況下,'matches'將是:'['(1,2,3)','(4,5,6) ']' – juliomalegria
我從這個正則表達式出現語法錯誤。 – Geo
@Tempus:現在怎麼樣? – codaddict
現在沒關係,謝謝! – Geo