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

Python正则按姓名列表分割文本 空结果/匹配异常排查

问题根因排查

三类异常的触发原因可逐一明确:

  • 实际数据集返回空列表:初始正则未适配议会议事录的文本特征:一是文本中大量存在不间断空格\xa0、换行符、制表符等特殊空白,初始正则硬编码半角空格作为头衔和姓名的分隔符,遇到特殊空白直接匹配失效;二是拼接正则时未对姓名做特殊字符转义,姓名中带点、连字符、变音符号时匹配逻辑直接失效;三是错误将所有分组改为非捕获组——re.split仅会将捕获组匹配到的内容保留在返回结果中,全非捕获组配置下,匹配到的姓名不会出现在split结果里,后续遍历取值逻辑直接错位,最终返回空列表。
  • rstrip方法对象输出:属于语法笔误,代码中写为rstrip(方法引用)而非rstrip()(方法调用),返回值是字符串类的内置方法对象本身,而非执行去空格逻辑后的字符串。
  • 短匹配仅命中政党名片段:核心是正则匹配优先级未做控制:拼接姓名正则时未按字符串长度倒序排列,正则默认优先匹配位置靠前的短字符串,当names列表中同时存在"CDU""SPD"这类短政党名和包含政党名的完整姓名时,短字符串会被优先命中,直接截断匹配流程;同时未给匹配规则加单词边界\b,会出现匹配姓名中部分字符的误判。
修正方案

按以下逻辑调整代码即可覆盖所有场景:

  1. 预处理规则阶段先对所有姓名做正则转义,再按字符串长度倒序排序,强制长姓名优先匹配,解决短片段抢先命中的问题;头衔部分使用非捕获组匹配,仅对姓名部分做捕获,既兼容可选头衔场景,又能保证split结果中仅返回需要的姓名内容。
  2. 正则中用\s+匹配头衔与姓名之间的间隔,兼容各类特殊空白字符;给整体匹配规则加单词边界,避免部分字符误匹配。
  3. 修正rstrip调用语法,遍历split结果时跳过第一个姓名出现前的前置文本,按步长2取匹配到的姓名和对应后续片段,过滤空匹配项。

可直接复用的修正代码如下:

import re

def split_text_by_names(text: str, names: list, titles: list = None) -> list[list[str]]:
    # 默认兼容常见头衔,可根据数据集自行扩展
    if titles is None:
        titles = ["Mr.", "Mrs.", "Ms.", "Dr.", "Prof.", "Sen.", "Rep."]
    # 预处理姓名:转义正则特殊字符、去空值、按长度倒序排优先级
    processed_names = sorted(
        [re.escape(name.strip()) for name in names if name.strip()],
        key=lambda x: len(x),
        reverse=True
    )
    # 构建正则:头衔部分非捕获、姓名部分捕获,加单词边界避免部分匹配
    title_pattern = rf"(?:{'|'.join(re.escape(t) for t in titles)})\s+"
    name_pattern = "|".join(processed_names)
    full_pattern = rf"\b(?:{title_pattern})?({name_pattern})\b"
    # 分割时加flags兼容大小写、Unicode变音字符(如德语姓名中的变音符号)
    split_res = re.split(full_pattern, text, flags=re.IGNORECASE | re.UNICODE)
    # 组装结果
    result = []
    # 索引0是第一个姓名前的前置文本,直接跳过,步长2遍历匹配到的姓名和后续文本
    for i in range(1, len(split_res), 2):
        matched_name = split_res[i].strip()
        follow_text = split_res[i+1].rstrip() # 必须加()执行方法
        if matched_name:
            result.append([matched_name, follow_text])
    return result
数据集适配提示
  • 处理议会议事录类正式文本前,可先统一替换文本中的不间断空格\xa0、软分页符等特殊字符为普通空格,进一步降低匹配失败概率。
  • 若姓名列表中同时包含政党名和完整议员姓名,可单独给政党名加匹配限定(如必须前缀为“隶属”“代表”等身份引导词才触发匹配),进一步减少误判。

内容的提问来源于stack exchange,提问作者id345678

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:36:25