如何用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
相关产品推荐
相关产品推荐

