西班牙语含连接词复合人名识别正则表达式优化需求
优化西班牙语复合人名识别正则表达式
原始代码
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)的复合人名很常见,连接词大小写形式不固定,但人名本身需要保留原始大小写。当前正则存在两个核心问题:
- 人名部分错误使用
^锚点,强制匹配字符串开头,无法处理人名前有其他内容的场景 - 连接词未做局部大小写不敏感处理,且原正则无法匹配带西班牙语特殊字符(重音、ñ、ü)的人名
优化方案
修改后的正则说明
调整后的正则解决了上述问题,关键改动点:
- 移除错误的
^锚点,支持人名出现在文本任意位置 - 针对西班牙语人名扩展字符集,包含重音、ñ、ü等特殊字符
- 给连接词部分单独添加
(?i:...)修饰符,实现局部大小写不敏感匹配,不影响人名和其他文本的大小写保留 - 优化人名匹配逻辑,确保只捕获大写开头的合法人名片段
完整优化代码
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
相关产品推荐
相关产品推荐

