Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式(Python)-匹配具有两个或更多不同元音的单词_Python_Regex - Fatal编程技术网

正则表达式(Python)-匹配具有两个或更多不同元音的单词

正则表达式(Python)-匹配具有两个或更多不同元音的单词,python,regex,Python,Regex,我正在尝试匹配包含两个或更多不同元音的字符串中的单词。这个问题可以限制为小写 字符串='pool pound papa pick pair pair pair pair pair pair pair pick pair' 预期结果: 磅、小儿麻痹症、双 pool和papa将失败,因为它们只包含一个不同的元音。然而,脊髓灰质炎是好的,因为即使它包含两个“o”,它也包含两个不同的元音(“i”和“o”)。密西西比州将失败,但阿尔伯克基将通过) 思考过程:使用一个lookaround,可能五次(忽略大写

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

字符串='pool pound papa pick pair pair pair pair pair pair pair pick pair'

预期结果:

磅、小儿麻痹症、双

pool和papa将失败,因为它们只包含一个不同的元音。然而,脊髓灰质炎是好的,因为即使它包含两个“o”,它也包含两个不同的元音(“i”和“o”)。密西西比州将失败,但阿尔伯克基将通过)

思考过程:使用一个lookaround,可能五次(忽略大写),用括号括起来,后面加一个{2}。比如:

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])
    -在当前位置的左侧,需要
    • \w*
      -0+字字符
    • ([aeiou])
      -1(其值在模式的后面引用):任何元音
    • \w*
      -0+字字符
    • (?!\1)[aeiou]
      -来自
      [aeiou]
      集合的任何元音与存储在组1中的元音不相等(如果在当前位置的右侧发现模式匹配,则由于反向前瞻
      (?!\1)
      导致匹配失败)
  • \w+
    -1个或多个单词字符

“这些{1}似乎没有必要”表示您不太清楚它的作用。括号使事情变得不清楚,但我不认为你可以重复两次前瞻-如果语法允许的话(显然是这样的,否则你会出错),那么它会测试相同的前瞻两次。太好了,谢谢。这似乎是“捕捉群体”,而那个时髦的小“\1”将是我下一个研究重点。再次感谢!