首页 > 解决方案 > 从无法用 ast.literal_eval 解析的字符串中解析嵌套列表

问题描述

我将一个文件解析为一个 Python 列表,我遇到了一个像这样的嵌套列表:

{   1   4{  2a  0.0 }{  3   0.0 }{  4c  0.0 }{  5   0.0 }   }

我想将它解释为一个列表,但嵌套,所以我想成为如下的 Python 列表:

[1,4,[2a,0.0],[3,0.0],[4c,0.0],[5,0.0]]

我设法用以下方法做一个正确的字符串:

l = """{    1   4{  2   0.0 }{  3   0.0 }{  4   0.0 }{  5   0.0 }   }"""
l = l.replace("{\t",",[").replace("\t}","]").replace("{","[").replace("}","]").replace("\t",",")[1:]

我也可以申请l.strip("\t")它是一个列表,但不是嵌套的,否则它将被展平,这是我不想要的。

我试过了ast.literal_eval(l),但它在字符串上失败了,例如2a

标签: pythonlistparsingabstract-syntax-tree

解决方案


Pyparsing 有一个内置的帮助nestedExpr器来帮助解析开始和结束分隔符之间的嵌套列表:

>>> import pyparsing as pp
>>> nested_braces = pp.nestedExpr('{', '}')
>>> t = """{   1   4{  2a  0.0 }{  3   0.0 }{  4c  0.0 }{  5   0.0 }   }"""
>>> print(nested_braces.parseString(t).asList())
[['1', '4', ['2a', '0.0'], ['3', '0.0'], ['4c', '0.0'], ['5', '0.0']]]

推荐阅读