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
相关产品推荐
相关产品推荐

