在字符串中查找多个JSON元素以进行替换和漂亮打印

时间:2017-02-06 16:21:34

标签: python json regex

虽然我发现了很多关于正则表达式和JSON的主题,但我看不到隧道的结束。这是关于使用python在日志文件中查找JSON元素(它在Splunk中)。

有人发现以JSON表示法记录对象是个好主意:

  • 在一行的开头总共有10个[。*] - 对。
  • 其中一个可以包含伪JSON,具有大括号,但格式不正确。我对那些
  • 不感兴趣
  • 一行中不能有一个或两个JSON对象
  • 它们可以是单个对象{}或数组[],包含嵌套的JSON

以下是这些例子。

m1='''[][{st=82, fl=FX}][][][][][][][][] nnn {"1":"A"} mmm'''
m2='''[][][{st=82, fl=FX}][][][][][][][] nnn {"1":"A"} xxx {"2":"B"} mmm'''
m3='''[][][][{st=82, fl=FX}][][][][][][] nnn [{"1":"A"},{"2":"B"}] mmm'''
m4='''[][][][][{st=82, fl=FX}][][][][][] nnn {"1":"A"} aaa [{"2":"B"},{"3":"C"}] mmm'''
m5='''[][][][][][{st=82, fl=FX}][][][][] nnn [{"1":"A"},{"2":"B"}] bbb {"3":"C"} mmm'''
m6='''[][][][][][][{st=82, fl=FX}][][][] nnn [{"1":"A"},{"2":"B"}] ccc [{"3":"C"},{"4":"D","5":"E"}] mmm'''

我打算删除每个JSON对象,并使用Python中的json.dumps()替换它的漂亮打印。

该行的其余部分需要保持不变,即标题和任何额外的文本。

一气呵成似乎是不可能的。所以我尝试进行两次迭代,第一次替换JSON数组,第二次迭代完成剩下的工作。像这样:

m=m6
for match in re.finditer('(\[{.*?}\])',m):
   print json.dumps(match.group(1) , sort_keys=False,
                    indent=4, separators=(',', ': '))

for match in re.finditer('({.*?})',m):
   print json.dumps(match.group(1), sort_keys=False,
                    indent=4, separators=(',', ': '))

我遇到了这些问题:

  • match.group()似乎返回一个字符串,json.dumps()不解析。
  • 替换部分我还不知道。
  • 这会足够快吗?或者这是错误的做法?

获得:

"[{\"3\":\"C\"},{\"4\":\"D\",\"5\":\"E\"}]"

预期:

[
    {
        "3": "C"
    },
    {
        "4": "D",
        "5": "E"
    }
] 

这样就可以了:

print json.dumps([{"3":"C"},{"4":"D","5":"E"}], sort_keys=False,
                     indent=4, separators=(',', ': '))

0 个答案:

没有答案