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

如何用正则表达式获取「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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:01:10