You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

比对两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:06:03