Регулярные выражения. Паттерн через переменную

Задача: Пользователь вводит строку и ключевые слова. Программа должна найти эти слова в введённой строке и изменить их регистр на верхний.

import re

print("Поиск слова и верхний регистр")
user_string = input("Введите строку:").lower()
search_words = input("Введите слова через запятую:").replace(' ', '').lower()
search_words = search_words.replace(',', '|')
pattern = r'[search_words]'

new_string = re.sub(pattern, pattern.upper(), user_string)

print(new_string)

Полагаю что это достаточно лёгкий вопрос, но нет достаточного опыта с регулярными выражениями. В строке с ключевыми словами через replace() отделил слова друг от друга через логический оператор 'или' ,чтобы в дальнейшем эту строку сделать паттерном для поиска каждого слова. Не знаю каким образом сделать именно этот момент.


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Не надо менять регистр входных строк, вместо этого flags=re.IGNORECASE указывает его игнорировать.

Все слова образца надо пропустить через re.escape.

Функция re.sub умеет принимать лямбду вместо строки замены. Лямбда меняет регистр найденного фрагмента.

NB: слова заключены в скобки и обрамлены символами \b - обозначающими границу слова.

import re


print("Поиск слова и верхний регистр")
user_string = input("Введите строку:")
search_words = input("Введите слова через запятую:")

alternatives = '|'.join(re.escape(w.strip()) for w in search_words.split(','))
pattern = f'\\b(?:{alternatives})\\b'

new_string = re.sub(
    pattern,
    lambda m: m.group(0).upper(),
    user_string,
    flags=re.IGNORECASE
)

print(new_string)
→ Ссылка