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

Python正则表达式:匹配含两个及以上不同元音的小写单词

Python正则匹配含两个及以上不同元音的小写单词

需求明确

我们的目标是从字符串里筛选出包含两个及以上不同元音(a/e/i/o/u)的小写单词。拿给定的字符串 'pool pound polio papa pick pair' 举例,符合要求的是 pound(含o和u)、polio(含o和i)、pair(含a和i);而pool(只有o)、papa(只有a)这类仅含一种元音的单词要排除,像mississippi(只有i)也不符合,albuquerque(含a、u、e)就完全符合条件。

正则思路解析

要实现这个匹配,核心是确认单词里至少存在两种不同的元音。这里用正向环视来做多重检查就很合适:

  1. 用\b定位单词边界,确保我们匹配的是完整单词,不会抓到单词片段;
  2. 第一个正向环视(?=.*([aeiou])):检查单词里至少存在一个元音,同时把这个元音捕获下来;
  3. 第二个正向环视(?=.*(?!\1)[aeiou]):检查单词里还存在另一个和刚才捕获的元音不同的元音;
  4. 最后用[a-z]+匹配整个小写单词。

组合起来的正则表达式就是:

r'\b(?=.*([aeiou]))(?=.*(?!\1)[aeiou])[a-z]+\b'

代码演示

用Python的re模块就能轻松验证效果:

import re

text = 'pool pound polio papa pick pair mississippi albuquerque'
pattern = r'\b(?=.*([aeiou]))(?=.*(?!\1)[aeiou])[a-z]+\b'
# 用finditer遍历匹配对象,提取完整单词(避免findall返回捕获组内容)
matches = [match.group() for match in re.finditer(pattern, text)]
print(matches)  # 输出: ['pound', 'polio', 'pair', 'albuquerque']

额外说明

  • 为什么polio符合要求?虽然它包含两个o,但同时存在i这个不同的元音,满足“两种及以上不同元音”的核心条件;
  • 如果需要支持大小写混合的场景,只需要加上re.IGNORECASE标志即可,但本次需求明确是小写单词,所以不用额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:20:33