Предположим, что я хочу создать регулярное выражение, которое передает любую строку, содержащую "белый" или "серый" и "бегемот" или "гиппопотам", включая множественные числа, но не содержащие слово "голодный" или "злой", без учёта регистра.
Т.е. неформально говоря, я хочу что-то вроде: ("белый" OR "серый") AND ("бегемот[ы]" OR "гиппопотам[ы]") -"дикий" -"злой"
Должно пройти следующее:
"некоторые белые бегемоты выглядят великолепно"
"этот бегемот окрашен в серый цвет"
"белый и серый бегемоты"
Не должны проходить:
"Мне нравится белый цвет" (ни слова про бегемотов)
"белый дикий бегемот зашёл в реку" (дикий - вычёркивем)
"сероватый бегемот" (а не серый)
Как мне это сделать?
И кстати, есть ли библиотека (лучше на питоне), которая бы конвертировала удобочитаемые условия, например, как:
("белый" OR "серый") AND ("бегемот[ы]" OR "гиппопотам[ы]") -"дикий" -"злой",
камент, ибо НЕ ответ - по моим наблюдениям, реализации регулярок, далеко не всегда свершенные. особенно в быстродействии.
личный выбор - пишу код, обычно мне это и быстрее в реализации, и надежнее, и эффективнее
^(?: (word1) | (word2) | ... )+
После прохода по строке, проверяем какие из сохраняющих групп участвовали в совпадении. (?(id/name)yes-pattern|no-pattern)https://docs.python.org/3/library/re.html
Ещё потребуется атомарная группировка (?>...), которая не поддерживается в Python, но её можно имитировать с помощью позитивной опережающей проверки (?=...) https://regex101.com/r/dbjy2E/1
Спасибо за первый полезный ответ. А "этот бегемот окрашен в серый цвет" (т.е. слова "бегемот" и "серый" переставлены местами) разве пройдёт такую регулярку?