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

Python如何提取字符串中的元音组并获取各元音组对应索引

提取字符串连续元音组及对应起始索引

需求说明

  • 从目标字符串中提取所有连续元音构成的元音组,同时记录每个元音组在原字符串中的起始索引
  • 示例:单词britain的元音组为i(起始索引2)、ai(起始索引4),最终输出两个列表,分别存储元音组内容、对应起始位置
  • 可选用正则、itertools.groupby或手写循环实现

原有代码问题

当前编写的循环逻辑存在以下缺陷:

  • 循环范围设置为range(len(first)-1),会遗漏字符串最后一位字符的判断
  • 仅在遇到非元音字符时才会暂存元音组,如果字符串以元音结尾,最后一组元音会丢失
  • 没有记录元音组的起始索引
  • 会将空字符串误加入结果列表

实现方案

方案1:正则表达式实现(最简洁)

使用re.finditer可以直接获取所有匹配的连续元音段,同时直接拿到匹配段的起始位置,不需要手动维护状态:

import re

def extract_vowel_groups(input_str):
    matches = re.finditer(r'[aeiou]+', input_str)
    vowel_groups = []
    start_indexes = []
    for match in matches:
        vowel_groups.append(match.group())
        start_indexes.append(match.start())
    return vowel_groups, start_indexes

# 测试
print(extract_vowel_groups('britain')) # (['i', 'ai'], [2, 4])
print(extract_vowel_groups('phoebe'))  # (['oe', 'e'], [2, 5])

如果需要忽略大小写匹配,给finditer加参数re.IGNORECASE即可。

方案2:itertools.groupby实现

itertools.groupby可以自动将连续满足相同判断条件的字符归为一组,遍历过程中累加索引即可拿到每组的起始位置:

from itertools import groupby

def extract_vowel_groups(input_str):
    vowel_groups = []
    start_indexes = []
    current_pos = 0
    vowel_set = {'a', 'e', 'i', 'o', 'u'}
    for is_vowel, char_iter in groupby(input_str, key=lambda x: x in vowel_set):
        group_content = ''.join(char_iter)
        group_len = len(group_content)
        if is_vowel:
            vowel_groups.append(group_content)
            start_indexes.append(current_pos)
        current_pos += group_len
    return vowel_groups, start_indexes

# 测试
print(extract_vowel_groups('britain')) # (['i', 'ai'], [2, 4])
print(extract_vowel_groups('phoebe'))  # (['oe', 'e'], [2, 5])

方案3:修正手写循环逻辑

如果不想引入额外模块,也可以直接修正原有循环逻辑,补全边界处理和索引记录:

def extract_vowel_groups(input_str):
    vowel_set = {'a', 'e', 'i', 'o', 'u'}
    vowel_groups = []
    start_indexes = []
    temp_group = []
    group_start = None
    for idx, char in enumerate(input_str):
        if char in vowel_set:
            if not temp_group:
                group_start = idx
            temp_group.append(char)
        else:
            if temp_group:
                vowel_groups.append(''.join(temp_group))
                start_indexes.append(group_start)
                temp_group = []
    # 处理字符串以元音结尾的边界情况
    if temp_group:
        vowel_groups.append(''.join(temp_group))
        start_indexes.append(group_start)
    return vowel_groups, start_indexes

# 测试
print(extract_vowel_groups('britain')) # (['i', 'ai'], [2, 4])
print(extract_vowel_groups('phoebe'))  # (['oe', 'e'], [2, 5])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:51:21