如何用正则表达式完善Python字符串列表的姓名清理与拆分逻辑
姓名列表正则处理方案
问题背景
需要处理存储姓名的字符串列表,实现两个核心需求:
- 移除连续2个及以上首字母非大写且非指定连接词(del、de el、de)的无效词汇
- 若存在多个首字母大写的有效姓名,拆分为列表独立元素
修正后的完整代码
import re input_names = ["María Sol", "María del Carmen Perez Agüiño", "Melina Saez Sossa", "el de juego es Alex" , "Harry ddeh jsdelasd Maltus ", "Ben White ddesddsh jsdelasd Regina yáshas asdelas Javier Ruben Rojas", "Robert", 'Melina presento el nuevo presupuesto', "presento el nuevo presupuesto, María del Carmén "] # 定义有效连接词,长模式优先避免部分匹配 valid_connectives = r'(?:del|de el|de)' # 正则匹配完整有效姓名块:支持带西班牙语重音的姓名,兼容指定连接词 name_block_pattern = re.compile( rf'(?:[A-ZÁÉÍÓÚÜÑ][a-záéíóúüñ]+(?:\s+{valid_connectives})?\s+)*[A-ZÁÉÍÓÚÜÑ][a-záéíóúüñ]+', re.UNICODE ) result_list = [] for raw_str in input_names: # 清理字符串:移除标点、首尾空格 cleaned_str = re.sub(r'[^\w\sáéíóúüñÁÉÍÓÚÜÑ]', '', raw_str).strip() # 提取所有有效姓名块 valid_name_blocks = name_block_pattern.findall(cleaned_str) # 格式化每个姓名块(去除多余空格)并加入结果列表 for block in valid_name_blocks: formatted_block = re.sub(r'\s+', ' ', block).strip() result_list.append(formatted_block) print(result_list)
关键逻辑说明
正则设计
- 有效连接词用非捕获组定义,将
de el放在de前面,避免把de el拆成两个独立连接词匹配 - 姓名块正则匹配首字母大写(含西班牙语重音大写)的词汇,允许后续跟随「连接词+首字母大写词」的组合,确保完整姓名(如
María del Carmen)被识别为单个有效块
- 有效连接词用非捕获组定义,将
字符串预处理
- 先移除字符串中的标点符号(如逗号),避免干扰正则匹配,同时去除首尾空格简化处理
结果生成
- 用
findall提取所有有效姓名块,自动实现多姓名拆分 - 对每个姓名块做格式清理,替换连续空格为单个空格,保证输出格式统一
- 用
输出验证
运行代码后将得到目标输出:
["María Sol", "María del Carmen Perez Agüiño", "Melina Saez Sossa", "Alex", "Harry", "Maltus", "Ben White", "Regina", "Javier Ruben Rojas", "Robert", "Melina", "María del Carmén"]
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

