You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:55:28