Попытка разработать регулярное выражение для извлечения предложений, не содержащих определенных слов. Для простоты я приведу простой пример:
Исходные данные: сагиттальные разведывательные изображения шейно-грудного отдела: многоуровневый спондилез легкой и средней степени тяжести. Перелом присутствует.
Желаемый результат: перелом присутствует.
Попытка №1
Регулярное выражение: [^.]*(?!cervi(c|x))[^.]*\.
Фактические выходные данные: сагиттальные разведывательные изображения шейно-грудного отдела: многоуровневый спондилез легкой и средней степени тяжести. Перелом присутствует.
Попытка №2:
Регулярное выражение: [^.]*[^(cervi(c|x))][^.]*\.
Фактические выходные данные: сагиттальные разведывательные изображения шейно-грудного отдела: многоуровневый спондилез легкой и средней степени тяжести. Перелом присутствует.
Можно проверить эти результаты в https://regexr.com/.
?:
с?!
, по логике вещей, если у вас уже есть группа, которую вы не хотите захватывать (например,(?:)
), зачем все еще нужен просмотр вперед? Я экспериментировал с вашим выражением(?<![^.])\s*(?:cervi[cx][^.]*\.)
и больше не нашел совпадений. Разве регулярное выражение не будет проверять следующий символ после пробела, чтобы убедиться, что его нет в этой группе? 21.09.2020(?:cervi[cx][^.]*\.)
такой же, какcervi[cx][^.]*\.
, просто соответствуетcervi
, затемc
илиx
, затем любому символу, кроме точки ноль или более раз, а затем.
. 22.09.2020[^.]
должно быть ограничено тем, что ему соответствует, а(?:(?!cervi[cx])[^.])*
соответствует любому символу, кроме точки, которая не является первым символомcervix
илиcervic
. 22.09.2020