从字符串解析python嵌套列表
因此,我将一个文件解析为python列表,并遇到一个嵌套列表,如下所示:从字符串解析python嵌套列表,python,list,parsing,abstract-syntax-tree,Python,List,Parsing,Abstract Syntax Tree,因此,我将一个文件解析为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
{ 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\u eval(l)
,但在字符串上失败,例如2a
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']]]
您可以使用RegEx开发自己的解析器。在你的情况下,这并不太难。您可以解析封闭的花括号,然后拆分项目并递归计算每个项目 下面是一个例子(并不完美): 注意:此解析器无法正确解析
{1{2}{3}4}
。为此,您需要一个递归解析器,如pyparsing
演示:
你会得到:
[1, 4, ['2a', 0.0, [3, 0.0, '4c', 0.0], 5, 0.0]]
我在这里感到困惑。有一个
2a
变为2a
,但有一个4cc
变为4
,但在您发布的正确字符串上,但是2
和4
没有任何字符串。正确的输出是什么?抱歉,这是一个输入错误,4c仍然是4c,2a仍然是2a,通常它们是字符串,即它们不能用ast解析而不放入“”,只需执行拆分即可{然后嵌套由space@E.Serra如何按空格进行嵌套拆分?迭代?可以使用下面的答案,也可以在第一个列表中使用for循环。此外,我建议您删除列表中的空字符串,如果您有多个空空格,这些空字符串将被生成
s = '''{ 1 4{ 2a 0.0 }{ 3 0.0 }{ 4c 0.0 }{ 5 0.0 } }'''
l = parse(s)
print(l)
[1, 4, ['2a', 0.0, [3, 0.0, '4c', 0.0], 5, 0.0]]