python регулярное выражение: рассматривать конец строки как условие ИЛИ в поиске, аналогично символам в классе символов - PullRequest
1 голос
/ 29 апреля 2020

Проблема: Найти все гласные (более 2), которые находятся между двумя согласными. Эти гласные могут приходить в начале или в конце строки. Пример: -

ввод: -

abaabaabaabaae

ожидаемый вывод: -

['aa','aa','aa','aae']

решение Tried

import re
pattern=re.compile(r'(?:[^aeiouAEIOU])([AEIOUaeiou]{2,})(?=[^AEIOUaeiou])')
pattern.findall("abaabaabaabaae")

Это дает вывод как [ 'aa', 'aa', 'aa'], он игнорирует «aae» по очевидной причине, поскольку конец строки не является частью критериев поиска. Как включить поиск с привязкой к концу строки ($) так, чтобы он ($) являлся условием ИЛИ в поиске, а не обязательным концом строки.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Вы можете извлечь совпадения из регулярного выражения

re'(?<=[b-df-hj-np-tv-z])[aeiou]{2,}(?=[b-df-hj-np-tv-z]|$)'

Демо

Для следующей строки указаны совпадения.

_abaab_aabaabaaeraaa_babaa%abaa
   ^^     ^^ ^^^             ^^

Я обнаружил, что проще всего явно сопоставить согласные с классом символов

[b-df-hj-np-tv-z]

Python demo

0 голосов
/ 29 апреля 2020

Я бы использовал re.findall с шаблоном (?<=[^\Waeiou])[aeiou]+(?![aeiou]):

inp = "abaabaabaabaae"
matches = re.findall(r'(?<=[^\Waeiou])[aeiou]+(?![aeiou])', inp, flags=re.IGNORECASE)
print(matches)

Это печатает:

['aa', 'aa', 'aa', 'aae']

Вот объяснение шаблона регулярного выражения:

(?<=[^\Waeiou])  assert that what precedes is any word character, excluding a vowel
                 this also exlcudes the start of the input
[aeiou]+         match one or more vowel characters
(?![aeiou])      assert that what follows is not a vowel (includes end of string)
...