我有一些Python Dicts注定要成为一个字符串,可能看起来像这样:
"{'foo': bar, "baz": uDogs}"
两个直接的问题是裸狗和狗面前的你。
对于酒吧来说,狗的情况并不那么重要,我正在尝试沿着
行的正则表达式 re.compile(r""":\s*(?!('|"|u|\d))""")
但是没有抓住我需要的案例。
对于这种情况,什么是更聪明的正则表达式?
编辑:预期输出为:
{'foo':'bar', 'baz':'Dogs'}
答案 0 :(得分:3)
忘记RE - compile
是你的朋友。
>>> s="{'foo': bar, \"baz\": uDogs}"
>>> c=compile(s, '', 'eval')
>>> c.co_names
('bar', 'uDogs')
>>> d={n:n[1:] if n[0]=='u' else n for n in c.co_names}
>>> d
{'uDogs': 'Dogs', 'bar': 'bar'}
>>> eval(c, d)
{'foo': 'bar', 'baz': 'Dogs'}
当然,这确实假设以'u'
开头的任何未加引号的值需要将第一个字母切掉。如果您有比这个粗略的启发式更好的启发式,请将它们作为dict理解构建d
中的相应函数插入!
但一般原则是compile
为您提供了一个代码对象,其co_names
是未绑定的变量,然后eval
带有相应的字典(此处为d
)可以首先用他们本应具有的正确值替换这些变量(假设您有很好的启发式来确定所述值,当然: - )。
答案 1 :(得分:0)
只需使用Yaml来处理非独立的json数据:
>>> import yaml
>>> a = "{'foo': bar, 'baz': uDogs}"
>>> yaml.load(a)
>>> adict = yaml.load(a)
>>> adict
{'foo': 'bar', 'baz': 'uDogs'}
>>> adict['baz'] = 'Dogs'
>>> adict
{'foo': 'bar', 'baz': 'Dogs'}
您的字符串"{'foo': bar, "baz": uDogs}"
错误应为"{'foo': bar, 'baz': uDogs}"
或a = '{"foo": bar, "baz": uDogs}'