如何使用Difflib库让ndiff()忽略时间戳进行文本对比?
解决Difflib.ndiff()忽略时间戳对比的问题
要让difflib.ndiff()忽略文本行开头的时间戳,核心思路是先预处理每行文本,移除时间戳后再执行对比,最后将差异结果映射回原文本行即可。
具体实现步骤
1. 定义时间戳预处理函数
利用正则表达式匹配并移除每行开头的mm/dd/yyyy hh:mm:ss格式时间戳:
import re timestamp_regex = re.compile(r'^\d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2} ') def strip_timestamp(line): # 移除行首时间戳,返回核心内容 return timestamp_regex.sub('', line.strip())
2. 预处理文本并执行对比
对两个文本的所有行先移除时间戳,再调用ndiff()对比预处理后的内容,最后将差异标签与原文本行对应:
import difflib # 示例输入文本 text1 = [ 'mm/dd/yyyy hh:mm:ss Report content shjsjsjsjdj', 'mm/dd/yyyy hh:mm:ss more Report to check content shjsjsjsjdj' ] text2 = [ 'mm/dd/yyyy hh:mm:ss same Report content to text1 shjsjsjsjdj', 'mm/dd/yyyy hh:mm:ss more different Report to check content shjsjsjsjdj' ] # 预处理:移除所有行的时间戳 processed_1 = [strip_timestamp(line) for line in text1] processed_2 = [strip_timestamp(line) for line in text2] # 对比预处理后的内容 diff_lines = difflib.ndiff(processed_1, processed_2) # 将差异结果映射回原文本行 final_diff = [] t1_idx, t2_idx = 0, 0 for diff_line in diff_lines: tag = diff_line[0] if tag == '-': # 该行仅存在于text1 final_diff.append(f"{tag} {text1[t1_idx]}") t1_idx += 1 elif tag == '+': # 该行仅存在于text2 final_diff.append(f"{tag} {text2[t2_idx]}") t2_idx += 1 elif tag == ' ': # 两行预处理后内容一致 final_diff.append(f"{tag} {text1[t1_idx]}") t1_idx += 1 t2_idx += 1 # 输出最终差异结果 for line in final_diff: print(line)
结果说明
运行后会输出带差异标签的原文本行,其中:
-标记的行仅属于text1+标记的行仅属于text2标记的行预处理后内容一致(忽略时间戳后无差异)
内容的提问来源于stack exchange,提问作者Mycharmisledengery
相关产品推荐
相关产品推荐

