我试图创建一个正则表达式,允许任意数量的辅音,或任意数量的元音,或辅音和元音的混合,这样我们在开头只有任意数量的辅音,后跟任意数量的元音只有在元音后不应该允许辅音,从例子中可以更清楚地看出:
以下情况应该通过:
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")
但它正在传递所有情况,我需要一个正确的表达式,它会产生预期的结果。
答案 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