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

如何用Python re.findall匹配含撇号的大写开头单词?

解决Python re.findall匹配含撇号的大写开头单词问题

我来帮你搞定这个正则表达式的问题!你的需求是匹配所有大写开头、可能包含撇号(比如Let's、Won't)的单词,当前的正则没能覆盖带撇号的部分,还意外匹配了空格,我们来一步步修正它。

问题拆解

你的原字符串是:

"Let's write RegEx! Won't that be fun? I sure think so. Can you find 4 sentences? Or perhaps, all 19 words?"

当前正则((?:[A-Z][a-z]+ ?)+)的问题在于:

  • 它只匹配大写字母开头+连续小写字母的序列,撇号和后面的s/t不在匹配范围内,所以Let's只会被截成Let
  • 末尾的?用来匹配空格,导致结果里出现Can 、Or 这种带空格的内容,这显然不是你想要的单词本身。

修正后的正则与代码

我们调整正则来兼容带撇号的情况,同时精准匹配单词:

import re

my_string = "Let's write RegEx! Won't that be fun? I sure think so. Can you find 4 sentences? Or perhaps, all 19 words?"
# 修正后的正则表达式
capitalized_words_pattern = r"[A-Z][a-z]*(?:['’][a-z]+)?"
capitalized_words = re.findall(capitalized_words_pattern, my_string)
print(capitalized_words)

运行这段代码,你会得到结果:
["Let's", 'RegEx', "Won't", 'I', 'Can', 'Or']

正则各部分解释

让我们拆解一下这个正则的逻辑:

  • [A-Z]:强制匹配单词开头的大写字母,确保符合“大写开头”的要求
  • [a-z]*:匹配0个或多个小写字母,既可以处理RegEx里的eg,也能兼容I这种单个大写字母的单词
  • (?:['’][a-z]+)?:这是一个非捕获可选组:
    • ['’]:匹配普通单引号或智能撇号(覆盖常见的撇号格式)
    • [a-z]+:匹配撇号后的小写字母(比如s、t)
    • ?:表示整个组是可选的,所以既匹配带撇号的单词,也匹配不带的正常单词

额外说明

如果你的场景里不需要匹配单个大写字母(比如I),可以把[a-z]*改成[a-z]+,这样就只会匹配大写开头+至少一个小写字母(可选带撇号)的单词,结果就会是["Let's", 'RegEx', "Won't", 'Can', 'Or'],更贴近你给出的期望结果。

内容的提问来源于stack exchange,提问作者BrightHalo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:45:39