我试图匹配字符串中包含两个或多个不同元音的单词。这个问题可以限制为小写。在
string = 'pool pound polio papa pick pair'
预期结果:
pound, polio, pair
pool和papa会失败,因为它们只包含一个不同的元音。然而,脊髓灰质炎是好的,因为即使它包含两个“o”,它也包含两个不同的元音(“i”和“o”)。密西西比会失败,但阿尔伯克基会通过)。在
思考过程:使用lookaround,也许5次(忽略大写),用括号括起来,后面加{2}。比如:
re.findall(r'\w*((?=a{1})|(?=e{1})|(?=i{1})|(?=o{1})|(?=u{1})){2}\w*', string)
但是,这六个词都匹配。在
我删除了{1}s,这使它更漂亮(似乎不需要使用{1}),但它仍然返回所有六个:
^{pr2}$提前感谢您的帮助。我检查了其他查询,包括"How to find words with two vowels",但似乎没有一个足够接近。另外,我在找纯正则表达式。在
你不需要5个单独的头像,那就太过分了。只需捕获capture group中的第一个元音,然后使用negative lookahead来断言它与第二个元音不同:
See the online demo.
您的}的位置。一旦找到该位置,先前抓取的单词字符将再次被抓取并与尾随的
\w*((?=a)|(?=e)|(?=i)|(?=o)|(?=u))\w*
正则表达式匹配至少有1个任意元音的所有单词。\w*
匹配0+个单词的字符,因此第一个模式获取整个字母、数字和下划线。然后,回溯开始,regex引擎尝试查找后面跟有a
、e
、i
、o
、或{\w*
一起使用。在要使整个单词与至少两个不同的元音匹配,可以使用
参见regex demo。在
详细信息
\b
-单词边界(?=\w*([aeiou])\w*(?!\1)[aeiou])
-apositive lookahead,在当前位置的左边,需要\w*
-0+字字符([aeiou])
-Capturing group1(它的值在模式后面用^{\w*
-0+字字符(?!\1)[aeiou]
-来自[aeiou]
集中的任何不等于存储在组1中的元音的元音(由于负lookahead(?!\1)
如果在当前位置的右侧发现lookahead模式匹配,则匹配失败)\w+
-1个或多个单词字符。在相关问题 更多 >
编程相关推荐