python - 将包含 "de"、 "da"等的名称拆分为第一个、中间的、最后一个等

标签 python regex python-3.x

我想将巴西名字分成几部分。然而,有如下名称,其中 "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/

相关文章:

python - 这个 python 正则表达式是什么意思 "([\w\/%]*)"

python - 如何使用 for 循环遍历编号变量?

python - 在AI Platform (CMLE)上使用tensorflow_dataset库

regex - 我们如何匹配 a^n b^n?

java - 在Java代码中搜索某个字符串并替换它

python - 当函数需要类属性时覆盖Python中的绑定(bind)方法

python - 将子列表放置到其他子列表中

python - 如何通过给出多个元组来获取一个 django 查询集

python - 在执行许多 I/O 绑定(bind)操作时如何在 Python 中最大化性能?

python - 将配置模式添加到 Plotly.Py 离线 - 模式栏