是否可以使用Python解析下面的字符串,或者将其转换为另一个数据结构,以便可以访问每个元素进行分析?
这是来自大文本文件的示例行,其中每行具有相同的格式。
string = ["('a', '1')", "('b', '2')"]
答案 0 :(得分:3)
如果您只想将元组字符串转换为元组,则可以使用ast.literal_eval
:
>>> import ast
>>> [ast.literal_eval(x) for x in string]
[('a', '1'), ('b', '2')]
鼓励使用ast.literal_eval
而不是eval
,因为它被认为更安全:它不执行所有 Python代码字符串,只执行文字表达式(没有变量,没有函数调用)。
然后,您可以使用Python的切片/索引表示法访问元组的元素,或转换为替代数据结构,例如,字典:
>>> dict([ast.literal_eval(x) for x in string])
{'a': '1', 'b': '2'}
答案 1 :(得分:1)
您可以在列表理解中使用ast.literal_eval
:
>>> s= ["('a', '1')", "('b', '2')"]
>>> import ast
>>> [ast.literal_eval(i) for i in s]
[('a', '1'), ('b', '2')]
ast.literal_eval(node_or_string)
安全地评估表达式节点或包含Python文字或容器显示的Unicode或Latin-1编码字符串。
此外,由于您的元素是字符串,您可以使用regex
来解析列表元素:
>>> import re
>>> a=[re.findall(r"'(.*?)'",i) for i in s]
>>> a
[['a', '1'], ['b', '2']]
模式'(.*?)'
将匹配2个引用之间的任何内容!
答案 2 :(得分:1)
[eval(s) for s in string]
这会将您的字符串列表转换为元组列表
编辑:使用literal_eval而不是eval建议的其他答案。如果您的数据来自不受信任的来源,则您希望这样做。 literal_eval doc link