从一个字符串中提取json字符串的部分

比如我有一个字符串'abaafedf{"name":peter,"jobs":{"title":"supervisor","age":45}}daskj{sakjdkas}'
我想用正则把其中的{"name":peter,"jobs":{"title":"supervisor","age":45}}提取出来,也就是字符串中出现的第一个大花括号下的完整内容,注意:不想要后面的{sakjdkas},不知道这个正则表达式该怎么写,真心求教。

阅读 8.8k
4 个回答

正则好像做不了或者说很受限,可以根据“{”出现的次数与位置序号计算得出一个完整的json字符
re.search('({.+?}+)', a).group(1) 仅能匹配你那条字符格式
换成 'abaafedf{"name":peter,"jobs":{"title":"supervisor","age":45},"b":1}daskj{sakjdkas}'就不行了

json可以无限嵌套,纯正则没法处理这种无限嵌套的问题,如果限定一个最大嵌套深度的话倒还行。建议用脚本语言简单处理下更快,比如python:

def extract_json(s):
    i = s.index('{')
    count = 1 #当前所在嵌套深度,即还没闭合的'{'个数
    for j,c in enumerate(s[i+1:], start=i+1):
        if c == '}':
            count -= 1
        elif c == '{':
            count += 1
        if count == 0:
            break
    assert(count == 0) #检查是否找到最后一个'}'
    return s[i:j+1]

是呀,只用正则的话感觉很受限啊,
建个栈,遍历{入站,遇到}出栈,取到位置再截取感觉简单点

新手上路,请多包涵

按照题主的例子来说,以下代码倒是可以实现,只是不知道是否满足题主的要求……

import re

str = 'abaafedf{"name":peter,"jobs":{"title":"supervisor","age":45}}daskj{sakjdkas}'
ptr = r'{.*?}}'

res = re.search(ptr, str)
print(res.group(0))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏