如何用正则表达式去除JSON中content字段值内的多余引号?
修复JSON中content字段值内的意外引号问题
搞定这个解析失败的问题核心是精准区分JSON结构引号和content字段值内的意外引号,不能误删结构本身的引号。下面给你一个实用的正则方案,附完整代码示例:
问题场景复现
先看一个典型的坏JSON例子——content值里的未转义双引号直接破坏了JSON结构:
{ "id": 1, "content": "这段文本里有"意外"的引号,直接用json.loads会报错" }
解决方案:正则定向清理
我们可以用正则精准匹配content字段的完整取值范围,然后单独清理值内的双引号,保留JSON结构的引号。
Python代码实现
import re import json # 你的有问题的JSON字符串 malformed_json = '''{ "article_id": 123, "content": "用户输入的内容里有"多余"的双引号,导致JSON解析失败", "author": "test" }''' # 正则规则:精准定位content字段的取值范围 # 规则解释: # - ("content": ") 捕获字段键和开头的引号,保留JSON结构部分 # - (.*?) 非贪婪匹配content的实际内容(支持换行) # - (")(?=[,}]) 匹配结尾的引号,确保后面是JSON的分隔符(逗号或大括号) pattern = r'("content": ")(.*?)(")(?=[,}])' # 自定义替换函数:清理内容里的双引号 def clean_inner_quotes(match_obj): # 提取捕获的分组:结构前缀、原始内容、结构后缀引号 prefix = match_obj.group(1) raw_content = match_obj.group(2) suffix = match_obj.group(3) # 删除内容里的所有双引号 cleaned_content = raw_content.replace('"', '') # 拼接回合法的JSON片段 return f'{prefix}{cleaned_content}{suffix}' # 执行修复 fixed_json = re.sub(pattern, clean_inner_quotes, malformed_json, flags=re.DOTALL) # 验证解析结果 try: parsed_data = json.loads(fixed_json) print("✅ JSON解析成功!") print("清理后的content内容:", parsed_data['content']) except json.JSONDecodeError as e: print(f"❌ 解析失败,错误信息:{e}")
关键细节说明
- 非贪婪匹配
.*?:确保我们不会把后面其他字段的结构引号误包含进来,只会匹配到当前content字段的结尾引号。 re.DOTALL标志:让正则里的.可以匹配换行符,避免content值包含换行时匹配失败。- 正向断言
(?=[,}]):确保我们匹配的结尾引号是JSON结构的一部分,进一步提升匹配的精准度。
如果你的场景里content值内的意外引号是单引号(不过单引号不会导致JSON解析失败,因为JSON字符串默认用双引号),只需把替换逻辑里的'"'改成"'"即可。
内容的提问来源于stack exchange,提问作者Kai Wang
相关产品推荐
相关产品推荐

