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

如何使用正则表达式提取包含全部元音的所有可能子串?

提取包含全部元音的所有连续子串

问题分析

你原来的正则表达式无法得到预期结果,核心问题在于:

  • 正向预查只能定位满足条件的起始位置,无法枚举所有符合要求的子串范围
  • [ \w]*?的非贪婪匹配会过早终止,覆盖不全所有有效子串

可行实现方案

直接用正则很难高效枚举所有符合要求的连续子串,更可靠的方式是遍历所有可能的子串起始/结束索引,检查是否包含全部5个元音:

def find_all_vowel_substrings(text):
    vowels = {'a', 'e', 'i', 'o', 'u'}
    substrings = set()  # 用集合自动去重
    text_len = len(text)
    
    # 遍历所有子串起始位置
    for start_idx in range(text_len):
        collected_vowels = set()
        # 从起始位置逐步扩展子串结束位置
        for end_idx in range(start_idx, text_len):
            current_char = text[end_idx].lower()
            if current_char in vowels:
                collected_vowels.add(current_char)
            
            # 当收集到全部元音时,记录当前子串及所有更长的同起始子串
            if collected_vowels == vowels:
                substrings.add(text[start_idx:end_idx+1])
                # 继续扩展到字符串末尾,收集所有更长的有效子串
                for extended_end in range(end_idx+1, text_len):
                    substrings.add(text[start_idx:extended_end+1])
                break  # 该起始位置的所有有效子串已收集,跳过后续循环
    
    return sorted(substrings)  # 排序后返回结果

text = "thisisabeautifulsequencofwords"
result = find_all_vowel_substrings(text)
print(result)

代码说明

  • 用集合vowels存储目标元音,实现O(1)的字符判断效率
  • 外层循环遍历每个可能的子串起始点,内层循环逐步扩展子串长度
  • 一旦子串包含全部元音,立即记录当前子串及所有更长的同起始子串,避免重复遍历
  • 集合自动去重,避免生成重复的子串
  • 最终返回排序后的结果,方便查看和对比

如果一定要用正则实现,需要枚举所有起始位置并匹配最长有效子串后拆分,但这种方式效率低且逻辑复杂,不如上述遍历方法直观可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:21:02