引号内的评估列表

时间:2017-06-07 22:24:58

标签: python string python-3.x input eval

我正在用Python编写一个程序,它接受用户输入(不使用Python的内置input),这是一个包含字符串列表的字符串,即。 '["hello", "world"]'。但是,一些输入内部会有多个引号,即。 '["Hello", "wor"ld"]'。我需要字符串始终eval()到列表。有关清理输入字符串以确保它始终为eval的任何建议吗?已经尝试.replace('"', '\"')

2 个答案:

答案 0 :(得分:0)

这是一个有点难的问题,因为计算机很难知道哪些引用是无关的,哪些是预期的引用。我能想到的最好的解决方案是首先删除所有双引号和空格,然后在任何字符“[”的实例后添加双引号,在任何逗号后插入空格和双引号,并在之前插入双引号每个逗号和“]”。这不是一个优雅的解决方案,可能需要几行代码,但除非您可以在程序的早期清理输入,否则这可能是最好的解决方案。

答案 1 :(得分:0)

我几乎不喜欢这样做,但实际上可能会有效。首先,选择一个不会被用户输入的符号(例如,字或〜)。然后,删除末尾开头的有效引号,并用该符号替换项目之间的所有有效引号:

s = '["Hello", "wor",ld"  , " ]'
s1 = re.sub(r"(\[\s*\")|(\"\s*,?\s*\])", "", s)
# 'Hello", "wor",ld"  , '
s1 = re.sub(r"\"\s*,\s*\"", "字", s1)
# 'Hello字wor",ld"  , '

最后,转义所有剩余的双引号,用项目分隔符替换有趣的符号,并添加括号:

result = '["' + s1.replace('"', r'\"').replace("字",'","') + '"]'
#'["Hello","wor\\",ld\\"  , "]'
ast.literal_eval(result)
#['Hello', 'wor",ld"  , ']