使用正则匹配连续双引号前的单个双引号以修复异常JSON字符串
解决方案
问题本质
你遇到的是非标准JSON生成错误:字符串值内部的双引号未做转义处理,部分位置还会出现连续双引号"",导致JSON解析失败。
可直接运行的Python实现
方案1:保留值内部双引号(推荐,不丢失原始数据)
利用零宽断言匹配所有非JSON结构的内部双引号,转为转义格式:
import re import json bad_json = '{"Field":"String data "Other String Data""}' # 正则匹配:既不是JSON结构起始/结束标识的双引号,就是值内部的多余引号 fixed_json = re.sub(r'(?<![{,:])"(?![,:}])', r'\\"', bad_json) # 验证解析结果 data = json.loads(fixed_json) print(data) # 输出:{'Field': 'String data "Other String Data"'}
方案2:直接删除值内部多余双引号
如果不需要保留内部双引号,直接替换为空即可:
import re import json bad_json = '{"Field":"String data "Other String Data""}' fixed_json = re.sub(r'(?<![{,:])"(?![,:}])', '', bad_json) data = json.loads(fixed_json) print(data) # 输出:{'Field': 'String data Other String Data'}
正则规则说明
(?<![{,:])"(?![,:}]) 的逻辑:
(?<![{,:]):零宽负向后发断言,要求双引号的前一个字符不能是{、,、:(排除键起始、值起始的合法引号)":匹配目标双引号(?![,:}]):零宽负向正向断言,要求双引号的后一个字符不能是,、:、}(排除键结束、值结束的合法引号)
原有正则失效原因
你之前写的(?=(?=(")).*"")仅做了正向预查判断存在连续双引号,没有排除JSON结构本身的合法引号,会匹配到大量无效位置,无法精准定位需要处理的目标引号。
内容的提问来源于stack exchange,提问作者Alfonzo Sanfilippo
相关产品推荐
相关产品推荐

