将带括号的字符串转换为嵌套列表

时间:2011-12-28 02:01:26

标签: python string parsing list

我想转换一个这样的字符串:

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

到这样的列表:

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

有一个简单的解决方案吗?

编辑:它应该适用于任何数量和深度的parantheses,但它只适用于有效的字符串(没有单个parantheses)

edit2:空格可以看作是分隔符,如果它不匹配则可能引发错误或者只是不起作用,我不在乎。它必须适用于格式良好的字符串。

2 个答案:

答案 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表达式。