Python Regex: отрицательный поиск назад не непосредственно перед целевым словом

Я создаю базовый сценарий NLP в Jupyter Notebook, который должен отфильтровывать все «эмболии» из отчетов. Однако, когда слова «нет» или «нет» встречаются в одной строке/предложении, я не хочу их включать. Это легко сделать с регулярным выражением, если вы знаете, где слово встречается, если оно встречается. Но между ними может быть много слов.

  • Пример: сканирование показало наличие эмболии; должен быть включен
  • Пример: эмболия не обнаружена; следует исключить (это легко с Regex)
  • Пример проблемы: В настоящее время не обнаружено ни одной развивающейся, интересной, красивой, красивой эмболии; должно быть исключено, но я понятия не имею, как.

Это регулярное выражение для исключения «нет эмболии», когда они вместе в предложении:

result = re.findall('(?<!\no )(embolism?\w)', text)

Ошибка, возникающая с обычным регулярным выражением при расширении до нескольких слов: ошибка: просмотр назад требует шаблона фиксированной ширины

Я гуглил, как это решить, но не нашел решения, применимого к этой проблеме. Я также обнаружил, что установка Regex с помощью pip устраняет вышеупомянутую ошибку. Тем не менее, мне все еще интересно, есть ли решение этой проблемы?

Лучший,


person Joost Horskamp    schedule 03.11.2020    source источник


Ответы (1)


Вы можете исключить последние 2, сопоставив их, и захватить первый пример, который вы хотите сохранить в группе.

^(?:.*\bnot?\b.*\bembolism\b.*|.*\bembolism\b.*\bnot?\b.*)|(.*\bembolism\b.*)$

Пояснение

  • ^ Начало строки
  • (?: Non capture group
    • .*\bnot?\b.*\bembolism\b.* Match first no or not followed by embolism
    • | Or
    • .*\bembolism\b.*\bnot?\b.* Сопоставьте это наоборот
  • ) Закрыть группу без захвата
  • | Or
  • (.*\bembolism\b.*) Захватите группу 1 (то, что вы хотите сохранить), содержащую эмболию
  • $ Конец строки

демонстрация регулярных выражений

person The fourth bird    schedule 03.11.2020
comment
Благодарю вас! Я еще не до конца понял возможности \b...\b. Группирующая часть регулярного выражения также стала более понятной. - person Joost Horskamp; 03.11.2020
comment
\b — это граница слова, которая не позволяет слову быть частью большего слова. См. regular-expressions.info/wordboundaries.html. - person The fourth bird; 03.11.2020