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

西班牙语含连接词复合人名识别正则表达式优化需求

优化西班牙语复合人名识别正则表达式

原始代码

import re

def register_new_persons_names_to_identify_in_inputs(input_text):

    #Cases of compound human names:
    name_capture_pattern = r"(^[A-Z](?:\w+)\s*(?:del|de\s*el|de)\s*^[A-Z](?:\w+))?"
    regex_pattern = name_capture_pattern + r"\s*(?i:se\s*trata\s*de\s*un\s*nombre|(?:ser[íi]a|es)\s*un\s*nombre)"

    n0 = re.search(regex_pattern, input_text) #distingue entre mayusculas y minusculas

    if n0:
        word, = n0.groups()
        if(word == None or word == "" or word == " "): print("I think there was a problem, and although I thought you were giving me a name, I couldn't interpret it!")
        else: print(repr(word))


input_text = "Creo que María del Pilar se trata de un nombre"   #example 1
input_text = "Estoy segura que María dEl Pilar se tRatA De uN nOmbre"   #example 2
input_text = "María del Carmen es un nombre viejo"    #example 2

register_new_persons_names_to_identify_in_inputs(input_text)

问题分析

在西班牙语中,含连接词(如del、de el)的复合人名很常见,连接词大小写形式不固定,但人名本身需要保留原始大小写。当前正则存在两个核心问题:

  • 人名部分错误使用^锚点,强制匹配字符串开头,无法处理人名前有其他内容的场景
  • 连接词未做局部大小写不敏感处理,且原正则无法匹配带西班牙语特殊字符(重音、ñ、ü)的人名

优化方案

修改后的正则说明

调整后的正则解决了上述问题,关键改动点:

  1. 移除错误的^锚点,支持人名出现在文本任意位置
  2. 针对西班牙语人名扩展字符集,包含重音、ñ、ü等特殊字符
  3. 给连接词部分单独添加(?i:...)修饰符,实现局部大小写不敏感匹配,不影响人名和其他文本的大小写保留
  4. 优化人名匹配逻辑,确保只捕获大写开头的合法人名片段

完整优化代码

import re

def register_new_persons_names_to_identify_in_inputs(input_text):
    # 匹配西班牙语复合人名:大写开头的名字 + 不区分大小写的连接词 + 大写开头的名字
    name_capture_pattern = r"([A-ZÑÁÉÍÓÚÜ][a-zñáéíóúü]+(?:\s+(?i:del|de\s*el|de))\s+[A-ZÑÁÉÍÓÚÜ][a-zñáéíóúü]+)"
    # 后续描述部分不区分大小写匹配
    regex_pattern = name_capture_pattern + r"\s*(?i:se\s*trata\s*de\s*un\s*nombre|(?:ser[íi]a|es)\s*un\s*nombre)"

    n0 = re.search(regex_pattern, input_text)

    if n0:
        word, = n0.groups()
        if not word or word.strip() == "":
            print("I think there was a problem, and although I thought you were giving me a name, I couldn't interpret it!")
        else:
            print(repr(word))

# 测试示例
input_text = "Creo que María del Pilar se trata de un nombre"   # 示例1
register_new_persons_names_to_identify_in_inputs(input_text)

input_text = "Estoy segura que María dEl Pilar se tRatA De uN nOmbre"   # 示例2
register_new_persons_names_to_identify_in_inputs(input_text)

input_text = "María del Carmen es un nombre viejo"    # 示例3
register_new_persons_names_to_identify_in_inputs(input_text)

运行结果

'María del Pilar'    # 示例1
'María del Pilar'    # 示例2
'María del Carmen'   # 示例3

内容的提问来源于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 22:30:29