将列表的字符串表示法转换为列表的字符串表示法,不需要评估。

问题描述 投票:-1回答:1

我有这个:

x = "[['ATRM', 'SIF', 'NWPX'], ['NAV','SENEA'], ['HES','AGYS', 'CBST', 'GTIM', 'XRSC']]"

x 是一个字符串,我想要这个。

x = [['ATRM', 'SIF', 'NWPX'], ['NAV','SENEA'], ['HES','AGYS', 'CBST', 'GTIM', 'XRSC']]

其中 x 是一个列表。

我通常会使用 evalast.literal_eval 但这些功能都不可用。有什么办法吗?也许我可以用 re但我不知道怎么做。

python list regular-language re
1个回答
2
投票

这是一个奇怪的变通方法,但如果你用双引号代替单引号,可以使用json解析器。

>>> import json
>>> json.loads(x.replace("'", '"'))
[['ATRM', 'SIF', 'NWPX'], ['NAV', 'SENEA'], ['HES', 'AGYS', 'CBST', 'GTIM', 'XRSC']]

1
投票

我觉得,你需要在这里写一个你自己的小解析器,例如:。

def tokenizer(string):
    buffer = ""
    quote = False
    for c in string:
        if quote:
            if c == "'":
                yield ("VALUE", buffer)
                buffer = ""
                quote = not quote
            else:
                buffer += c
        else:
            if c == "[":
                yield ("LIST_OPEN", None)
            elif c == "]":
                yield ("LIST_CLOSE", None)
            elif c == "'":
                quote = not quote
            else:
                pass


def parser(tokens):
    lst = []
    for token in tokens:
        x, y = token
        if x == "LIST_OPEN":
            lst.append(parser(tokens))
        elif x == "LIST_CLOSE":
            return lst
        elif x == "VALUE":
            lst.append(y)
    return lst[0]

带有一些测试断言

assert parser(tokenizer("['HES', ['ATRM', 'SIF', 'NAV']]")) == ['HES', ['ATRM', 'SIF', 'NAV']]
assert parser(tokenizer("[['ATRM', 'SIF', 'NWPX'], ['NAV','SENEA'], ['HES','AGYS', 'CBST', 'GTIM', 'XRSC']]")) == [['ATRM', 'SIF', 'NWPX'], ['NAV','SENEA'], ['HES','AGYS', 'CBST', 'GTIM', 'XRSC']]


我们的想法是首先将字符串符号化为数值和命令 然后将其转换为一个实际的列表。

0
投票

我承认这是一个非常古怪和限制性的答案,因为它只适用于基于示例文本的给定信息。

def list_list_str_to_list(data_str):
    final_word_list_list = []
    for temp_list_as_str in data_str.split("],"):
        final_word_list = []
        for raw_word in temp_list_as_str.split(","):
            new_word = raw_word
            for letter in "[],'\"":
                new_word = new_word.replace(letter, "")
            final_word_list.append(new_word)
        final_word_list_list.append(final_word_list)
    return final_word_list_list


def main():
    data_str = "[['ATRM', 'SIF', 'NWPX'], ['NAV','SENEA'], ['HES','AGYS', 'CBST', 'GTIM', 'XRSC']]"

    for final_word_list in list_list_str_to_list(data_str):
        print(final_word_list)


main()

它的主要工作原理是当出现"], "的时候,你可以通过分割字符串来判断一个列表的结束。大部分的代码只是通过删除不需要的尾部字符,如括号、引号和空格来清理单词。重申一下,这只有在以下情况下才会有效。

  1. 字符串是一个二维列表的字符串表示,并且...
  2. 各个字符串中没有括号或单双引号。

0
投票

好了,我想找到了答案,用再。

x = "[['ATRM', 'SIF', 'NWPX'], ['NAV','SENEA'], ['HES','AGYS', 'CBST', 'GTIM', 'XRSC']]"

y = [re.findall(r"\[(.+?)\]", x[1:])[i] for i in range(x.count('[')-1)]

answer = [re.findall(r"'(.+?)'", y[i]) for i in range(len(y))]
© www.soinside.com 2019 - 2024. All rights reserved.