Python Regex将西班牙语姓氏拆分为first lastname和second lastname

Python Regex将西班牙语姓氏拆分为first lastname和second lastname,python,python-3.x,regex,Python,Python 3.x,Regex,我的目标是编写一个Python3函数,该函数将lastname作为csv中的行,并将它们正确地拆分为lastname_1和lastname_2 西班牙语名称具有以下结构:firstname+lastname\u 1+lastname\u 2 忘记名字,我想要一个代码,将姓氏分成这两个类别(lastname_1,lastname_2),这是一个挑战 有时姓氏有介词 DE BLAS ZAPATA“DE BLAS”是第一个姓,“ZAPATA”是第二个姓 “MATIAS”是姓1,“DE LA MANO

我的目标是编写一个Python3函数,该函数将lastname作为csv中的行,并将它们正确地拆分为lastname_1和lastname_2

西班牙语名称具有以下结构:
firstname+lastname\u 1+lastname\u 2

忘记名字,我想要一个代码,将姓氏分成这两个类别(lastname_1,lastname_2),这是一个挑战

有时姓氏有介词

  • DE BLAS ZAPATA“DE BLAS”是第一个姓,“ZAPATA”是第二个姓
  • “MATIAS”是姓1,“DE LA MANO”是姓2
  • LOPEZ FERNANDEZ DE VILLAVERDE LOPEZ FERNANDEZ姓1,DE villaverda姓2
  • 米格尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔科拉尔·德尔拉尔·德尔斯纳尔
  • 蒙塔瓦·德尔·阿尔科·蒙塔瓦姓_1德尔·阿尔科姓_2
这个名单可能会一直列下去

我现在陷入困境,我发现了,但我很难理解它背后的主要思想,将其翻译成python 3

import re

preposition_lst = ['DE LO ', 'DE LA ', 'DE LAS ', 'DEL ', 'DELS ', 'DE LES ', 'DO ', 'DA ', 'DOS ', 'DAS', 'DE ']
cases = ["DE BLAS ZAPATA", "MATIAS DE LA MANO", "LOPEZ FERNANDEZ DE VILLAVERDE", "DE MIGUEL DEL CORRAL", "VIDAL DE LA PEÑA", "MONTAVA DEL ARCO", "DOS CASAS VALLE"]

for case in cases:
  for prep in preposition_lst:
    m = re.search(f"(.*)({prep}[A-ZÀ-ÚÄ-Ü]+)", case, re.I) # re.I makes it case insensitive
    try:
      print(m.groups())
      print(prep)
    except:
      pass
试试这个:

重新导入
介词_lst=['DE','LO','LA','LAS','DEL','DELS','LES','DO','DA','DOS','DAS']
案例=[“德布拉斯·扎帕塔”、“马诺之家”、“洛佩斯·费尔南德斯·德维拉维德”、“德米格尔·德尔科拉尔”、“维达尔·德拉佩尼亚”、“蒙塔瓦·德尔阿尔科”、“多斯卡斯瓦勒”]
def姓氏(姓名):
case=re.findall(r'\w+',名称)
res=list(过滤器(lambda x:x不在介词中,大小写))
返回res
列表_final=[]
在下列情况下:
列表\最终。追加(姓氏(大小写))
对于范围内的i(len(列表_最终)):
如果len(列表_最终[i])>2:
name1=''.join(list_final[i][:2])
name2=''.join(list_final[i][2:)
列表\u最终[i]=[name1,name2]
打印(列表\最终版)
#[BLAS]、[ZAPATA]、[MATIAS]、[MANO]、[LOPEZ FERNANDEZ]、[VILLAVERDE]、[MIGUEL]、[CORRAL]、[VIDAL]、[PE]�A']、['MONTAVA'、['ARCO']、['CASAS'、['VALLE']]

这是否符合您的要求

重新导入
介词_lst=['DE LO','DE LA','DE LAS','DE LES','DEL','DELS','DO','DA','DOS','DAS','DE']
案例=[“德布拉斯·扎帕塔”、“马诺之家”、“洛佩斯·费尔南德斯·德维拉维德”、“德米格尔·德尔科拉尔”、“维达尔·德拉佩纳·索利斯”、“蒙塔瓦·德尔阿尔科”、“多斯卡斯瓦勒”]
def split_名称(名称):
f1=re.compile((.*)({preps}(+)”。format(preps=“(“+”|“)。join(介词_lst)+”))
m1=f1.匹配(大小写)
如果m1:
如果len(m1.组(1))!=0:
返回m1.group(1.strip(),m1.group(2.strip())
其他:
返回“.join(name.split()[:-1]),name.split()[-1]
其他:
返回“.join(name.split()[:-1]),name.split()[-1]
在下列情况下:
第一,第二=拆分名称(大小写)
打印(“{}-->名称1={},名称2={}”。格式(大小写,第一个,第二个))
#DE BLAS ZAPATA-->名称1=DE BLAS,名称2=ZAPATA
#马蒂亚斯·德拉马诺-->名称1=马蒂亚斯,名称2=德拉马诺
#LOPEZ FERNANDEZ DE VILLAVERDE-->名称1=LOPEZ FERNANDEZ,名称2=DE VILLAVERDE
#德米格尔·德尔科拉尔-->名称1=德米格尔,名称2=德尔科拉尔
#维达尔·德拉佩纳·索利斯-->名称1=维达尔,名称2=德拉佩纳·索利斯
#蒙塔瓦-德尔阿尔科-->名称1=蒙塔瓦,名称2=德尔阿尔科
#DOS CASAS VALLE-->名称1=DOS CASAS,名称2=VALLE

您链接到的Perl解决方案仅使用
re.search(r'^((?:De | Del | De La | De Los | De Las)?\w+(?:De | Del | De La | De Los | De Las)?\w+)(De(?:De(?:De | Del De | De La | De Los | De Las De Las De Las De Las De Las De La?)\w+,text)
。这不是为你的例子。我不明白的方法,我真的想而不是复制粘贴。。。但是它也不能提供正确的结果……这是你的介词列表,包含在这个正则表达式中:看看如果你被赋予“Lopez Fernandez Zapata”的姓(请原谅你对西班牙语姓氏一无所知),会怎么样?你怎么知道把这两个姓分开?这似乎不是一个简单的问题,一般和编程解决,因为正如tripleee提到的:名称是复杂的。非常感谢!但是请注意,您的代码在解析其中一个案例时遇到了与Wiktor建议相同的问题。名字确实很复杂。