正则表达式(Python)-匹配具有两个或更多不同元音的单词
我正在尝试匹配包含两个或更多不同元音的字符串中的单词。这个问题可以限制为小写 字符串='pool pound papa pick pair pair pair pair pair pair pair pick pair' 预期结果: 磅、小儿麻痹症、双 pool和papa将失败,因为它们只包含一个不同的元音。然而,脊髓灰质炎是好的,因为即使它包含两个“o”,它也包含两个不同的元音(“i”和“o”)。密西西比州将失败,但阿尔伯克基将通过) 思考过程:使用一个lookaround,可能五次(忽略大写),用括号括起来,后面加一个{2}。比如:正则表达式(Python)-匹配具有两个或更多不同元音的单词,python,regex,Python,Regex,我正在尝试匹配包含两个或更多不同元音的字符串中的单词。这个问题可以限制为小写 字符串='pool pound papa pick pair pair pair pair pair pair pair pick pair' 预期结果: 磅、小儿麻痹症、双 pool和papa将失败,因为它们只包含一个不同的元音。然而,脊髓灰质炎是好的,因为即使它包含两个“o”,它也包含两个不同的元音(“i”和“o”)。密西西比州将失败,但阿尔伯克基将通过) 思考过程:使用一个lookaround,可能五次(忽略大写
re.findall(r'\w*((?=a{1})|(?=e{1})|(?=i{1})|(?=o{1})|(?=u{1})){2}\w*', string)
但是,这与所有六个单词都匹配
我杀死了{1},这使它更漂亮(似乎没有必要使用{1}),但它仍然返回所有六个:
re.findall(r'\w*((?=a)|(?=e)|(?=i)|(?=o)|(?=u))\w*', string)
提前感谢您的帮助。我检查了其他的查询,包括,但没有一个看起来足够接近。另外,我正在寻找纯正则表达式。您不需要5个单独的lookahead,这完全是多余的。只需捕获a中的第一个元音,然后使用a断言它与第二个元音不同:
[a-z]*([aeiou])[a-z]*(?!\1)[aeiou][a-z]*
你的\w*((?=a)|(?=e)|(?=i)|(?=o)|(?=u))\w*
正则表达式匹配所有至少有一个元音的单词\w*
匹配0+个单词字符,因此第一个模式将获取整段字母、数字和下划线。然后,开始回溯,正则表达式引擎尝试查找一个位置,该位置后面跟有a
、e
、i
、o
或u
。一旦找到该位置,先前抓取的单词字符将再次被抓取并使用尾随的\w*
要将整个单词与至少两个不同的元音匹配,可以使用
\b(?=\w*([aeiou])\w*(?!\1)[aeiou])\w+
看
详细信息
-单词边界\b
-在当前位置的左侧,需要(?=\w*([aeiou])\w*(?!\1[aeiou])
-0+字字符\w*
-1(其值在模式的后面引用):任何元音([aeiou])
-0+字字符\w*
-来自(?!\1)[aeiou]
集合的任何元音与存储在组1中的元音不相等(如果在当前位置的右侧发现模式匹配,则由于反向前瞻[aeiou]
导致匹配失败)(?!\1)
-1个或多个单词字符\w+