【问题标题】:Regex to split Spanish lastnames in first lastname and second lastname正则表达式将西班牙姓氏拆分为第一个姓氏和第二个姓氏
【发布时间】: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


【解决方案1】:

试试这个:

import re

preposition_lst = ['DE','LO','LA','LAS','DEL','DELS','LES','DO','DA','DOS','DAS']
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"]



def last_name(name):
    case=re.findall(r'\w+',name)
    res=list(filter(lambda x: x not in preposition_lst,case))
    return res

list_final =[]
for case in cases:
    list_final.append(last_name(case))

for i in range(len(list_final)):
    if len(list_final[i])>2:
        name1=' '.join(list_final[i][:2])
        name2=' '.join(list_final[i][2:])
        list_final[i]=[name1,name2]
print(list_final)
#[['BLAS', 'ZAPATA'], ['MATIAS', 'MANO'], ['LOPEZ FERNANDEZ', 'VILLAVERDE'], ['MIGUEL', 'CORRAL'], ['VIDAL', 'PE�A'], ['MONTAVA', 'ARCO'], ['CASAS', 'VALLE']]


【讨论】:

  • 非常感谢!请注意,尽管您的代码在解析其中一种情况时遇到了与 Wiktor 提议相同的问题。名字确实很复杂。
【解决方案2】:

这符合您的要求吗?

import re

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

def split_name(name):
    f1 = re.compile("(.*)({preps}(.+))".format(preps = "(" + " |".join(preposition_lst) + ")"))
    m1 = f1.match(case)

    if m1:
        if len(m1.group(1)) != 0:
            return m1.group(1).strip(), m1.group(2).strip()
        else:
            return " ".join(name.split()[:-1]), name.split()[-1]
    else:
        return " ".join(name.split()[:-1]), name.split()[-1]

for case in cases:
    first, second = split_name(case)
    print("{} --> name 1 = {}, name 2 = {}".format(case, first, second))

# DE BLAS ZAPATA --> name 1 = DE BLAS, name 2 = ZAPATA
# MATIAS DE LA MANO --> name 1 = MATIAS, name 2 = DE LA MANO
# LOPEZ FERNANDEZ DE VILLAVERDE --> name 1 = LOPEZ FERNANDEZ, name 2 = DE VILLAVERDE
# DE MIGUEL DEL CORRAL --> name 1 = DE MIGUEL, name 2 = DEL CORRAL
# VIDAL DE LA PENA SOLIS --> name 1 = VIDAL, name 2 = DE LA PENA SOLIS
# MONTAVA DEL ARCO --> name 1 = MONTAVA, name 2 = DEL ARCO
# DOS CASAS VALLE --> name 1 = DOS CASAS, name 2 = VALLE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多