如何用正则表达式获取「aaaa」中所有可能的重复子串?
解决从"aaaa"提取所有重复子串的问题
首先,你用的正则re.findall(r'(.)\1{1,}')只返回'a'的原因有两点:
- 正则里的捕获组
(.)会让findall返回捕获的单个字符,而非整个匹配的重复子串; - 即使修改为捕获整个匹配,默认正则是贪婪且非重叠的,只会匹配最长的连续序列(比如"aaaa"),无法得到所有重叠的子串。
方法一:遍历生成并筛选(直观易理解)
直接遍历所有可能的子串,筛选出长度≥2且所有字符相同的子串:
s = "aaaa" result = [] str_len = len(s) # 遍历所有起始索引 for start in range(str_len): # 遍历所有结束索引,子串长度至少为2 for end in range(start + 2, str_len + 1): substr = s[start:end] # 检查子串所有字符是否一致 if all(c == substr[0] for c in substr): result.append(substr) # 按长度排序,和期望结果顺序一致 result.sort(key=len) print(result) # 输出:['aa', 'aa', 'aa', 'aaa', 'aaa', 'aaaa']
方法二:正则结合序列拆分(针对连续重复场景)
先找到最长的连续重复字符序列,再拆分出所有符合要求的子串:
import re s = "aaaa" result = [] # 匹配所有连续重复的字符序列(最长匹配) for match in re.finditer(r'(.)\1+', s): char = match.group(1) seq_length = len(match.group()) # 生成该序列中所有长度≥2的子串 for offset in range(seq_length - 1): # 子串长度从2到剩余可用长度 for sub_len in range(2, seq_length - offset + 1): result.append(char * sub_len) result.sort(key=len) print(result) # 输出:['aa', 'aa', 'aa', 'aaa', 'aaa', 'aaaa']
原正则的修正说明
如果只想用正则获取所有非重叠的最长重复子串,可修改为:
re.findall(r'(?:.)\1{1,}', "aaaa") # 输出:['aaaa']
但这依然无法得到重叠的子串,所以需要结合上述方法来获取完整的期望结果。
内容的提问来源于stack exchange,提问作者Chainsaw
相关产品推荐
相关产品推荐

