paw*_*lty 16 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
Run Code Online (Sandbox Code Playgroud)
我的预期输出是:
[Francisco, da Sousa, Rodrigues] #1
[Emiliano, Rodrigo, Carrasco] #2
[Alberto, de Francia] #3
[Bruno, Rezende] #4
Run Code Online (Sandbox Code Playgroud)
对于特殊情况,我尝试了这种模式:
PATTERN = re.compile(r"\s(?=[da, de, do, dos, das])")
re.split(PATTERN, test1) (...)
Run Code Online (Sandbox Code Playgroud)
但输出不是我的预期:
['Francisco', 'da Sousa Rodrigues'] #1
['Alberto', 'de Francia'] #3
Run Code Online (Sandbox Code Playgroud)
知道怎么解决吗?有没有办法只使用一种模式"正常"和"特殊"情况?
名称是否总是以"规范"的方式编写,即除了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']
>>>
Run Code Online (Sandbox Code Playgroud)
做你想做的事情的"正确"方式(除了根本不做),将是一个负面的看法:在没有任何da,de,do,...之前的空间上分裂. .可悲的是,这是(AFAIK)不可能的,因为re
要求后视镜具有相同的宽度.如果没有名字以音节结尾,你真的不能假设,你可以这样做:
PATTERN = re.compile(r"(?<! da| de| do|dos|das)\s")
Run Code Online (Sandbox Code Playgroud)
您可能偶尔会偶然发现不起作用的案件:如果第一个字母是重音字符(或者文章,假设包含一个),它将不正确地匹配.要解决这个问题,你不会使用外部库; regex
.
您的新findall将如下所示:
regex.findall(r"(?:\p{Ll}+ )?\p{Lu}\w+", "Luiz Ângelo de Urzêda")
Run Code Online (Sandbox Code Playgroud)
该\p{Ll}
指任何小写字母,并\p{Lu}
以任何大写字母.
归档时间: |
|
查看次数: |
1343 次 |
最近记录: |