Нахождение определенного перекрывающегося шаблона с использованием Python
Я пытаюсь извлечь все слова шаблона VCV (гласный согласный гласный) в слове с помощью регулярных выражений. Это также должно включать начало и конец, который может быть CV в начале и VC в конце.
Учитывая слово "bookeeping" в качестве входных данных, ожидаемый результат будет:
boo, ookee, eepi, ing
Моя текущая попытка использования библиотеки регулярных выражений для перекрывающихся шаблонов выглядит следующим образом:
import regex as re
word = "bookeeping"
print(re.findall(r'[aeiouy]+?[bcdfghkjlmnpqrstvwxz]+[aeiouy]+', word, overlapped=True))
с (неправильным) выводом:
['ookkee', 'okkee', 'eepi', 'epi']
'okkee' недействителен и не захватывает начало или конец. Как заставить его исключить слова, которые не включают все предыдущие совпадения?
1 ответ
Решение
Из вашего ожидаемого результата видно, что гласные являются необязательными в шаблоне гласный-согласный-гласный, который вы ищете, и в этом случае будет делать следующее:
import re
pos = 0
while True:
match = re.search(r'[aeiouy]*[bcdfghkjlmnpqrstvwxz]+([aeiouy]*)', 'bookeeping'[pos:])
if not match:
break
print(match.group(0))
pos += match.start(1)
Это выводит:
boo
ookee
eepi
ing