2017-05-23 36 views
0

我正在试图制作一个匹配3个或更多元音字符串的正则表达式。3个或更多元音的正则表达式字符串

我已经试过这一个:

[AEIOU] {3}

但当元音序列中它仅适用。有小费吗 ?

例如:

  1. 塞缪尔 - >有效
  2. 琼 - >无效
  3. 溶胶曼努埃尔 - >有效
  4. 溶胶 - >无效
+0

三个或更多不同的元音或相同? – Rahul

+0

不要紧,如果他们是不同的或相同的 –

+0

@Green_Sam,张贴一些有效和无效的例子 – RomanPerekhrest

回答

1

有几种方法可以做到这一点,在这种情况下保持它的简单的将可能是最有帮助的未来开发者维护该代码。对于正则表达式来说,这是一个有趣的部分,你可以使它们非常高效和聪明,然后对于不经常更新的人来说非常困难。

import re 

regex = "[aeiou].*[aeiou].*[aeiou]" 

mylist = [ 
"Samuel", #yes! 
"JOAN", #no! 
"Sol Manuel", #yes! 
"", #no! 
] 

for text in mylist: 
    if re.search(regex, text, re.IGNORECASE): 
     print ("Winner!") 
    else: 
     print ("Nein!") 

如果您的选择语言没有忽略大小写标志,您也可以将每个部分调整为[aeiouAEIOU]。祝你好运! :)

0

尝试此图案:

^.*[AEIOUaeiou].*[AEIOUaeiou].*[AEIOUaeiou].*$ 

我们也可以使用正前瞻:

^(?=.*[AEIOUaeiou].*[AEIOUaeiou].*[AEIOUaeiou]).*$ 

注意的是,由于回溯我可能会更喜欢使用第一(非前瞻)模式,因为它应该是更高效的可能性。

+0

是不是也符合空格? – quackenator

+0

@quackenator我不知道你在说什么。 –

+0

一个像'doo de'一样的刺猬可以匹配你的第一个正则表达式 – quackenator

0

这可以使用像这样的lookahead来实现。

正则表达式:^(?=.*[aeiou].*[aeiou].*[aeiou])(?:[a-z] *)+$

说明:

  • (?=.*[aeiou].*[aeiou].*[aeiou])阳性先行检查任何字符后跟元音三次的存在。

  • (?:[a-zA-Z] *)+匹配你由一个空格隔开的一个或多个英语单词。

Regex101 Demo


如果不区分大小写的模式是OFF使用正则表达式如下

正则表达式:^(?=.*[aeiouAEIOU].*[aeiouAEIOU].*[aeiouAEIOU])(?:[a-zA-Z] *)+$

Regex101 Demo

+0

我不认为超前是解决这个问题的最有效方法。 –

+0

@TimBiegeleisen:同意!这是直接比赛的替代方案。最有效率的方法是按Wiktor在评论中提到的匹配和统计元音数量。 – Rahul

0

只是

(\w*[aeuio]\w*){3,} 

,或者如果你想行匹配

^(.*[aeuio].*){3,}$ 
相关问题