Regex(Python)将单词与两个或多个不同的元音匹配

2024-04-26 12:19:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图匹配字符串中包含两个或多个不同元音的单词。这个问题可以限制为小写。在

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",但似乎没有一个足够接近。另外,我在找纯正则表达式。在


Tags: 字符串string过程单词pool小写元音pair
2条回答

你不需要5个单独的头像,那就太过分了。只需捕获capture group中的第一个元音,然后使用negative lookahead来断言它与第二个元音不同:

[a-z]*([aeiou])[a-z]*(?!\1)[aeiou][a-z]*

See the online demo.

您的\w*((?=a)|(?=e)|(?=i)|(?=o)|(?=u))\w*正则表达式匹配至少有1个任意元音的所有单词。\w*匹配0+个单词的字符,因此第一个模式获取整个字母、数字和下划线。然后,回溯开始,regex引擎尝试查找后面跟有aeio、或{}的位置。一旦找到该位置,先前抓取的单词字符将再次被抓取并与尾随的\w*一起使用。在

要使整个单词与至少两个不同的元音匹配,可以使用

\b(?=\w*([aeiou])\w*(?!\1)[aeiou])\w+

参见regex demo。在

详细信息

  • \b-单词边界
  • (?=\w*([aeiou])\w*(?!\1)[aeiou])-apositive lookahead,在当前位置的左边,需要
    • \w*-0+字字符
    • ([aeiou])-Capturing group1(它的值在模式后面用^{} backreference引用):任何元音
    • \w*-0+字字符
    • (?!\1)[aeiou]-来自[aeiou]集中的任何不等于存储在组1中的元音的元音(由于负lookahead (?!\1)如果在当前位置的右侧发现lookahead模式匹配,则匹配失败)
  • \w+-1个或多个单词字符。在

相关问题 更多 >