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

Python中re.findall()无法返回全部非起始三元组的原因咨询

为什么你的正则只匹配到一个中间三元组?

嘿,我来帮你拆解下这个问题~你的正则没匹配到working on the 主要有两个关键原因:

1. 正则匹配的“字符消耗”特性

正则引擎在匹配时会消耗掉已经匹配到的字符,不会回头重复使用。你的正则"\s+[a-z]+\s[a-z]+\s[a-z]+\s+"第一次匹配到' was working on '的时候,已经把on后面的那个空格用末尾的\s+吃掉了。而working on the 需要从working前面的空格开始匹配,但那个空格已经被之前的匹配消耗掉了,所以引擎找不到下一个符合条件的片段。

2. 大小写匹配的局限性

你的正则用了[a-z],只能匹配小写字母,不过原句里中间的单词都是小写,这个不是本次问题的核心,但如果后续遇到有大写的中间单词,也会匹配失败,建议改成[a-zA-Z]来兼容大小写。

更可靠的解决方案

其实用正则处理这种单词级的三元组不是最优选择,直接拆分单词后生成三元组更清晰直观:

s = "He was working on the table"
words = s.split()
# 从第2个单词(索引1)开始,生成连续的三个单词组合
middle_trigrams = [' '.join(words[i:i+3]) for i in range(1, len(words)-2 + 1)]
print(middle_trigrams)
# 输出: ['was working on', 'working on the']

如果一定要用正则,可以用正向先行断言来避免消耗空格,让引擎可以重复利用空格位置:

import re
s = "He was working on the table"
# 用(?=\s)保证后面有空格但不消耗,捕获中间三个单词
middle_trigram_list = re.findall(r"\s([a-zA-Z]+\s[a-zA-Z]+\s[a-zA-Z]+)(?=\s)", s)
print(middle_trigram_list)
# 输出: ['was working on', 'working on the']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:22:55