Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字符串解析python嵌套列表_Python_List_Parsing_Abstract Syntax Tree - Fatal编程技术网

从字符串解析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

因此,我将一个文件解析为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\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]]