python如何比较两个文本,排除比较中的某些块

python如何比较两个文本,排除比较中的某些块,python,python-3.x,diff,Python,Python 3.x,Diff,你能帮我解决以下任务吗。下面给出了我自己的解决方案。我正在寻找其他的方法 任务 我们有两个文本,例如,两个Cisco路由器配置以一定的时间间隔接收。如何确定它们是否相同,并提供工具来审查差异 一些文本块应排除在比较之外。例如,磁盘上上次配置更新的时间戳。应忽略此类块中的差异 还有必要隐藏文本中包含的敏感数据,如钥匙和密码 实例 这两个文本应自动确定为相等或相同 建筑配置。。。 当前配置:33530字节 ! ! baz于美国东部时间2019年11月22日星期五23:58:33更改最后一次配置 !

你能帮我解决以下任务吗。下面给出了我自己的解决方案。我正在寻找其他的方法

任务 我们有两个文本,例如,两个Cisco路由器配置以一定的时间间隔接收。如何确定它们是否相同,并提供工具来审查差异

一些文本块应排除在比较之外。例如,磁盘上上次配置更新的时间戳。应忽略此类块中的差异

还有必要隐藏文本中包含的敏感数据,如钥匙和密码

实例 这两个文本应自动确定为相等或相同

建筑配置。。。 当前配置:33530字节 ! ! baz于美国东部时间2019年11月22日星期五23:58:33更改最后一次配置 ! NVRAM配置最后更新时间为美国东部时间2019年11月23日00:32:38 ! 版本15.3 服务时间戳调试日期时间毫秒本地时间显示时区年份 服务时间戳日志日期时间毫秒本地时间显示时区年份 服务密码加密 无平台punt keepalive禁用内核核心 建筑配置。。。 当前配置:33530字节 ! ! leo于美国东部时间2019年12月6日星期五10:00:00更改最后一次配置 ! NVRAM配置最新更新时间为美国东部时间2019年12月6日星期五10:00:05 ! NVRAM配置最后更新时间为美国东部时间2019年12月6日星期五10:12:25 ! 版本15.3 服务时间戳调试日期时间毫秒本地时间显示时区年份 服务时间戳日志日期时间毫秒本地时间显示时区年份 服务密码加密 无平台punt keepalive禁用内核核心
解决方案之一是对两个文本进行规范化,即删除或用一些字符替换文本块,这些文本块应排除在比较之外

特别是,对于Cisco配置,我使用以下代码:

进口稀土 _normalize\u whiteout\u config\u regexes=tuplemaplambda x:re.compilex,re.MULTILINE[ 隐藏更改时间和更改人 r'^!最后一次配置更改在.+?$处进行, Cisco Nexus-隐藏当前时间 r'^!时间:.+$, 全部-隐藏密钥和密码 r'?:密码|秘密|密钥\d[^\s]+', r'?:auth | priv.*0x[^\s]+', ] _normalize\u remove\u config\u regexes=tuplemaplambda x:re.compilex,re.MULTILINE[ 删除整条线,因为可能有0、1或2条这样的线 r'^!NVRAM配置上次更新时间为+, Cisco Nexus-删除整个产品线以进行比较 正在运行和启动配置 r'^!启动配置保存在:.+?\r?\n', 全部-删除命令的一部分以便能够比较 正在运行和启动配置 r'show running | startup config', ] def _normalize_match_match,blackout_mode=True: 它会将匹配组中的文本变黑或删除。 :param_match:re.sub找到的匹配 :param blackout_mode:默认值:True True:匹配组中的所有文本字符将替换为 False:匹配组中的文本将被删除 位置=0 偏移量=_match.start text=\u match.group _结果=[] 对于范围1中的索引,len_match.groups+1: 开始,结束=_match.spanindex _结果.追加文本[位置:开始-偏移] 如果在断电模式下: _result.append*结束-开始+1 位置=结束-偏移 _结果。追加文本[位置:] return.join\u结果 def cisco_规格化_配置: 隐藏易失性文本部分 对于正则表达式中的正则表达式_normalize_whiteout_config_regex: out=regex.sub\u规范化\u匹配,out 删除易失性文本部分 对于_normalize_remove_config_regex中的正则表达式: out=regex.sublambda x:\u规范化\u匹配x,断电\u模式=False,断电 返回 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 使用opencisco_show_startup_config.txt作为f: _out=f.read 打印Cisco\u规范化\u配置\u输出 因此,问题中的两个示例文本被规范化为相同的文本:

因此diff命令不会发现任何差异


我们可以使用现有的Python和/或JavaScript diff解决方案来显示发现的差异。

我投票将此问题作为离题题题结束,因为它属于@MadPhysical,我已编辑了我的问题。请你重新考虑一下你的意见,再帮我打开好吗。这个问题与stack网站的代码审查部分完全无关。谢谢这是一个特殊的例子,但它不是一个确切的骗局。我会投票决定什么是密码?什么是易变的?“我对这些要求不是很清楚。@乔纳斯威尔姆斯,为了清楚起见更新了问题
Building configuration...

Current configuration : 33530 bytes
!
! Last configuration change at ############################# by ####
!
version 15.3
service timestamps debug datetime msec localtime show-timezone year
service timestamps log datetime msec localtime show-timezone year
service password-encryption
no platform punt-keepalive disable-kernel-core