我使用 DeepDiff 和
exclude_regex_paths="['seqid']"
来排除某些字段,但我注意到所有内容都被排除,而不仅仅是我想要排除的字段。在要排除的路径之外的真正差异不会被报告。
这是我的代码:
from deepdiff import DeepDiff
data1 = {
"record1": {"seqid": "ABC123", "value": 1},
"record2": {"seqid": "DEF456", "value": 2}
}
data2 = {
"record1": {"seqid": "XYZ789", "value": 3}, # value changed from 1 to 3
"record2": {"seqid": "UVW321", "value": 4} # value changed from 2 to 4
}
diff = DeepDiff(data1, data2, exclude_regex_paths="['seqid']")
print(diff) # {} - Empty output, but value differences should be shown
我希望这仅排除“seqid”差异,同时仍然显示值差异,但我得到了一个空差异。我做错了什么?我使用的是 DeepDiff 版本 8.0.1。
不幸的是,文档并没有真正定义要使用的路径语法。
我发现了一个相关的反问题:DeepDiff except_paths 正则表达式没有过滤掉路径
我发现了问题:未转义的方括号被解释为定义一个匹配任何单个字符的字符集,即
'
或 s
或 e
或 q
或 i
或 d
。 DeepDiff 匹配的所有路径至少包含两个 '
- 所以所有内容都被排除。
解决方法是转义特殊的正则表达式字符,在本例中为方括号:
exclude_regex_paths="\['seqid'\]"
。这工作正常:
print(DeepDiff(data1, data2, exclude_regex_paths="\['seqid'\]"))
# {'values_changed': {"root['record1']['value']": {'new_value': 3, 'old_value': 1}, "root['record2']['value']": {'new_value': 4, 'old_value': 2}}}
更仔细但详细的解决方案可能是:
diff = DeepDiff(
data1,
data2,
exclude_regex_paths=r"root\[.*?\]\['seqid'\]$"
)
这个图案:
.*?
进行部件之间的非贪婪匹配$
确保我们只匹配路径末尾的“seqid”