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

Python列表正则替换:适配连字符姓名并保留原始元素

Python姓名与政党信息正则处理优化方案

问题梳理

现有基于re.sub的多轮字符串替换逻辑存在两处缺陷:

  • 删除姓名前缀的正则未适配内部带连字符(-)的姓名,例如David-Christian Eckardt, SPD处理后无法正确移除连字符连接的名段
  • 逐轮替换直接覆盖原列表内容,无法保留原始条目对应的未替换政党版本,最终需要输出同时包含标准化处理结果、原始条目对应处理结果的desired_names列表,列表元素顺序无要求

优化后实现代码

import re

# 原始姓名列表(可替换为实际业务数据)
names = [
    "Dr. David-Christian Eckardt, SPD",
    "Dr. Angela Merkel, CDU",
    "Olaf Scholz, Sozialdemokratische Partei Deutschlands",
    "Robert Habeck, Bündnis 90/Die Grünen",
    "Dr. Marie-Luise Wolff, FDP"
]

# 政党名称标准化映射,key为正则匹配规则,value为标准名称
party_standardize_rules = {
    r"Sozialdemokratische Partei Deutschlands": "SPD",
    r"Christlich Demokratische Union(?: Deutschlands)?": "CDU",
    r"Bündnis 90/Die Grünen": "Grüne",
    r"Freie Demokratische Partei": "FDP"
}

desired_names = []

for raw_item in names:
    # 步骤1:移除开头的Dr.头衔,兼容头衔后多空格场景
    removed_title = re.sub(r"^Dr\.\s+", "", raw_item)
    # 步骤2:移除前缀名,适配带连字符的复合名
    # 正则逻辑:匹配开头所有首字母大写、小写字母组成的名段,支持连字符连接,通过正向预查定位到姓的分隔位置,避免误删
    removed_given_name = re.sub(
        r"^(?:[A-ZÄÖÜ][a-zäöüß]+-?)+(?=\s[A-ZÄÖÜ][a-zäöüß]+,)",
        "",
        removed_title
    ).lstrip()
    # 加入仅做基础清洗、保留原始政党的版本
    desired_names.append(removed_given_name)
    
    # 步骤3:基于清洗后的内容做政党标准化,生成标准化版本
    standard_result = removed_given_name
    for re_pattern, standard_party in party_standardize_rules.items():
        standard_result = re.sub(re_pattern, standard_party, standard_result)
    # 加入标准化后的版本
    desired_names.append(standard_result)

核心优化说明

  • 连字符姓名适配:前缀名匹配正则使用非捕获组兼容连字符连接的复合名,同时加入正向预查逻辑,仅匹配姓之前的名段,不会误删姓氏或后续政党内容,对德语常见的变音字符也做了兼容
  • 原始内容保留:所有替换操作均生成新的字符串变量存储中间结果,不直接覆盖原始列表元素,对每条原始数据分别生成「基础清洗(保留原始政党)」和「全量标准化」两个结果,统一存入最终输出列表
  • 正则兼容性:移除头衔、匹配姓名的规则额外兼容了德语姓名常见的变音字符、多空格场景,适配性更强

内容的提问来源于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 11:48:26