我想将巴西名字分成几部分。然而,有如下名称,其中 "de"
、"da"
(和其他名称)不是单独的部分,它们总是与以下单词一起使用。所以正常拆分不起作用。
test1 = "Francisco da Sousa Rodrigues" #special split
test2 = "Emiliano Rodrigo Carrasco" #normal split
test3 = "Alberto de Francia" #special split
test4 = "Bruno Rezende" #normal split
我的预期输出是:
[Francisco, da Sousa, Rodrigues] #1
[Emiliano, Rodrigo, Carrasco] #2
[Alberto, de Francia] #3
[Bruno, Rezende] #4
对于特殊情况,我尝试了这种模式:
PATTERN = re.compile(r"\s(?=[da, de, do, dos, das])")
re.split(PATTERN, test1) (...)
但输出不是我所期望的:
['Francisco', 'da Sousa Rodrigues'] #1
['Alberto', 'de Francia'] #3
知道如何解决吗?有没有办法只对“正常”和“特殊”情况使用一种模式?
最佳答案
名称是否始终以“规范”方式书写,即除 da、de、do、... 之外的每个部分都大写?
在这种情况下,您可以使用该事实:
>>> import re
>>> for t in (test1, test2, test3, test4):
... print(re.findall(r"(?:[a-z]+ )?[A-Z]\w+", t, re.UNICODE))
['Francisco', 'da Sousa', 'Rodrigues']
['Emiliano', 'Rodrigo', 'Carrasco']
['Alberto', 'de Francia']
['Bruno', 'Rezende']
>>>
做你想做的事情的“正确”方式(除了根本不做),将是一个负面的回顾:当在一个没有任何 da、de、do、 ……遗憾的是,这是 (AFAIK) 不可能的,因为 re
要求 lookbehinds 具有相同的宽度。如果音节中没有名字结尾,而您确实无法假设,您可以这样做:
PATTERN = re.compile(r"(?<! da| de| do|dos|das)\s")
您可能偶尔会或可能不会偶然发现不起作用的情况:如果第一个字母是重音字符(或者文章,假设包含一个),它将不正确匹配。要解决此问题,您将无法绕过使用外部库; regex
.
你的新 findall 看起来像这样:
regex.findall(r"(?:\p{Ll}+ )?\p{Lu}\w+", "Luiz Ângelo de Urzêda")
\p{Ll}
指任何小写字母,\p{Lu}
指任何 大写字母。
关于python - 将包含 "de"、 "da"等的名称拆分为第一个、中间的、最后一个等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48383199/