Строка регулярного выражения с 3 или более гласными

Я пытаюсь создать регулярное выражение, которое соответствует строке с 3 или более гласными.

Я пробовал это:

[аиоу] {3,}

Но это работает только тогда, когда гласные находятся в последовательности. Какие-нибудь советы ?

Например:

  1. Самуил -> действительный
  2. Джоан -> инвалид
  3. Сол Мануэль -> действительный
  4. Сол -> Неверный

person Community    schedule 23.05.2017    source источник
comment
Три или более разных гласных или одинаковые?   -  person Rahul    schedule 23.05.2017
comment
Неважно, разные они или одинаковые   -  person    schedule 23.05.2017
comment
@Green_Sam, опубликуйте несколько допустимых и недопустимых примеров   -  person RomanPerekhrest    schedule 23.05.2017
comment
попробуй так: (?:[aeiou][^aeiou]*){3}   -  person bobble bubble    schedule 23.05.2017
comment
\b\w*[aeiouAEIOU]\w*[aeiouAEIOU]\w*[aeiouAEIOU]\w*\b Может быть, что-то еще в этом духе?   -  person quackenator    schedule 23.05.2017
comment
Просто сопоставьте все вхождения [aeiou] и подсчитайте совпадения.   -  person Wiktor Stribiżew    schedule 23.05.2017
comment
@Green_Sam, если мой ответ ниже помог, примите его :)   -  person sniperd    schedule 27.07.2017


Ответы (5)


Есть несколько способов сделать это, и в этом случае простота, вероятно, будет наиболее полезна для будущих разработчиков, поддерживающих этот код. Это забавная часть регулярных выражений, вы можете сделать их очень эффективными и умными, а затем очень трудно обновлять их для тех, кто не делает их часто.

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], если у вас нет флага игнорирования регистра на выбранном вами языке. Удачи! :)

person sniperd    schedule 23.05.2017

просто

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

или если вы хотите совпадение строк

^(.*[aeuio].*){3,}$
person Mehdi Khademloo    schedule 23.05.2017

Это может быть достигнуто с помощью просмотра вперед, как это.

Регулярное выражение: ^(?=.*[aeiou].*[aeiou].*[aeiou])(?:[a-z] *)+$

Пояснение:

  • (?=.*[aeiou].*[aeiou].*[aeiou]) положительный просмотр вперед проверяет наличие любого символа, за которым следует гласная три раза.

  • (?:[a-zA-Z] *)+ соответствует одному или нескольким вашим английским словам, разделенным пробелами.

Демо Regex101


Если режим без учета регистра выключен, используйте следующее регулярное выражение

Регулярное выражение: ^(?=.*[aeiouAEIOU].*[aeiouAEIOU].*[aeiouAEIOU])(?:[a-zA-Z] *)+$

Демо Regex101

person Rahul    schedule 23.05.2017
comment
Я не думаю, что просмотр вперед является наиболее эффективным способом решения этой проблемы. - person Tim Biegeleisen; 23.05.2017
comment
@TimBiegeleisen: Согласен! Это альтернатива прямому совпадению. Наиболее эффективным было бы сопоставление и подсчет количества гласных, как упомянул Виктор в комментарии. - person Rahul; 23.05.2017

Попробуйте этот шаблон:

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

Мы также могли бы использовать положительный взгляд вперед:

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

Обратите внимание, что из-за возможности обратного отслеживания я, вероятно, предпочел бы использовать первый шаблон (без просмотра вперед), потому что он должен быть более эффективным.

person Tim Biegeleisen    schedule 23.05.2017
comment
не будет ли это также соответствовать пробелам? - person quackenator; 23.05.2017
comment
@quackenator Я не знаю, о чем ты говоришь. - person Tim Biegeleisen; 23.05.2017
comment
такое жало, как doo de, будет соответствовать вашему первому регулярному выражению - person quackenator; 23.05.2017
comment
Где ОП упоминал что-либо об отдельных словах? Одним из приведенных примеров соответствия является Sol Manuel, состоящее из двух слов. - person Tim Biegeleisen; 23.05.2017
comment
^.* и .*$, похоже, не нужны. - person NetMage; 24.05.2017

Я попробовал это, используя помощь снайперского ответа:

def multi_vowel_words(text):
   pattern = r"\w+[aeiou]\w*[aeiou]\w*[aeiou]\w+"
   result = re.findall(pattern, text)
   return result

Это работает даже с заглавными буквами.

Если в вашем тексте есть цифры и подчеркивание, то вместо \w используйте [a-zA-Z].

person Ujjawal    schedule 28.03.2020