正则表达式无法匹配所有首尾为元音的子串问题咨询
问题原因分析
你的正则表达式(?=([aeiouAEIOU].*[aeiouAEIOU]))里的.*是贪婪匹配模式,它会尽可能匹配最长的字符序列。也就是说,当正则从某个元音字符开始匹配时,.*会直接跳过中间所有字符,一直匹配到字符串里最后一个元音才停止,所以只会捕获从当前元音到末尾最后一个元音的最长子串,完全不会考虑中间那些以更早元音结尾的短子串。
比如在"uio"这段内容里,当正则定位到开头的"u"时,.*会直接匹配到后面"auu"里的最后一个"u",最终捕获的是"uiodevauu",而不会停下来匹配"ui"或者"uio"这类中间的短子串。
修正方案
把贪婪匹配的.*改成非贪婪匹配的.*?,让正则在找到第一个后续元音时就停止匹配,这样就能捕获所有从当前元音到每一个后续元音的子串。修正后的代码如下:
import re def get_all_vowel_substring(s): # 用非贪婪匹配的.*?替代贪婪的.* pattern = r'(?=([aeiouAEIOU].*?[aeiouAEIOU]))' matches = re.findall(pattern, s) print(matches) input_str = "asdbuiodevauufgh" get_all_vowel_substring(input_str)
运行这段代码后,就能得到包含"uio"、"ui"、"io"、"odevauu"等所有符合要求的子串了。
另外注意,你的代码里函数定义是get_all_vowel_substring,但调用的是get_longest_vowel_substring,这是个笔误,记得修正。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

