从字符串创建Dictionary-object,看起来像字典

时间:2013-01-21 14:38:43

标签: python parsing dictionary

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

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(','))

它可以正常工作,直到它捕获名称元素,而{name}元素不能split() ':'。 我希望将这些格式的元素作为新词典,例如。

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

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

3 个答案:

答案 0 :(得分:1)

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

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

major: 11name: A=1,B=1,C=1,P=1,之间的区别在于第一个令牌后面有 SPACE ,这与第二个令牌有所不同。因此,只需在第二个split方法中添加空格,即可正确渲染字符串。

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

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

注意发送拆分方法。有一个空格和逗号...

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

答案 1 :(得分:0)

这是另一个建议。

为什么不将它转换为字典表示法。

E.g。在第一步中,通过将其包装在大括号中并将'='替换为'='来替换包含'='(和mybe no空格,我不知道)的':'和(逗号或输入结尾)之间的所有内容':'。

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

最后,你把它全部用括号括起来。

我仍然不相信那种语法,但是...可能已经成功处理了几千行......

答案 2 :(得分:0)

至少,这正确地解析了给定的例子......

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'}