Python正则匹配组对比问题:相同文件匹配结果对比异常
正则匹配结果对比的正确实现方法
你的问题核心是迭代器只能遍历一次加上循环逻辑错误,导致只有最后一组匹配能被对比。以下是问题分析和解决方法:
原代码的问题
re.finditer()返回的是一次性迭代器,内层循环for res2 in result2会把result2的所有元素遍历完,后续再访问result2就没有内容了。- 嵌套循环逻辑错误:你需要的是同步对比两个迭代器的对应匹配项,而不是每个res1都把result2全遍历一遍——这会导致res2最后只保留result2的最后一个匹配结果,后续所有res1都和这个最后值对比。
正确实现方式
方法1:转成列表后同步遍历(简单直观)
先把两个迭代器转成保存匹配结果的列表,这样可以随意访问元素,再用zip同步遍历对应位置的元素:
else: # 读取第一个文件并获取所有匹配结果 with open(fle + '.txt') as read1: result1 = re.finditer(regex, read1.read()) matches1 = [m.group() for m in result1] # 读取第二个文件并获取所有匹配结果 with open(infile, "r") as x: result2 = re.finditer(regex, x.read()) matches2 = [m.group() for m in result2] # 同步对比对应位置的匹配项 for idx, (match1, match2) in enumerate(zip(matches1, matches2)): if match1 != match2: print(f"第{idx+1}组匹配不同:{match1} vs {match2}") # 处理两个匹配列表长度不一致的情况 if len(matches1) != len(matches2): print(f"匹配数量不一致:文件1有{len(matches1)}组,文件2有{len(matches2)}组")
方法2:直接遍历迭代器(节省内存,适合大文件)
如果文件很大,转列表占内存,可以用next()手动同步遍历两个迭代器,同时处理迭代器耗尽的情况:
else: with open(fle + '.txt') as read1: result1 = re.finditer(regex, read1.read()) with open(infile, "r") as x: result2 = re.finditer(regex, x.read()) idx = 1 while True: try: res1 = next(result1).group() except StopIteration: res1 = None try: res2 = next(result2).group() except StopIteration: res2 = None if res1 is None and res2 is None: break # 两个迭代器都遍历完了 if res1 != res2: print(f"第{idx}组匹配不同:{res1} vs {res2}") idx += 1
关于文件对比工具(你提到的isdiff应为filecmp)
如果只是想快速判断两个文件内容是否完全一致,直接用filecmp.cmp()更高效:
import filecmp if not filecmp.cmp(fle + '.txt', infile): print("两个文件内容不一致")
但如果是要精准对比正则匹配出的各组内容差异,还是用前面的方法更合适。
内容的提问来源于stack exchange,提问作者hfak
相关产品推荐
相关产品推荐

