0

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

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 响应,这是文件中文本的一部分,我无法控制当前格式。

4

3 回答 3

1

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

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

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

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

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

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

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

于 2013-01-21T15:03:15.663 回答
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'}
于 2013-01-21T16:07:08.497 回答
0

这是另一个建议。

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

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

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

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

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

于 2013-01-21T15:33:20.570 回答