如何拆分含de/da等前缀的巴西人名?正则优化需求
巴西人名拆分:搞定带"de/da"前缀的特殊情况
嘿,我来帮你解决这个巴西人名拆分的问题!你需要处理的核心场景是:当人名里出现de、da、do、dos、das这类前缀时,得把它们和后面的单词合并成一个部分,普通的按空格拆分肯定满足不了需求。先看看你给出的测试用例和预期结果:
测试用例与预期输出
- test1:
"Francisco da Sousa Rodrigues"→ 预期:[Francisco, da Sousa, Rodrigues] - test2:
"Emiliano Rodrigo Carrasco"→ 预期:[Emiliano, Rodrigo, Carrasco] - test3:
"Alberto de Francia"→ 预期:[Alberto, de Francia] - test4:
"Bruno Rezende"→ 预期:[Bruno, Rezende]
你之前尝试的正则问题
你最初写的正则是这样的:
import re PATTERN = re.compile(r"\s(?=[da, de, do, dos, das])") re.split(PATTERN, test1)
但输出不对——test1只拆成了['Francisco', 'da Sousa Rodrigues'],原因很简单:这个正则只匹配了da前面的空格,却没处理da Sousa后面的空格,导致Rodrigues被和前面的内容粘在一起了。
修正方案:用单一正则搞定所有情况
我们换个思路:只拆分那些不需要保留的空格,也就是排除掉de/da等前缀后面的空格。这里有两种写法都能实现,效果完全一致。
写法一:正向否定预查
import re # 匹配空格,但前提是这个空格不是紧跟在de/da/do/dos/das后面的 PATTERN = re.compile(r"\s(?!(?<=de|da|do|dos|das)\s)") # 跑一遍测试用例看看效果 test_cases = [ "Francisco da Sousa Rodrigues", "Emiliano Rodrigo Carrasco", "Alberto de Francia", "Bruno Rezende" ] for idx, name in enumerate(test_cases, 1): split_result = re.split(PATTERN, name) print(f"[{', '.join(split_result)}] #{idx}")
写法二:反向否定预查
这个写法逻辑更直接:匹配那些前面不是de/da等前缀的空格:
PATTERN = re.compile(r"(?<!de|da|do|dos|das)\s")
正则逻辑解释
不管用哪种写法,核心都是:
- 对于普通人名(比如test2、test4):所有空格都会被拆分,得到正常的单词列表
- 对于带前缀的人名:
da/de后面的空格不会被拆分,所以da Sousa、de Francia会被保留成一个元素,同时其他位置的空格正常拆分(比如da Sousa和Rodrigues之间的空格会被拆分)
最终运行结果
[Francisco, da Sousa, Rodrigues] #1 [Emiliano, Rodrigo, Carrasco] #2 [Alberto, de Francia] #3 [Bruno, Rezende] #4
完全符合你的预期!
内容的提问来源于stack exchange,提问作者pawelty
相关产品推荐
相关产品推荐

