【问题标题】:Regex for cleaning up JSON [closed]用于清理 JSON 的正则表达式 [关闭]
【发布时间】:2015-01-26 06:13:30
【问题描述】:

我有一些 Python 字典注定会变成 json 作为字符串,可能看起来像这样:

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

两个直接的问题是裸栏和 Dogs 前面的 u。

对于酒吧来说,狗的情况并不那么重要,我正在尝试一个正则表达式

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

在这种情况下,更智能的正则表达式是什么?

编辑:预期输出是:

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

【问题讨论】:

  • 你的预期输出是什么?
  • 选民愿意解释投票吗?或者这是投反对票然后逃跑?
  • 如果bar 不是一个变量,那么你怎么不会出错呢?在第一个示例中也不是字符串
  • @howaboutNO 你是什么意思?我确实得到了一个错误,因此在这种情况下使用正则表达式。
  • 是什么生成了这个无效的 JSON 字符串,我会尝试从源头修复它,因为任何输出这个无效 JSON 的东西都可能没有使用正确的 json 库。通过正则表达式修复将是一个痛苦的经历,因为你不能总是保证修复实际上会“修复”

标签: python regex json


【解决方案1】:

忘记 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 comprehension 构建 d

但一般原则是compile 为您提供一个代码对象,其co_names 是未绑定的变量,然后eval 使用适当的字典(此处为d)可以将这些变量替换为它们的正确值一开始就应该有(当然,假设您有很好的启发式方法来确定所述值:-)。

【讨论】:

  • 如果一对像 {'cats': uK Ships} 怎么办?啊,我可以将该逻辑添加到 dict 理解中。谢谢。
  • 我会在 compile 之前做一个简单的 RE 传递来修复特定的语法损坏,但根据您输入损坏的许多方面的类型,可能会有一个无法修复的级别: -)
【解决方案2】:

只需使用Yaml for Python 处理 un-stand 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}'

【讨论】:

  • 不错的方法,我总是忘记 JSON 几乎是 Yaml 的一个子集
  • 我不明白这是如何将uDogs 固定为Dogs
  • 现在是字符串,使用字符串方法replace('u', '')。
  • 盲目地替换你也有可能带走很多东西。
猜你喜欢
  • 2011-05-26
  • 1970-01-01
  • 2016-10-27
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2010-10-31
相关资源
最近更新 更多