如何使用正则表达式提取包含全部元音的所有可能子串?
提取包含全部元音的所有连续子串
问题分析
你原来的正则表达式无法得到预期结果,核心问题在于:
- 正向预查只能定位满足条件的起始位置,无法枚举所有符合要求的子串范围
[ \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
相关产品推荐
相关产品推荐

