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

Zda*_*daR 2 python regex

我试图创建一个正则表达式,它允许任意数量的辅音,或任意数量的元音,或辅音和元音的混合,这样我们在开头只有任意数量的辅音,然后只有任意数量的元音,没有元音之后应该允许辅音,从例子中会更清楚:

以下情况应该通过:

TR,   EE,   TREE,   Y,   BY. 
Run Code Online (Sandbox Code Playgroud)

但以下不应通过表达式:

TROUBLE,   OATS,   TREES,   IVY, TROUBLES,   PRIVATE,   OATEN,   ORRERY.
Run Code Online (Sandbox Code Playgroud)

所以通常它可以被形象化为: [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")
Run Code Online (Sandbox Code Playgroud)

但它适用于所有情况,我需要一个正确的表达式来提供所需的结果。

nu1*_*73R 5

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

if re.match("[^aeiou]*[aeiou]*$",word):
Run Code Online (Sandbox Code Playgroud)
  • $在字符串末尾添加正则表达式。在元音之后不允许任何东西

笔记

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

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


测试

$ 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
Run Code Online (Sandbox Code Playgroud)