【问题标题】:creating Dictionary-object from string that looks like dictionaries从看起来像字典的字符串创建字典对象
【发布时间】:2013-01-21 14:38:42
【问题描述】:

我有一个字符串,看起来类似于以下内容:

myString = "major: 11, minor: 31, name: A=1,B=1,C=1,P=1, severity: 0, comment: this is down"

到目前为止我已经尝试过了:

dict(elem.split(':') for elem in myString.split(','))

它工作正常,直到它捕获上面不能是split()':' 的名称元素。 我希望将这些格式的元素作为新字典,例如

myDic = {'major':'11', 'minor': '31', 'name':{'A':'1', 'B':'1', 'C':'1', 'P', '1'}, 'severity': '0', 'comment': 'this is down'}

如果可能的话,我想避免复杂的解析,因为这些结果很难维护。 我也不知道上面字符串中键或值的名称/数量。我只知道格式。这不是 JSON 响应,这是文件中文本的一部分,我无法控制当前格式。

【问题讨论】:

  • 您需要针对该格式的自定义解析器; name 值中的 , 与字符串中的其他逗号冲突。
  • 它看起来肯定不像json,但如果你对格式有任何控制,我确实建议使用json。
  • @TomaszŁazarowicz 你说得对,我在看字典:/
  • @TomaszŁazarowicz,这确实不是 JSON,不幸的是我无法控制格式。
  • 我建议你要么得到一个你想要解析的语言的正式规范(语法糖不会那么容易),要么你切换到似乎具有相同表达能力的 JSON,而提供强大、稳健、轻量级的工具支持。

标签: python parsing dictionary


【解决方案1】:

仅供参考,这不是完整的解决方案..

如果这是您输入的具体结构,并且将是源中的常量模式,您可以区分逗号分隔 代币。

major: 11name: A=1,B=1,C=1,P=1, 的区别在于第一个标记后面有 SPACE,这与第二个标记不同。因此,只需在第二个 split 方法中添加一个空格,您就可以正确呈现您的字符串。

所以,代码应该是这样的:

dict(elem.split(':') for elem in myString.split(', '))   

注意发送拆分方式。有空格和逗号...

关于 JSON 格式,我猜它需要更多的工作。我现在不知道..

【讨论】:

  • 我会说以这种方式解释给定的示例非常勇敢。看起来这个语法的发明者并没有清楚地知道应该如何解析它,否则语法会有所不同。那么我们如何才能断定它遵循这些规则呢?
  • 如上面的 cmets 所述,我不能依赖空格!
【解决方案2】:

这是另一个建议。

你为什么不把它转换成字典符号。

例如在第一步中,您将“:”和(输入的逗号或结尾)之间的所有内容替换为包含“=”(并且我不知道没有空格,我不知道)的所有内容,方法是将其包裹在大括号中并将“=”替换为':'。

在第二步中,将 ':' 和(输入的逗号或结尾)之间的所有内容包装在 ' 中,删除尾随和前导空格。

最后,你用大括号把它包起来。

不过,我仍然不相信这种语法……也许在成功处理了几千行之后……

【讨论】:

    【解决方案3】:

    至少,这可以正确解析给定的示例...

    import re
    
    def parse(s):
    
        rx = r"""(?x)
            (\w+) \s* : \s*
            (
                (?: \w+ = \w+,)*
                (?: \w+ = \w+)
                |
                (?: [^,]+)
            )
        """
    
        r = {}
        for key, val in re.findall(rx, s):
            if '=' in val:
                val = dict(x.split('=') for x in val.split(','))
            r[key] = val
        return r
    
    
    myString = "major: 11, minor: 31, name: A=1,B=1,C=1,P=1, severity: 0, comment: this is down"
    print parse(myString)    
    # {'comment': 'this is down', 'major': '11', 'name': {'A': '1', 'P': '1', 'C': '1', 'B': '1'}, 'minor': '31', 'severity': '0'}
    

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2016-12-02
      • 2011-07-06
      相关资源
      最近更新 更多