DeepDiff regex_exclude_paths 过滤掉所有内容,而不仅仅是我想要的路径

问题描述 投票:0回答:1

我使用 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 正则表达式没有过滤掉路径

python regex python-deepdiff
1个回答
0
投票

我发现了问题:未转义的方括号被解释为定义一个匹配任何单个字符的字符集,即

'
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”
© www.soinside.com 2019 - 2024. All rights reserved.