将格式不正确的字符串转换成字典?

3

目前的问题是我有一个字符串

'{ecl:gry, hcl:#888785, eyr:2023, cid:63, iyr:2019, hgt:177cm, pid:656793259}'

我无法使用ast.literal_eval将其转换为字典,因为它的格式不正确。因此,我尝试用引号包装字母数字字符。

        output = ""
        quoting = False
        for char in string:
            if char.isalnum():
                if not quoting:
                    output += '"'
                    quoting = True
            elif quoting:
                output += '"'
                quoting = False 
            output += char

然而,一些键值对的值以特殊字符开头,这已经导致了:

"hcl":#"888785",

替代方案:

"hcl":"#888785",

因此,我在重新格式化我的字符串以进行ast.literal_eval()时,能够得到最接近的结果是:

{"ecl":"gry", "hcl":#"888785", "eyr":"2023", "cid":"63", "iyr":"2019", "hgt":"177cm", "pid":"656793259"}

我该如何在将这个字符串转换成字典的同时包括特殊字符?
2个回答

1
这是一行代码,可以完成此操作。它会去掉 {} 字符,根据 ', ' 进行分割,然后进一步将每个结果按 : 进行拆分。这些结果成为键值对,创建一个字典。
sval= '{ecl:gry, hcl:#888785, eyr:2023, cid:63, iyr:2019, hgt:177cm, pid:656793259}'
sval = {k:v for (k,v) in [s.split(':') for s in sval.strip('{}').split(', ')]}
>>> sval
{'ecl': 'gry', 'hcl': '#888785', 'eyr': '2023', 'cid': '63', 'iyr': '2019', 'hgt': '177cm', 'pid': '656793259'}

1
哈哈,你马上就认出来了!谢谢你,这太有帮助了! :) - ramadhuta
5个半小时前 ingrained :) - Tom Myddeltyn

1
您可以在生成器表达式中使用splitstrip来使这个过程在一行内完成:
s = "{ecl:gry, hcl:#888785, eyr:2023, cid:63, iyr:2019, hgt:177cm, pid:656793259}"
d = dict(e.split(":") for e in s.strip("{},").split())

代码无法运行。将 string.strip 改为 s.strip - Tom Myddeltyn
1
@TomMyddeltyn 没有意识到我最后一次测试后更改了它,感谢你发现了这个问题。 - gmdev
1
我喜欢那个。我并不总是记得我可以使用 dict() 而不是 {} - Tom Myddeltyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接