我试图创建一个正则表达式,它允许任意数量的辅音,或任意数量的元音,或辅音和元音的混合,这样我们在开头只有任意数量的辅音,然后只有任意数量的元音,没有元音之后应该允许辅音,从例子中会更清楚:
以下情况应该通过:
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)
但它适用于所有情况,我需要一个正确的表达式来提供所需的结果。
您需要做的就是$在正则表达式的末尾添加另一个锚点
if re.match("[^aeiou]*[aeiou]*$",word):
Run Code Online (Sandbox Code Playgroud)
$在字符串末尾添加正则表达式。在元音之后不允许任何东西笔记
您可以?从正则表达式中删除非贪婪,因为非贪婪对指定的字符类没有任何影响
正则表达式也会匹配空字符串。
字符串中的强制部分可以通过更换指定*用+。例如,如果输入必须包含元音,那么正则表达式必须是
if re.match("[^aeiou]*[aeiou]+$",word):
Run Code Online (Sandbox Code Playgroud)或者您可以使用前瞻检查字符串是否为空,以确保字符串不为空
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)