【发布时间】:2021-04-27 08:05:57
【问题描述】:
我的目标是编写一个 python 3 函数,它将姓氏作为来自 csv 的行并将它们正确拆分为 lastname_1 和 lastname_2。
西班牙语名称的结构如下:firstname + lastname_1 + lastname_2
忘记名字,我想要一个将姓氏分成这 2 个类别(lastname_1,lastname_2)的代码,哪个是挑战?
有时姓氏有介词。
- DE BLAS ZAPATA “de blas”是第一个姓氏,“Zapata”是第二个姓氏
- MATIAS DE LA MANO “Matias” 是 lastname_1,“de la mano” 是 lastname_2
- LOPEZ FERNANDEZ DE VILLAVERDE Lopez Fernandez is lastname_1, de villaverda lastname_2
- DE MIGUEL DEL CORRAL De Miguel 是 lastname_1,del corral lastname_2 更多:VIDAL DE LA PEÑA SOLIS Vidal 是 surtname_1,de la pena solis surname_2
- MONTAVA DEL ARCO 蒙塔瓦是 surname_1 Del Arco surname_2
这个列表可以继续下去。
我目前卡住了,我找到了this code in perl,但我很难理解其背后的主要思想,以便将其翻译成 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
【问题讨论】:
-
您链接到的 Perl 解决方案仅使用
re.search(r'^((?:De |Del |De La |De Los |De Las )?\w+)( (?:De |Del |De La |De Los |De Las )?\w+)?( de (?:De |Del |De La |De Los |De Las )?\w+)?$', text)验证名称。你的例子不是quite working。 -
我不明白我真正想要的方法,而不是复制粘贴......但它也没有提供正确的结果......
-
这是您的介词列表并入该正则表达式:regex101.com/r/3LBu5L/2
-
如果给你一个姓氏“Lopez Fernandez Zapata”(请原谅这里对西班牙姓氏的无知)怎么办?你怎么知道在哪里分开两个姓氏?这似乎不是一个容易以一般程序和编程方式解决的问题,因为正如 Tripleee 所提到的:名称很复杂。
标签: python python-3.x regex