Замена текста в строках Python: метод replace и его особенности
Метод replace в Python
Основной способ замены подстроки в строке - встроенный метод str.replace(old, new, count). Этот метод возвращает новую строку, в которой все вхождения old заменены на new. Необязательный параметр count ограничивает количество замен первыми вхождениями.
text = "один два один три один"
new_text = text.replace("один", "раз")
print(new_text) # раз два раз три раз
Python strip (метод strip в python)
раз два раз три раз
Python повторить строку (повторение строки в python)
Типичная ошибка
Новички забывают присвоить результат, так как строки в Python неизменяемы. Метод не меняет исходную строку, а создаёт новую.
s = "hello"
s.replace("l", "L") # результат не сохранён
print(s) # hello
Tuple в str python (преобразование кортежа в строку в python)
Корректный подход: s = s.replace("l", "L")
Как заменить только первые N вхождений?
Параметр count указывает максимальное количество замен.
text = "a b a b a"
result = text.replace("a", "x", 2)
print(result) # x b x b a
Python объект в строку (преобразование объекта в строку в python)
Как заменить несколько разных символов или букв (транслитерация)?
Метод str.translate() с таблицей, полученной через str.maketrans(), эффективно заменяет множество символов за один проход.
table = str.maketrans("абв", "ABC")
text = "абвгде"
result = text.translate(table)
print(result) # ABCгде
Python convert string (преобразование строк в python)
Как заменить по сложному шаблону, например, с игнорированием регистра?
Модуль re предоставляет функцию re.sub, поддерживающую регулярные выражения.
import re
text = "Кот и котёнок"
result = re.sub(r"кот", "пёс", text, flags=re.IGNORECASE)
print(result) # пёс и пёсёнок
Python str to bytes (преобразование строки в байты в python)
Предостережение
Метод replace не поддерживает регулярные выражения и регистронезависимую замену. Для этих целей используйте re.sub.
Как удалить все пробелы или лишние разделители?
Комбинация split() и join() сжимает многократные пробелы в один.
text = " много пробелов "
result = " ".join(text.split())
print(repr(result)) # 'много пробелов'
функция разделить python (разделение строки на список в python)
Как заменить подстроку, если количество замен заранее неизвестно, но нужно его подсчитать?
Метод replace не возвращает количество замен. Для подсчёта можно использовать str.count или комбинацию с re.subn.
import re
text = "aa bb aa"
new_text, count = re.subn("aa", "cc", text)
print(new_text) # cc bb cc
print(count) # 2
вывести первый символ строки python (вывести первый символ строки в python)
Как заменить части строки внутри списка строк?
Применение метода в цикле или с использованием спискового включения.
words = ["hello", "world", "hello"]
new_words = [w.replace("l", "L") for w in words]
print(new_words) # ['heLLo', 'worLd', 'heLLo']
Расширенные примеры использования replace
# Пример 1: последовательные замены нескольких подстрок
text = "кошка, собака, кошка"
# Замена "кошка" на "кот" и затем "собака" на "пёс"
text = text.replace("кошка", "кот").replace("собака", "пёс")
print(text) # кот, пёс, кот
кот, пёс, кот
# Пример 2: замена с помощью re.sub с функцией обратного вызова
import re
def uppercase_match(match):
return match.group(0).upper()
text = "привет, мир!"
result = re.sub(r"[а-яё]+", uppercase_match, text)
print(result) # ПРИВЕТ, МИР!
ПРИВЕТ, МИР!
# Пример 3: замена только целых слов (с границами слова)
text = "кот котёнок котик"
result = re.sub(r"\bкот\b", "пёс", text)
print(result) # пёс котёнок котик
пёс котёнок котик
# Пример 4: удаление всех цифр через replace с пустой строкой
text = "abc123def456"
import string
for digit in string.digits:
text = text.replace(digit, "")
print(text) # abcdef
abcdef
# Пример 5: замена с учётом контекста (замена "SSL" только в URL)
import re
text = "Используйте SSL. URL: https://ssl.example.com"
result = re.sub(r"(?<=https://)ssl", "TLS", text, flags=re.IGNORECASE)
print(result) # Используйте SSL. URL: https://TLS.example.com
Используйте SSL. URL: https://TLS.example.com
# Пример 6: замена с сохранением заменённых фрагментов (использование групп)
text = "дата: 2024-01-15"
result = re.sub(r"(\d{4})-(\d{2})-(\d{2})", r"\3.\2.\1", text)
print(result) # дата: 15.01.2024
дата: 15.01.2024
# Пример 7: замена в больших текстах (эффективность replace vs translate)
import time
big_text = "a" * 10_000_000 + "b" * 10
# Замена 'a' на 'A'
start = time.time()
big_text.replace("a", "A")
print(f"replace: {time.time() - start:.3f} сек")
# Замена с помощью translate
table = str.maketrans("a", "A")
start = time.time()
big_text.translate(table)
print(f"translate: {time.time() - start:.3f} сек")
replace: 0.120 сек translate: 0.085 сек