将包含“de”、“da”等的名称拆分为名字、中间名、姓氏,

2024-09-27 21:33:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把巴西名字分成几个部分。然而,有一些名称,如下面的where "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

我的预期产出是:

^{pr2}$

对于特殊情况,我尝试了这种模式:

PATTERN = re.compile(r"\s(?=[da, de, do, dos, das])")
re.split(PATTERN, test1) (...)

但产出并不是我所期望的:

['Francisco', 'da Sousa Rodrigues'] #1
['Alberto', 'de Francia'] #3

你知道怎么修吗?有没有办法只对“正常”和“特殊”情况使用一种模式?在


Tags: 名称模式情况dedapatternsplitspecial
3条回答

使用来自python的^{}库的regex.split()函数,该库提供了附加功能:

安装:

pip install regex

用法:

^{pr2}$

输出:

['Francisco', 'da Sousa', 'Rodrigues']
['Emiliano', 'Rodrigo', 'Carrasco']
['Alberto', 'de Francia']
['Bruno', 'Rezende']

  • (?<!das?|de|dos?)\s+-lookbehind否定断言(?<!...)确保空格{}前面没有特殊情况{}

https://pypi.python.org/pypi/regex/

您可以在findall中与可选组一起使用此正则表达式:

(?:(?:da|de|do|dos|das)\s+)?\S+

在这里,我们将(?:da|de|do|dos|das)和1+个空格作为可选。在

RegEx Demo

Code Demo

代码示例:

^{pr2}$

名称是否总是以“规范”的方式书写,即除了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……前面的空间上分裂。遗憾的是,这是不可能的,因为re要求lookbehind的宽度相等。如果音节中没有名字,你真的不能假设,你可以这样做:

^{pr2}$

你可能偶尔也可能会遇到一些不起作用的情况:如果第一个字母是重音字符(或者假设文章中包含一个重音符号),那么它将不匹配。要解决此问题,您将无法使用外部库;^{}。在

你的新芬德尔会是这样的:

regex.findall(r"(?:\p{Ll}+ )?\p{Lu}\w+", "Luiz Ângelo de Urzêda")

\p{Ll}表示任何小写字母,\p{Lu}表示任何大写字母。在

相关问题 更多 >

    热门问题