【问题标题】:Python: Parsing a complex string into usable data for analysisPython:将复杂字符串解析为可用数据以进行分析
【发布时间】:2015-03-25 17:54:49
【问题描述】:

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

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

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

【问题讨论】:

  • 考虑到您提供给我们的数据看起来很正常(这确实是关键),答案很可能是肯定的。但是,如果不知道您想要什么数据格式,就不可能说出来。你能给我们举个例子,说明你希望输出什么以及输入什么。

标签: python string parsing text


【解决方案1】:

如果你只是想将元组字符串转换为元组,你可以使用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'}

【讨论】:

    【解决方案2】:
    [eval(s) for s in string]
    

    这会将您的字符串列表转换为元组列表


    编辑:其他答案建议使用 literal_eval 而不是 eval。如果您的数据来自不受信任的来源,您将希望这样做。 literal_eval doc link

    【讨论】:

      【解决方案3】:

      您可以在列表理解中使用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 个单引号之间的任何内容!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        • 2016-06-20
        • 2012-05-24
        相关资源
        最近更新 更多