【问题标题】:Obtaining a list of JSONs with re.split使用 re.split 获取 JSON 列表
【发布时间】:2020-06-25 12:07:27
【问题描述】:

我正在尝试使用 re.split 方法解析包含多个 json 对象的字符串。但是我找不到我想要的模式。

收到的字符串

'{"project":"rapidjson","stars":10}{"project":"rapidjson","stars":10}{"project":"rapidjson","stars":10}'

我的解析代码

def parseMultipleJson(multijson):
    print(re.split('[}+{]', multijson))

预期结果

['{"project":"rapidjson","stars":10}','{"project":"rapidjson","stars":10}', '{"project":"rapidjson","stars":10}']

实际结果

['', '"project":"rapidjson","stars":10', '', '"project":"rapidjson","stars":10', '', '"project":"rapidjson","stars":10', '']

我知道我弄乱了模式,但我已经尝试了一段时间的其他变体,但我找不到达到预期结果的方法

【问题讨论】:

  • 你从哪里得到那个字符串?修改生产者以给你一些合理的工作可能会容易得多。
  • @chepner 不太可行:字符串来自管道,因此如果接收进程崩溃并重新启动,管道将充满这些东西。我什至不能告诉接收器只读取固定数量的字节,因为 json 的大小永远不会固定。我也不能真的让接收过程浪费太多毫秒来检索旧数据,它必须尽可能快
  • 你如何保证你只从管道中读取完整的 JSON 对象?在某些时候,您似乎已经可以识别从结束一个对象的} 和开始另一个对象的{ 之间的转换。由于 ASCII 控制字符不能直接出现在 JSON 中,因此您可以使用它们中的任何一个来分隔流中的对象。
  • @chepner mm,我想我会尝试以其他方式解析字符串。谢谢!

标签: python string parsing split python-re


【解决方案1】:

表达式'(?<=})' 为它工作,这意味着您正在寻找以} 结尾的每个模式。见positive lookbehind assertion

实际结果

['{"project":"rapidjson","stars":10}', '{"project":"rapidjson","stars":10}', '{"project":"rapidjson","stars":10}', '']

【讨论】:

    【解决方案2】:

    我还尝试了很多选项来捕捉模式并最终得到这个:

    def parseMultipleJson(multijson):
        print(re.findall(r'{.{33}', multijson))
    

    这将为您提供预期的输出。但它使用 re.findall 方法而不是 re.split。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2018-12-23
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多