2014-01-29 29 views
2

我的問題是對this one的變化。我似乎無法弄清楚這一點。Python:按模式分割字符串

given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq" 
expected = ["{abc, xyz}", "123", "{def, lmn, ijk}", "{uvw}", "opq"] 

如在上面的例子中,在expected的項目可能是一個或{..., ...}只是另一個string

非常感謝提前。

+2

如果花括號可以嵌套,你不能使用常規表達式(拆分它至少不會在其「純「形式),因爲它不是一個上下文無關的語法。 – shx2

回答

3

我認爲下面的正則表達式適合這份工作。 Howevever你不必嵌套的花括號

>>> s= "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq" 
>>> re.findall(r",?\s*(\{.*?\}|[^,]+)",s) 
['{abc, xyz}', '123', '{def, lmn, ijk}', '{uvw}', 'opq'] 
+0

可能值得注意的是,爲什麼嵌套大括號可能無法使用正則表達式解決...... – Fenikso

+0

正如上面提到的@ shx2,帶有嵌套大括號的語言是上下文無關的,並且需要下推自動機來解決。 Python中的正則表達式是或多或少的常規語言的實現,由有限自動機解析,因此功能較弱。 – Fenikso

+0

@Xavier_Combelle謝謝! – fatman13

0

以下是否不能爲您提供您要查找的內容?

import re 
given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq" 
expected = re.findall(r'(\w+)', given) 

我跑在終端並獲得:

>>> import re 
>>> given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq" 
>>> expected = re.findall(r'(\w+)', given) 
>>> expected 
['abc', 'xyz', '123', 'def', 'lmn', 'ijk', 'uvw', 'opq'] 
+0

這並非如此,例如,如果它們位於同一組括號內,則'abc'和'xyz'不應該是單獨的單詞。 –

0

您可以使用正則表達式如下做到這一點(嵌套的花括號不能使用正則表達式,據我知道解析)。其餘部分與您提供的類似鏈接相同。

given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq" 
regex = r",?\s*(\{.*?\}|[^,]+)" 

print re.findall(regex,given) 

OP: ['{abc, xyz}', '123', '{def, lmn, ijk}', '{uvw}', 'opq'] 

只需導入re模塊。並按照鏈接說的做。 它將匹配花括號裏的任何東西{}和任何字符串。

+0

你需要re.findall某處你所擁有的只是一個元組 –

+0

他已經給出瞭解釋其餘的鏈接。不是嗎 –

1
given = "{abc,{a:b}, xyz} , 123 , {def, lmn, ijk}, {uvw}, opq" 
#expected = ["{abc, xyz}", "123", "{def, lmn, ijk}", "{uvw}", "opq"] 
tmp_l = given.split(',') 
tmp_l = [i.strip() for i in tmp_l] 
result_l = [] 
element = '' 
count = 0 
for i in tmp_l: 
    if i[0] == '{': 
     count += 1 
    if i[-1] == '}': 
     count -= 1 
    element = element + i + ',' 
    if count == 0: 
     element = element[0:-1] 
     result_l.append(element) 
     element = '' 

print str(result_l) 

這一個可以處理嵌套的花括號,雖然看起來不是那麼優雅..