如何替换字符串列表中未转义双引号以解决JSON解析错误
修复JSON字符串中未转义的内部双引号问题
当LLM输出的JSON包含未转义的内部双引号时(比如示例中的"15" deep-dish cast aluminum wheels"),会破坏JSON结构导致json.loads解析失败。以下是两种可靠的修复方法:
方法一:正则表达式替换(适合简单场景)
利用正则匹配字符串内部的未转义双引号,将其替换为转义后的\",核心是区分字符串边界的双引号和内部的双引号:
import re import json # 存在问题的JSON字符串 malformed_json = '''{ "Equipment Contents": [ "XL APPEARANCE GROUP", "body-color grille", "body-color body-side molding with chrome insert", "luggage rack", "15" deep-dish cast aluminum wheels", "P235/75R15SL all-terrain OWL tires", "power door locks", "power windows", "power mirrors", "cloth captains chairs" ] }''' # 替换未转义且非字符串边界的双引号 fixed_json = re.sub(r'(?<!\\)"(?!(?:[^"]*"[^"]*")*[^"]*$)', r'\"', malformed_json) # 验证解析结果 parsed_data = json.loads(fixed_json) print(parsed_data["Equipment Contents"][4]) # 输出:15" deep-dish cast aluminum wheels
正则规则说明:
(?<!\\):负向后断言,确保目标双引号前没有反斜杠,避免转义过的引号被重复处理(?!(?:[^"]*"[^"]*")*[^"]*$):负向前断言,确保目标双引号不是字符串的结束边界(即后续双引号数量为偶数,说明当前引号在字符串内部)
方法二:状态机遍历处理(适合复杂场景)
如果LLM输出的JSON存在更复杂的格式问题(比如字符串含换行、多个内部引号),状态机遍历字符的方式更鲁棒。通过跟踪是否处于字符串内部,精准判断需要转义的双引号:
import json def fix_unescaped_quotes(malformed_json): fixed_chars = [] in_string = False escape_next = False for idx, char in enumerate(malformed_json): if escape_next: fixed_chars.append(char) escape_next = False continue if char == '\\': fixed_chars.append(char) escape_next = True continue if char == '"': if not in_string: # 进入字符串,添加边界引号 fixed_chars.append(char) in_string = True else: # 判断是否为字符串结束引号:检查后续字符是否为JSON结构分隔符 next_idx = idx + 1 is_closing_quote = False if next_idx < len(malformed_json): next_char = malformed_json[next_idx] if next_char in (',', ']', '}', '\n', '\t', ' '): is_closing_quote = True if is_closing_quote: # 结束引号,不转义,退出字符串状态 fixed_chars.append(char) in_string = False else: # 内部引号,添加转义符 fixed_chars.append('\\') fixed_chars.append(char) else: fixed_chars.append(char) return ''.join(fixed_chars) # 使用示例 malformed_json = '''{ "Equipment Contents": [ "XL APPEARANCE GROUP", "body-color grille", "body-color body-side molding with chrome insert", "luggage rack", "15" deep-dish cast aluminum wheels", "P235/75R15SL all-terrain OWL tires", "power door locks", "power windows", "power mirrors", "cloth captains chairs" ] }''' fixed_json = fix_unescaped_quotes(malformed_json) parsed_data = json.loads(fixed_json) print(parsed_data["Equipment Contents"][4])
这种方法逐字符扫描,通过状态标记精准处理每个双引号,能应对绝大多数LLM输出的JSON格式异常。
内容的提问来源于stack exchange,提问作者Wennian Li
相关产品推荐
相关产品推荐

