Python:将复杂的字符串解析为可用数据以进行分析

时间:2015-03-25 17:54:49

标签: python string parsing text

是否可以使用Python解析下面的字符串,或者将其转换为另一个数据结构,以便可以访问每个元素进行分析?

这是来自大文本文件的示例行,其中每行具有相同的格式。

string = ["('a', '1')", "('b', '2')"]

3 个答案:

答案 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