使用DeepDiff的exclude_regex_paths时误排除所有差异的问题求助
使用DeepDiff的exclude_regex_paths时误排除所有差异的问题求助
你遇到的问题核心是正则表达式的写法错误——你传递的"['seqid']"被解析成了正则的「字符类」,而非匹配完整的['seqid']路径片段,导致所有路径都被意外排除,最终得到空的diff结果。
问题根源
在正则表达式中,[]是特殊语法,表示「字符类」,匹配括号内的任意单个字符。你写的"['seqid']"会匹配任何包含'、s、e、q、i、d、]的路径——而DeepDiff生成的所有路径(比如root['record1']['value'])都包含'和],相当于所有差异路径都被命中排除,自然看不到任何value的变化。
修复方案
要正确匹配seqid字段的完整路径,你需要对正则中的特殊字符[和]进行转义,或者使用原始正则字符串编写正确的匹配规则:
方案1:匹配所有包含['seqid']的路径
使用转义后的正则,匹配任意包含['seqid']的完整路径:
diff = DeepDiff(data1, data2, exclude_regex_paths=r".*\['seqid'\]")
r""表示原始字符串,避免Python解析转义字符.*匹配路径中['seqid']之前的任意内容(比如root['record1'])\[和\]转义方括号,确保匹配字面量的[和]
方案2:精准匹配以seqid为键的路径
如果想更精准地只匹配seqid字段本身的路径,可以用$锚定结尾:
diff = DeepDiff(data1, data2, exclude_regex_paths=r"\['seqid'\]$")
$表示正则匹配到字符串结尾,确保只命中['seqid']作为最后一个路径片段的情况(也就是seqid字段的路径)。
修复后效果
修改后的代码运行后,会输出你期望的结果:
{'values_changed': {"root['record1']['value']": {'new_value': 3, 'old_value': 1}, "root['record2']['value']": {'new_value': 4, 'old_value': 2}}}
完美排除了seqid的差异,同时保留了value的变化。
额外提示
如果需要排除多个规则的路径,exclude_regex_paths也支持列表格式:
diff = DeepDiff(data1, data2, exclude_regex_paths=[r".*\['seqid'\]", r".*\['other_field'\]"])
备注:内容来源于stack exchange,提问作者Cornelius Roemer
相关产品推荐
相关产品推荐

