Регулярные выражения. Паттерн через переменную
Задача: Пользователь вводит строку и ключевые слова. Программа должна найти эти слова в введённой строке и изменить их регистр на верхний.
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 шт):
Не надо менять регистр входных строк, вместо этого 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)