簡體   English   中英

從字符串解析python嵌套列表

[英]Parse python nested list from string

所以我將文件解析為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上失敗

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開發自己的解析器。 根據您的情況,這不太困難。 您可以解析包圍的大括號,然后拆分項目並遞歸評估每個項目。

這是一個示例(並不完美):

import re

RE_BRACE = r"\{.*\}"
RE_ITEM = r"\d+[a-z]+"
RE_FLOAT = r"[-+]?\d*\.\d+"
RE_INT = r"\d+"

find_all_items = re.compile(
    "|".join([RE_BRACE, RE_ITEM, RE_FLOAT, RE_INT]),
    flags=re.DOTALL).findall

def parse(text):
    mo = re.match(RE_BRACE, text, flags=re.DOTALL)
    if mo:
        content = mo.group()[1:-1]
        items = [parse(part) for part in find_all_items(content)]
        return items
    mo = re.match(RE_ITEM, text, flags=re.DOTALL)
    if mo:
        return mo.group()
    mo = re.match(RE_FLOAT, text, flags=re.DOTALL)
    if mo:
        return float(mo.group())
    mo = re.match(RE_INT, text, flags=re.DOTALL)
    if mo:
        return int(mo.group())
    raise Exception("Invalid text: {0}".format(text))

注意:此解析器無法正確解析{1 {2} {3} 4} 您需要一個像pyparsing這樣的遞歸解析器。

演示:

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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM