我想把巴西名字分成几个部分。然而,有一些名称,如下面的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
你知道怎么修吗?有没有办法只对“正常”和“特殊”情况使用一种模式?在
使用来自python的^{} 库的
regex.split()
函数,该库提供了附加功能:安装:
用法:
^{pr2}$输出:
(?<!das?|de|dos?)\s+
-lookbehind否定断言(?<!...)
确保空格{https://pypi.python.org/pypi/regex/
您可以在
findall
中与可选组一起使用此正则表达式:在这里,我们将
(?:da|de|do|dos|das)
和1+个空格作为可选。在RegEx Demo
Code Demo
代码示例:
^{pr2}$名称是否总是以“规范”的方式书写,即除了da、de、do,…,每个部分都大写吗。。。?在
在这种情况下,您可以使用这个事实:
做你想做的事情的“正确”方式(除了完全不做),应该是消极的后视:在一个没有任何da、de、do……前面的空间上分裂。遗憾的是,这是不可能的,因为
^{pr2}$re
要求lookbehind的宽度相等。如果音节中没有名字,你真的不能假设,你可以这样做:你可能偶尔也可能会遇到一些不起作用的情况:如果第一个字母是重音字符(或者假设文章中包含一个重音符号),那么它将不匹配。要解决此问题,您将无法使用外部库;^{} 。在
你的新芬德尔会是这样的:
\p{Ll}
表示任何小写字母,\p{Lu}
表示任何大写字母。在相关问题 更多 >
编程相关推荐