我有这个:
x = "[['ATRM', 'SIF', 'NWPX'], ['NAV','SENEA'], ['HES','AGYS', 'CBST', 'GTIM', 'XRSC']]"
x
是一个字符串,我想要这个。
x = [['ATRM', 'SIF', 'NWPX'], ['NAV','SENEA'], ['HES','AGYS', 'CBST', 'GTIM', 'XRSC']]
其中 x
是一个列表。
我通常会使用 eval
或 ast.literal_eval
但这些功能都不可用。有什么办法吗?也许我可以用 re
但我不知道怎么做。
这是一个奇怪的变通方法,但如果你用双引号代替单引号,可以使用json解析器。
>>> import json
>>> json.loads(x.replace("'", '"'))
[['ATRM', 'SIF', 'NWPX'], ['NAV', 'SENEA'], ['HES', 'AGYS', 'CBST', 'GTIM', 'XRSC']]
我觉得,你需要在这里写一个你自己的小解析器,例如:。
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']]
我承认这是一个非常古怪和限制性的答案,因为它只适用于基于示例文本的给定信息。
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()
它的主要工作原理是当出现"], "的时候,你可以通过分割字符串来判断一个列表的结束。大部分的代码只是通过删除不需要的尾部字符,如括号、引号和空格来清理单词。重申一下,这只有在以下情况下才会有效。
好了,我想找到了答案,用再。
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))]