我想转换一个这样的字符串:
"asd foo bar ( lol bla ( gee bee ) lee ) ree"
到这样的列表:
["asd","foo","bar",["lol","bla",["gee","bee"],"lee"],"ree"]
有一个简单的解决方案吗?
编辑:它应该适用于任何数量和深度的parantheses,但它只适用于有效的字符串(没有单个parantheses)
edit2:空格可以看作是分隔符,如果它不匹配则可能引发错误或者只是不起作用,我不在乎。它必须适用于格式良好的字符串。
答案 0 :(得分: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
!
答案 1 :(得分: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表达式。