【问题标题】:Python regular expression for consonants and vowels用于辅音和元音的 Python 正则表达式
【发布时间】:2022-04-23 02:54:59
【问题描述】:

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

以下情况应该通过:

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

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

【问题讨论】:

    标签: python regex


    【解决方案1】:

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

    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
    

    【讨论】:

    • @AvinashRaj 我只是在想这个。但是OP没有提到c或v哪个部分是强制性的。所以很难假设:/
    • simple .. 只需在第一次使用前瞻,例如 (?=.*.)
    • @AvinashRaj 那会很好。我想到了在任何组中用+ 替换* 之类的东西。我在答案中的note 中添加了这一点。:)
    【解决方案2】:

    填写代码以检查传递的文本是否包含元音 a、e 和 i,并且两者之间的任何其他字符恰好出现一次。

    import re
    def check_aei (text):
      result = re.search(r"a.e.i", text)
      return result != None
    print(check_aei("academia")) # True
    print(check_aei("aerial")) # False
    print(check_aei("paramedic")) # True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2016-04-22
      • 2021-07-29
      • 2015-03-08
      相关资源
      最近更新 更多