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对象或数组时遇到了麻烦。有什么建议么?
您可以通过检查{
或的存在来找到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)
归档时间: |
|
查看次数: |
7191 次 |
最近记录: |