#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 ~_ ~