使用正则替换Python字典元素时出现JSONDecodeError错误排查
问题原因分析
你的代码存在两个核心问题,直接导致JSON解析失败:
1. 替换后的字符串未符合JSON语法要求
JSON规范中,字符串必须用双引号包裹,但你的正则替换直接把数字换成了Ar、Ta这类裸字符串。比如原JSON里的[0, 3]会被替换成[Ar, Ca],这在JSON解析器看来是非法的——Ar会被当作未定义的标识符,而非合法的字符串值,这就是触发JSONDecodeError的直接原因。
2. 数字匹配顺序错误,多位数被拆分破坏
你的循环默认按int_mapping的key升序遍历(0,1,2,...10,11)。当先处理1时,会把10中的1替换成Ta,变成Ta0;之后处理0时又把Ta0里的0替换成Ar,最终得到TaAr,完全破坏了原本10对应Aq的映射逻辑。
修正后的代码示例
如果要保留JSON+正则的思路,只需调整两点:
- 替换时给映射值加上双引号,符合JSON字符串格式
- 先替换多位数,再替换一位数,避免多位数被拆分
import re from json import loads, dumps movable = {"movable": [0, 3, 6, 9], "fixed": [1, 4, 7, 10], "mixed": [2, 5, 8, 11]} int_mapping = {0: "Ar", 1: "Ta", 2: "Ge", 3: "Ca", 4: "Le", 5: "Vi", 6: "Li", 7: "Sc", 8: "Sa", 9: "Ca", 10: "Aq", 11: "Pi"} movable_str = dumps(movable) # 按数字字符串长度从长到短排序,优先替换多位数 for key in sorted(int_mapping.keys(), key=lambda x: len(str(x)), reverse=True): # 替换时给映射值包裹双引号,同时确保匹配独立数字 movable_str = re.sub(rf'(?<![0-9]){key}(?![0-9])', f'"{int_mapping[key]}"', movable_str) movable = loads(movable_str) print(movable)
运行后会得到正确结果:
{'movable': ['Ar', 'Ca', 'Li', 'Ca'], 'fixed': ['Ta', 'Le', 'Sc', 'Aq'], 'mixed': ['Ge', 'Vi', 'Sa', 'Pi']}
内容的提问来源于stack exchange,提问作者Sumit
相关产品推荐
相关产品推荐

