辅音和元音的Python正则表达式

辅音和元音的Python正则表达式,python,regex,Python,Regex,我试图创建一个正则表达式,它允许任何数量的辅音,或任何数量的元音,或辅音和元音的混合,这样我们在开始时只有任何数量的辅音,后面只有任何数量的元音,元音之后不允许有辅音,从示例中可以更清楚地看到: 以下情况应通过: TR, EE, TREE, Y, BY. 但以下内容不应通过表达式: TROUBLE, OATS, TREES, IVY, TROUBLES, PRIVATE, OATEN, ORRERY. 因此,通常可以将其可视化为:[C][V] 辅音

我试图创建一个正则表达式,它允许任何数量的辅音,或任何数量的元音,或辅音和元音的混合,这样我们在开始时只有任何数量的辅音,后面只有任何数量的元音,元音之后不允许有辅音,从示例中可以更清楚地看到:

以下情况应通过:

TR,   EE,   TREE,   Y,   BY. 
但以下内容不应通过表达式:

TROUBLE,   OATS,   TREES,   IVY, TROUBLES,   PRIVATE,   OATEN,   ORRERY.
因此,通常可以将其可视化为:
[C][V]

辅音

V元音

[]-其中方括号表示任意存在其内容

我把这段代码写了下来:

import re

def find_m(word):
    if re.match("[^aeiou]*?[aeiou]*?",word):
        print "PASS"
    else:
        print "FAIL"


find_m("tr")
find_m("ee")
find_m("tree")
find_m("y")
find_m("by")
find_m("trouble")
find_m("oats")
find_m("trees")
find_m("ivy")
find_m("aaabbbbaaa")

但是它对所有情况都是通过的,我需要一个正确的表达式来给出所需的结果。

您需要做的就是在regex的末尾添加另一个锚点
$

if re.match("[^aeiou]*[aeiou]*$",word):
  • $
    将正则表达式放在字符串末尾。元音后不允许任何内容

注意

  • 您可以从正则表达式中删除非贪婪的
    ,因为非贪婪对指定的字符类没有任何影响

  • 正则表达式也将匹配空字符串

    • 字符串中的必填部分可以通过将
      *
      替换为
      +
      来指定。例如,如果输入必须包含元音,则正则表达式必须为

      if re.match("[^aeiou]*[aeiou]+$",word):
      
    • 或者,您可以使用先行检查来检查字符串是否为空,以确保字符串不为空

      if re.match("^(?=.+)[^aeiou]*[aeiou]*$",word):
      

测试

$ cat test.py
import re

def find_m(word):
    if re.match("[^aeiou]*[aeiou]*$",word):
        print "PASS"
    else:
        print "FAIL"


find_m("tr")
find_m("ee")
find_m("tree")
find_m("y")
find_m("by")
find_m("trouble")
find_m("oats")
find_m("trees")
find_m("ivy")
find_m("aaabbbbaaa")

$ python test.py 
PASS
PASS
PASS
PASS
PASS
FAIL
FAIL
FAIL
FAIL
FAIL

@阿维纳什拉吉,我只是在想这个。但OP并没有提到c或v部分是强制性的。所以很难假设这很简单。。只需在第一个位置使用前瞻,如
(?=.*)
@AvinashRaj,这样就可以了。我想到了在任何一组中用
+
重新绘制
*
之类的东西。我在回答中的
注释中添加了这一点: