Регулярные выражения Python. Сопоставление слов в текстовом файле с 1 или более гласными в зависимости от ввода?

У меня есть файл .txt, и цель состоит в том, чтобы найти все слова в файле, содержащие n гласных, используя только регулярные выражения.

import re
def main():
    n = int(input("Enter a number: "))
    file = input("Enter file name: ")
    f = open(file,'r')
    print(re.findall("[A-Za-z]*[AEIOUaeiou]"+str({n})+"[b-df-hj-np-tv-z]*",f.read()))
    f.close()

main()

Когда я ставлю 1 вместо n, я получаю каждое слово с гласной. Но когда я ставлю 2, я получаю только слова, в которых гласные сгруппированы, например, слово книга. Это происходит для любого числа для n. Я пробовал множество способов и просто не могу понять это.

Мне нужна помощь в том, как найти слово, в котором есть 2 гласных (или больше), которые не просто сгруппированы вместе. Например, для n = 2, ['these','look','hello']

Любая помощь очень ценится.


person Eric    schedule 02.12.2014    source источник
comment
Уточняющий вопрос: подходит ли взгляд для n=2, поскольку гласные являются смежными?   -  person rchang    schedule 02.12.2014
comment
Да, это так. Проблема заключалась в том, что он принимал только соседние гласные, но теперь он работает, и он принимает обе гласные, которые являются смежными и разнесенными внутри слова, благодаря ссылка   -  person Eric    schedule 02.12.2014


Ответы (4)


для особого н

re.findall("\s?(" + "[A-Za-z]*[AEIOUaeiou]"*n + "[b-df-hj-np-tv-z]*)", f.read())

eg

>>> re.findall("\s?(" + "[A-Za-z]*[AEIOUaeiou]"*2 + "[b-df-hj-np-tv-z]*)", "bool sjalkdj tehere")
['boo', 'tehere']
>>> re.findall("\s?(" + "[A-Za-z]*[AEIOUaeiou]"*3 + "[b-df-hj-np-tv-z]*)", "bool sjalkdj tehere")
['tehere']
person icylogic    schedule 02.12.2014
comment
Это исправило это, но все, что я сделал с программой, которую я разместил, это вынул +str({n}) и вставил *n, и это работает, как я и надеялся. - person Eric; 02.12.2014

Regex не подходит для решения этой проблемы. Я бы предложил:

vowels = 'AEIOUaeiou'
sum(some_string.count(v) for v in vowels)

Это вернет количество гласных в some_string.

Это регулярное выражение:

[A-Za-z]*[AEIOUaeiou]"+str({n})+"[b-df-hj-np-tv-z]*

соответствует всем строкам, которые могут начинаться с a-zA-Z, затем должны быть гласные, затем сама строка, а затем она может иметь [b-df-hj-np-tv-z].

person Maroun    schedule 02.12.2014
comment
Спасибо за совет, но это обязательно делать с регулярными выражениями. - person Eric; 02.12.2014

EDITED - Я думаю, что теперь я немного лучше понимаю ваш вариант использования, поэтому соответствующим образом перенастроил функцию.

import re

def countVowelClumps(text):
  return len(re.findall(r'([AEIOUaeiou])', text))

Сейчас это просто строгий подсчет гласных.

person rchang    schedule 02.12.2014

Это найдет слова, содержащие n или более гласных (если я не ошибаюсь). Это то, что вы хотите? (название вашего вопроса, кажется, указывает на это)

import re
a = ("Nx Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do"
    " eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim"
    " veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea"
    " commodo consequat. Duis aute irure dolor in reprehenderit in voluptate"
    " velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint"
    " occaecat cupidatat non proident, sunt in culpa qui officia deserunt"
    " mollit anim id est laborum XXX")

n = 4
rx = re.compile(r'(\w*([aeiou]\w*){%s})' % n)
found = []
for block in re.findall(rx, a):
    found.append(block[0])
print found

Выходы:

['consectetur', 'adipiscing', 'eiusmod', 'incididunt', 'aliqua',
 'exercitation', 'aliquip', 'consequat', 'reprehenderit', 'voluptate',
 'pariatur', 'occaecat', 'cupidatat', 'officia']
person BorrajaX    schedule 02.12.2014