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

时间:2014-12-13 15:54:07

标签: python regex

我试图创建一个正则表达式,允许任意数量的辅音,或任意数量的元音,或辅音和元音的混合,这样我们在开头只有任意数量的辅音,后跟任意数量的元音只有在元音后不应该允许辅音,从例子中可以更清楚地看出:

以下情况应该通过:

TR,   EE,   TREE,   Y,   BY. 

但以下内容不应传递表达式:

TROUBLE,   OATS,   TREES,   IVY, TROUBLES,   PRIVATE,   OATEN,   ORRERY.

因此通常可以将其显示为:[C] [V]

C - 辅音

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")

但它正在传递所有情况,我需要一个正确的表达式,它会产生预期的结果。

1 个答案:

答案 0 :(得分:4)

您需要做的就是在正则表达式的末尾添加另一个锚$

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