Нахождение определенного перекрывающегося шаблона с использованием 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
Другие вопросы по тегам