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

如何用正则表达式完善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)

关键逻辑说明

  1. 正则设计

    • 有效连接词用非捕获组定义,将de el放在de前面,避免把de el拆成两个独立连接词匹配
    • 姓名块正则匹配首字母大写(含西班牙语重音大写)的词汇,允许后续跟随「连接词+首字母大写词」的组合,确保完整姓名(如María del Carmen)被识别为单个有效块
  2. 字符串预处理

    • 先移除字符串中的标点符号(如逗号),避免干扰正则匹配,同时去除首尾空格简化处理
  3. 结果生成

    • 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:35:30