#!/usr/bin/env python3 import json import re def fix_json_escape_errors(file_path): """修复JSON文件中的反斜杠转义字符错误""" try: # 读取文件内容 with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 修复常见的LaTeX数学符号转义错误 # 将单独的反斜杠替换为双反斜杠,但注意不要影响已经正确的转义序列 fixed_content = content # 修复数学模式中的反斜杠 # 例如: \frac 应该保持不变,但 \ 可能需要转义 # 这里我们修复一些常见的错误模式 # 模式1: 在JSON字符串值中,单独的反斜杠后面跟着非转义字符 # 我们要找到JSON字符串中的反斜杠并修复它们 in_string = False escape_next = False result = [] i = 0 while i < len(fixed_content): char = fixed_content[i] if escape_next: result.append(char) escape_next = False i += 1 continue if char == '\\': # 检查是否在字符串中 if not in_string: # 不在字符串中,这是JSON转义,保持不变 result.append(char) i += 1 continue # 在字符串中,检查下一个字符 if i + 1 < len(fixed_content): next_char = fixed_content[i + 1] # 如果已经是合法的JSON转义序列,保持不变 if next_char in '"\\nrtbf/': result.append(char) i += 1 continue # 如果是LaTeX命令,可能需要转义 # 检查是否是LaTeX命令的开始 laTeX_commands = ['frac', 'sqrt', 'sin', 'cos', 'tan', 'log', 'ln', 'alpha', 'beta', 'gamma', 'delta', 'theta', 'lambda', 'mu', 'pi', 'sigma', 'phi', 'omega'] # 尝试匹配LaTeX命令 matched_cmd = None for cmd in laTeX_commands: if fixed_content[i+1:i+1+len(cmd)] == cmd: matched_cmd = cmd break if matched_cmd: # 这是LaTeX命令,保持反斜杠 result.append(char) i += 1 continue # 其他情况,可能需要转义反斜杠 # 检查这个反斜杠是否已经被正确转义 if i > 0 and fixed_content[i-1] != '\\': # 需要转义 result.append('\\\\') else: result.append(char) else: # 反斜杠在字符串末尾,需要转义 result.append('\\\\') elif char == '"' and not escape_next: # 字符串开始或结束 in_string = not in_string result.append(char) else: result.append(char) i += 1 fixed_content = ''.join(result) # 尝试解析修复后的内容 try: json.loads(fixed_content) print(f"✓ {file_path} - 修复成功") # 写回文件 with open(file_path, 'w', encoding='utf-8') as f: f.write(fixed_content) return True except json.JSONDecodeError as e: print(f"✗ {file_path} - 修复失败: {str(e)}") # 如果自动修复失败,尝试更简单的方法 return fix_json_simple(file_path) except Exception as e: print(f"✗ {file_path} - 处理出错: {str(e)}") return False def fix_json_simple(file_path): """简单的JSON修复方法""" try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 简单替换常见的错误模式 # 将单独的反斜杠(不是LaTeX命令)替换为双反斜杠 # 这是一个启发式方法,可能不完美 # 首先找到所有数学表达式 # 使用正则表达式来查找$...$和\(...\)模式 math_patterns = [] # 查找行内数学模式 $...$ pattern_inline = r'\$([^$]*)\$' matches = re.finditer(pattern_inline, content) for match in matches: math_patterns.append((match.start(), match.end(), match.group())) # 查找显示数学模式 \(...\) pattern_display = r'\\\(([^)]*)\\\)' matches = re.finditer(pattern_display, content) for match in matches: math_patterns.append((match.start(), match.end(), match.group())) # 对每个数学表达式进行修复 fixed_content = content offset = 0 for start, end, math_expr in sorted(math_patterns): # 提取数学内容 math_content = math_expr[1:-1] if math_expr.startswith('$') else math_expr[2:-2] # 修复数学内容中的反斜杠 fixed_math_content = math_content # 这里可以添加更复杂的修复逻辑 # 暂时保持原样,因为LaTeX命令中的反斜杠通常是正确的 # 替换回原内容 if math_expr.startswith('$'): replacement = f'${fixed_math_content}$' else: replacement = f'\\({fixed_math_content}\\)' fixed_content = fixed_content[:start+offset] + replacement + fixed_content[end+offset:] offset += len(replacement) - len(math_expr) # 尝试解析 json.loads(fixed_content) print(f"✓ {file_path} - 简单修复成功") with open(file_path, 'w', encoding='utf-8') as f: f.write(fixed_content) return True except Exception as e: print(f"✗ {file_path} - 简单修复也失败: {str(e)}") return False if __name__ == "__main__": files_to_fix = [ 'knowledge-选择性必修第一章-空间向量与立体几何.json', 'knowledge-选择性必修第三章-圆锥曲线的方程.json', 'knowledge-选择性必修第二章-直线和圆的方程.json', 'knowledge-选择性必修第五章-一元函数的导数及其应用.json', 'knowledge-选择性必修第八章-成对数据的统计分析.json', 'knowledge-选择性必修第六章-计数原理.json', 'knowledge-选择性必修第四章-数列.json' ] for file_path in files_to_fix: fix_json_escape_errors(file_path)