用于清理JSON的正则表达式

时间:2015-01-26 06:13:30

标签: python regex json

我有一些Python Dicts注定要成为一个字符串,可能看起来像这样:

"{'foo': bar, "baz": uDogs}"

两个直接的问题是裸狗和狗面前的你。

对于酒吧来说,狗的情况并不那么重要,我正在尝试沿着

行的正则表达式

re.compile(r""":\s*(?!('|"|u|\d))""")但是没有抓住我需要的案例。

对于这种情况,什么是更聪明的正则表达式?

编辑:预期输出为:

{'foo':'bar', 'baz':'Dogs'}

2 个答案:

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