Вы можете использовать модификатор (?-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 (многословно),для части выражения.(Флаги описаны в Содержании модуля.)