2011-12-28 66 views
3

我想這樣的一個字符串轉換:轉換字符串以括號爲嵌套表

"asd foo bar (lol bla (gee bee) lee) ree" 

到像這樣的列表:

["asd","foo","bar",["lol","bla",["gee","bee"],"lee"],"ree"] 

有一個簡單的解決方案嗎?

編輯:這應該適用於任何數量和括號的深度,但它只有爲有效字符串(無單括號)工作

EDIT2:空間可以被看作是分隔符,如果它不匹配它可能會引發錯誤或者不起作用,我不在乎。它只需要爲格式良好的字符串工作。

+0

您需要更多地定義它,例如可以字符串是否有空格,或者我們可以將任何空格視爲分隔符,如果匹配不匹配會引發錯誤? –

+0

完成。 (空格可以看作是分隔符,如果它不匹配,可能會引發錯誤或者不起作用,我不在乎,它只能用於格式良好的字符串。) – L3viathan

回答

8

您可以使用Python的解析器來完成這項工作。只是幫助它一點:

>>> a = "asd foo bar (lol bla (gee bee) lee) ree" 
>>> eval(str(a.split()).replace("'(',", '[').replace("')'",']')) 
['asd', 'foo', 'bar', ['lol', 'bla', ['gee', 'bee'], 'lee'], 'ree'] 

如果你需要它是安全的,使用ast.literal_eval而不是!

+0

謝謝,幾乎可以工作。第二種替換方法只是一個小錯誤(paranthesis和括號被換掉) – L3viathan

+0

對不起,我後來編輯它:)。現在它可以工作 – JBernardo

1

Pyparsing帶有一個內置的輔助方法,nestedExpr

>>> from pyparsing import nestedExpr 
>>> a = "asd foo bar (lol bla (gee bee) lee) ree" 
>>> # have to put total string into()'s 
>>> printed nestedExpr().parseString("(%s)" % a).asList()[0] 
['asd', 'foo', 'bar', ['lol', 'bla', ['gee', 'bee'], 'lee'], 'ree'] 

這裏唯一的問題是,爲了防止分析器簡單,整串有一對裏面包裹()」秒。 nestedExpr的默認分隔符是(),但也可以是其他任何一對字符串或pyparsing表達式。

相關問題