Регулярное выражение, которое соответствует слову, но только если другое слово не появляется?

#python #regex

#python #регулярное выражение

Вопрос:

Обычно я неплохо разбираюсь в регулярных выражениях, но с этим у меня проблемы. Мне нужно регулярное выражение, которое соответствует термину cbd , но не если фраза central business district появляется где-либо еще в строке поиска. Или, если это слишком сложно, по крайней мере, соответствует cbd , если фраза central business district нигде не появляется перед термином cbd . cbd В качестве результата должна быть возвращена только часть, поэтому я использую lookaheads / lookbehinds, но я не смог выполнить требования…

Примеры ввода:
ХОРОШО Any products containing CBD are to be regulated.
ПЛОХО Properties located within the Central Business District (CBD) are to be regulated

Я пробовал:

  • (?!central business district)cbd
  • (.*(?!central business district).*)cbd

Это в Python 3.6 с использованием re модуля.

Я знаю, что это было бы легко выполнить с помощью пары строк кода, но у нас есть список строк регулярных выражений в базе данных, который мы используем для поиска в корпусе документов, содержащих любую из строк регулярных выражений из БД. Лучше избегать жесткого кодирования каких-либо ключевых слов в скриптах, потому что тогда другим нашим разработчикам будет непонятно, откуда берутся эти совпадения, потому что они не могут видеть это в базе данных.

Комментарии:

1. можете ли вы опубликовать несколько примеров ввода? любой код, который вы пытаетесь?

2. Не могли бы вы предоставить пример строки того, что вы ищете? Не могли бы вы выполнить поиск в строке central business district , а затем выполнить поиск cbd , если его нет в строке после этого? Тогда вам вообще не нужно необычное регулярное выражение

3. . * будет соответствовать чему угодно, включая «центральный деловой район»

4.Вы близки. Попробуйте ^(?!.*central business district).*cbd демонстрационную версию, которая предполагает однострочную строку.

5. Надеюсь, мой ответ помог вам, не так ли?

Ответ №1:

Используйте регулярное выражение PyPI с

 import regex
strings = [' I need a regular expression that matches the term cbd but not if the phrase central business district appears anywhere else in the search string.', 'I need cbd here.']
for s in strings:
  x = regex.search(r'(?<!central business district.*)cbd(?!.*central business district)', s, regex.S)
  if x:
    print(s, x.group(), sep=" => ")
  

Результаты: I need cbd here. => cbd . Смотрите Код Python.

Объяснение

 --------------------------------------------------------------------------------
  (?<!                     look behind to see if there is not:
--------------------------------------------------------------------------------
    central business         'central business district'
    district
--------------------------------------------------------------------------------
    .*                       any character except n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  cbd                      'cbd'
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    .*                       any character except n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    central business         'central business district'
    district
--------------------------------------------------------------------------------
  )                        end of look-ahead
  

Комментарии:

1. Потрясающе, спасибо! Я действительно попробовал этот шаблон со стандартным re модулем, и он выдает ошибку: python error: look-behind requires fixed-width pattern так что, если кто-нибудь прочитает это в будущем, установите regex модуль с помощью pip, и это решение будет работать: bash pip install regex

2. @mevers303 pip install regex должно быть достаточно.

3. Правильно… Я писал так много сценариев bash, что перед этим использовал bash out of muscle memory ~_ ~