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
相关产品推荐
相关产品推荐

