2017-05-23 30 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,}$ 
相關問題