从字符串解析有效的JSON对象或数组

Gil*_*pie 3 python regex python-3.x

我有一个字符串,可以是以下两种形式之一:

name multi word description {...}
Run Code Online (Sandbox Code Playgroud)

要么

name multi word description [...]
Run Code Online (Sandbox Code Playgroud)

其中{...}[...]是有效的JSON。我对仅解析字符串的JSON部分感兴趣,但是我不确定做到这一点的最佳方法(尤其是因为我不知道字符串将是两种形式中的哪种)。这是我目前的方法:

import json

string = 'bob1: The ceo of the company {"salary": 100000}' 
o_ind = string.find('{')
a_ind = string.find('[')

if o_ind == -1 and a_ind == -1:
    print("Could not find JSON")
    exit(0)

index = min(o_ind, a_ind)
if index == -1:
    index = max(o_ind, a_ind)

json = json.loads(string[index:])
print(json)
Run Code Online (Sandbox Code Playgroud)

它有效,但是我不禁觉得它可以做得更好。我以为可能是正则表达式,但是在匹配子对象和数组而不是最外层的json对象或数组时遇到了麻烦。有什么建议么?

ale*_*cxe 6

您可以通过检查{或的存在来找到JSON的开头,[然后将所有字符串的末尾保存到捕获组中:

>>> import re
>>> string1 = 'bob1: The ceo of the company {"salary": 100000}'
>>> string2 = 'bob1: The ceo of the company ["10001", "10002"]'
>>> 
>>> re.search(r"\s([{\[].*?[}\]])$", string1).group(1)
'{"salary": 100000}'
>>> re.search(r"\s([{\[].*?[}\]])$", string2).group(1)
'["10001", "10002"]'
Run Code Online (Sandbox Code Playgroud)

这里\s([{\[].*?[}\]])$分解为:

  • \s -一个空格字符
  • 括号是一个捕获组
  • [{\[]将匹配一个{[(后者需要使用反斜杠进行转义)
  • .*?对任意字符多次进行非贪婪匹配
  • [}\]]会匹配一个,}并且](后者需要使用反斜杠进行转义)
  • $ 表示字符串的结尾

或者,您可以使用re.split()一个字符串来分隔一个空格,后跟一个{[(以积极的眼神),并得到最后一项。它适用于您提供的示例输入,但不确定总体上是否可靠:

>>> re.split(r"\s(?=[{\[])", string1)[-1]
'{"salary": 100000}'
>>> re.split(r"\s(?=[{\[])", string2)[-1]
'["10001", "10002"]'
Run Code Online (Sandbox Code Playgroud)