Как заменить подстроку в строке Python?
Нужно в строке заменить одно слово на другое, например все 'кот' на 'пёс'. Использую replace, но почему-то исходная строка не меняется. Как правильно заменить подстроку и заменить только первое вхождение?
2 ответа
Метод replace(старое, новое) заменяет все вхождения и возвращает новую строку:
text = 'кот сел, кот спит'
result = text.replace('кот', 'пёс')
print(result) # 'пёс сел, пёс спит'
Вот почему «исходная строка не меняется»: строки в Python неизменяемы, replace не правит её на месте, а создаёт новую. Нужно присвоить результат:
text = text.replace('кот', 'пёс') # вот так сохранится
Если просто вызвать text.replace(...) и не присвоить — результат потеряется, а text останется прежним. Это самая частая ошибка.
Чтобы заменить только первые N вхождений, передайте третий аргумент:
'кот кот кот'.replace('кот', 'пёс', 1) # 'пёс кот кот' — только первое
Нюансы:
replaceчувствителен к регистру:'Кот'и'кот'для него разные. Чтобы заменить без учёта регистра, нужен модульre(re.subс флагомre.IGNORECASE).- Если подстроки нет, ошибки не будет — вернётся та же строка без изменений.
- Можно «удалить» подстроку, заменив её на пустую:
text.replace(' ', '')уберёт все пробелы.
Для замены по шаблону (цифры, любые символы) используйте регулярные выражения re.sub(r'\d+', 'X', text).
Если нужно сделать несколько разных замен за раз, не вызывайте replace по цепочке вслепую — порядок может влиять на результат. Для пары символов удобен str.translate:
table = str.maketrans({'a': '@', 'o': '0'})
print('hello world'.translate(table)) # 'hell0 w0rld'
А для сложных шаблонов с условиями — re.sub с функцией-заменой. Но для простой задачи «заменить одно слово на другое» обычного replace с присваиванием результата вполне достаточно.