Как обрабатывать смешанные случаи регулярных выражений? - PullRequest
1 голос
/ 19 июня 2019

У меня есть список ключевых слов для поиска. Большинство из них нечувствительны к регистру, но некоторые из них чувствительны к регистру, такие как IT или I.T. для информационных технологий. Обычно я объединяю все ключевые слова вместе с "|" и устанавливаю флаг re.I. Это создаст проблемы для чувствительных к регистру ключевых слов. Есть ли простой способ обойти это? Или я должен запустить отдельный поиск с учетом регистра? Спасибо!

 keywords = ["internal control", "IT",... and many more]
 patterns = r"\b(" + "|".join(keywords) + r")\b"
 m = re.findall(patterns, text, flags = re.I)

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

Вы можете использовать модификатор (?-i:...), чтобы отключить поиск этой группы без учета регистра.Но это работает только на Python 3.6 +:

import re

s = "Internal control, it IT it's, Keyword2"
keywords = ["internal control", "IT", "keyword2"]
pattern = '|'.join(r'((?-i:\b{}\b))'.format(re.escape(k)) if k.upper() == k else r'(\b{}\b)'.format(re.escape(k)) for k in keywords)
print(re.findall(pattern, s, flags=re.I))

Печать:

[('Internal control', '', ''), ('', 'IT', ''), ('', '', 'Keyword2')]

Из документации Python 3.6 :

(? imsx-imsx: ...)

(Ноль или более букв из набора 'i', 'm', 's', 'x', за которыми может следовать '-', за которым следует один или несколькобуквы из того же набора.) Буквы устанавливают или удаляют соответствующие флаги: re.I (игнорировать регистр), re.M (многострочный), re.S (точка соответствует всем) и re.X (многословно),для части выражения.(Флаги описаны в Содержании модуля.)

1 голос
/ 19 июня 2019

(Публикация в качестве ответа, потому что это слишком много текста для комментария)
Я все еще думаю, что два отдельных поиска будут чище и проще.Так что это может быть академическим: вы можете использовать некоторую комбинацию условных регулярных выражений и необязательных модификаторов режима , как указано в соответствующих ссылках.

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