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

