比对两个txt文件查找匹配全名 Python代码输出异常问题求助
故障原因排查
- 核心触发原因:
re.split处理names.txt时生成了空字符串元素。如果names.txt末尾存在换行、或者文件内有连续空白字符,分割后的结果会包含空串'',而'' in 任意字符串的判断结果永远为True,导致所有行都被判定命中,全部写入hits.txt。 - 逻辑缺陷1:当前匹配逻辑是子串模糊匹配,不符合全名匹配要求。比如names.txt里收录了
"王",行内出现"老王"也会被误判命中,不会校验是否是独立完整的全名。 - 逻辑缺陷2:未处理格式兼容问题,比如中英文大小写、全半角符号差异,可能出现漏匹配。
修复后的实现方案
以下代码同时实现「命中行写入hits.txt」和「提取对应姓氏存入变量」两个需求:
import re with open('names.txt', encoding='utf-8') as fh: # 分割后过滤空字符串,彻底解决空串误匹配问题 name_list = [name.strip() for name in re.split(r'[ \n\r]+', fh.read()) if name.strip()] # 编译正则做完整全名匹配,避免子串误判 name_pattern = re.compile(r'(?<!\w)(?:{})(?!\w)'.format('|'.join(re.escape(name) for name in name_list))) # 存储所有命中的姓氏,自动去重 hit_surnames = set() with open('solid_text.txt', encoding='utf-8') as file_in, \ open('hits.txt', 'w', encoding='utf-8') as file_out: for line in file_in: match_res = name_pattern.search(line) if match_res: # 写入命中的行 file_out.write(line) # 提取姓氏,默认按单字姓取首字符,复姓场景可自行扩展复姓匹配逻辑 full_name = match_res.group() surname = full_name[0] hit_surnames.add(surname) # 可直接使用hit_surnames变量做后续处理 print("命中姓氏列表:", list(hit_surnames))
注意事项
如果names.txt中包含复姓(欧阳、上官等),可提前维护复姓白名单,提取姓氏时优先匹配复姓再做截取即可。
内容的提问来源于stack exchange,提问作者dim0ntei
相关产品推荐
相关产品推荐

