Включение специальных символов в Python re.compile - PullRequest
0 голосов
/ 03 марта 2020

Краткое описание

Я работаю над проектом, в котором у меня есть список ключевых слов (содержит специальный символ), и у меня есть строка, я должен проверить, есть ли какие-либо из ключевые слова присутствуют в этой строке и извлекают то же самое. Это будет поиск без учета регистра. Но точное ключевое слово должно присутствовать. Если SAP является ключевым словом, то sap является положительным, а saphire - отрицательным.

Я приложил много усилий, но я смог добиться только результата, который отчасти является тем, что я ищу.

Это пример кода, который вы должны понять:

>>> keywords = ["HIPAA", "ERP(2.0)"]
>>> r = re.compile('|'.join([r'\b%s\b' % w for w in keywords]), flags=re.I)
>>> word = "HIPAAA and ERP(2.0)"
>>> r.findall(word)
['']

здесь я должен получить этот вывод - ["ERP(2.0)"]

Я выписал на этот вопрос: специальные символы Escape regex в Python строке , но это на самом деле не отвечает на мой вопрос.

Может кто-нибудь, пожалуйста, подскажите мне, как сделать эту работу, учитывая, что у меня есть 10 ключевых слов. в котором есть специальный символ, и я импортирую эти ключевые слова из MySQL?

подробное описание

Test 1

>>> keywords = ["HIPAA", "ERP"]
>>> r = re.compile('|'.join([r'\b%s\b' % w for w in keywords]), flags=re.I)
>>> word = "HIPAA and ERP"
>>> r.findall(word)
['HIPAA', 'ERP']

Test 2

>>> keywords = ["HIPAA", "ERP(2.0)"]
>>> r = re.compile('|'.join([r'\b%s\b' % w for w in keywords]), flags=re.I)
>>> word = "HIPAA and ERP(2.0)"
>>> r.findall(word)
['']

Тест 3

>>> keywords = ["HIPAA", "ERP\(2.0\)"]
>>> r = re.compile('|'.join([r'\b%s\b' % w for w in keywords]), flags=re.I)
>>> word = "HIPAA and ERP(2.0)"
>>> r.findall(word)
['HIPAA']

Тест 4

>>> keywords = ["HIPAA", "ERP(2.0)"]
>>> r = re.compile('|'.join([r'\b%s\b' % re.escape(w) for w in keywords]), flags=re.I)
>>> word = r"HIPAASTOL and ERP(2.0)"
>>> r.findall(word)
[]

Тест 5

>>> keywords = ["HIPAA", "ERP(2.0)"]
>>> r = re.compile('|'.join([re.escape(w) for w in keywords]), flags=re.I)
>>> word = r"HIPAASTOL and ERP(2.0)"
>>> r.findall(word)
['HIPAA', 'ERP(2.0)']

Заранее спасибо:)

Ответы [ 2 ]

1 голос
/ 11 марта 2020
  1. Специальные символы должны быть экранированы.
  2. По определению, граница слова \b является утверждением нулевой длины, которое соответствует ... границе между символом слова \w или [a-zA-z0-9_] и несловесный символ \W или [a-zA-z0-9_].

В вашем случае у вас есть регулярное выражение: \bHIPAA\b|\bERP(2.0)\b

Нет проблем с первым \bHIPAA\b, но более поздняя \bERP(2.0)\b показывает 2 ошибки.

  1. необходимо избегать скобок.
  2. для последней границы слова требуется символ слова сразу после закрывающих скобок.

Чтобы экранировать специальные символы, вы должны использовать функцию re.escape:

re.escape(w) for w in keywords

Чтобы определить границы слов без использования \b, вы должны утверждать, что слова нет символ перед и после ключевых слов, для этого вы должны использовать lookaround:

  • (?<!\w) перед ключевым словом, отрицательный lookbehind, убедитесь, что до
  • нет символа слова (?!\w) после ключевого слова минус, убедитесь, что у нас нет слова ch после.

Ваше регулярное выражение становится:

r = re.compile('|'.join([r'(?<!\w)%s(?!\w)' % re.escape(w) for w in keywords]), flags=re.I)

Демонстрация и объяснение

0 голосов
/ 03 марта 2020

Это работает

keywords = ["HIPAA", "ERP(2.0)"]
r = re.compile('|'.join([re.escape(w) for w in keywords]), flags=re.I)
word = r"HIPAA and ERP(2.0)"
r.findall(word)

вывод

['HIPAA', 'ERP(2.0)']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...