Изменение строки в Python – метод replace

Строки — это важный тип данных, который есть почти в любом языке программирования. Он служит для создания, изменения и сохранения текстовой информации, а также используется при реализации некоторых задач, связанных с числами.

Python даёт программисту много инструментов для работы со строками, в том числе и метод replace().

Что делает метод

Слово replace имеет дословный перевод «заменять», так что название метода точно описывает его назначение. С помощью replace можно заменить часть строки или её всю на другую строку.

Синтаксис метода выглядит так:

str.replace(old_str, new_str[, count])

В качестве аргументов в метод передаются:

  • old_str – часть исходной строки, которую необходимо заменить.
  • new_str – строка, на которую заменяют исходную строку (old_str).
  • count – определяет количество вхождений подстроки, которые необходимо заменить.
Здесь count – не обязательный параметр. Если его не указывать, то будут заменены все вхождения подстрок на новые.

В качестве str используется исходная строка (тип данных string).

Таким образом, метод replace позволяет гибко изменять только необходимые части строки str, работа метода продемонстрирована в следующих примерах:

my_str = "one dog, one cat, one rabbit"

#Заменяем все вхождения "one" в строке
a = my_str.replace("one", "two")
print(a) # Выведет two dog, two cat, two rabbit

#Заменяем первое вхождение "one" в строке
b = my_str.replace("one", "two", 1)
print(b) # Выведет two dog, one cat, one rabbit

#Заменяем первые два вхождения "one" в строке
c = my_str.replace("one", "two", 2)
print(c) # Выведет two dog, two cat, one rabbit
Важно помнить, что строки — это неизменяемые последовательности. Поэтому метод replace не заменяет отдельные символы в целевой строке, вместо этого он создает её копию с нужными изменениями. Это важная особенность языка Python, которую должен знать каждый программист.

Это не очевидно, с помощью метода replace можно заменить сразу несколько значений, например все элементы списка:

str_list = ["кот", "собака", "кот собака", "кот кот"]

# в новый список записываем элементы начального списка, измененные
# с помощью replace
result_list = [elem.replace("кот", "кошка", 1) for elem in str_list]
print(result_list) # Выведет ['кошка', 'собака', 'кошка собака', 'кошка кот']

Применение replace для замены нескольких значений

С помощью словаря

Предыдущий пример позволяет заменить несколько элементов, однако все они имеют одно и то же значение «кот». Если необходимо заменить несколько разных значений, например «кот» на «кошка» и «кошка» на «собака», то необходимо реализовать чуть более сложную программу с использованием словарей:

# Функция для замены нескольких значений
def multiple_replace(target_str, replace_values):
    # получаем заменяемое: подставляемое из словаря в цикле
    for i, j in replace_values.items():
        # меняем все target_str на подставляемое
        target_str = target_str.replace(i, j)
    return target_str

# создаем словарь со значениями и строку, которую будет изменять
replace_values = {"кот": "кошка", "кошка": "собака"}
my_str = "У меня есть кот и кошка"

# изменяем и печатаем строку
my_str = multiple_replace(my_str, replace_values)
print(my_str)

Здесь replace используется в функции, аргументы которой исходная строка и словарь со значениями для замены.

У этого варианта программы есть один существенный недостаток, программист не может быть уверен в том, какой результат он получит. Дело в том, что словари — это последовательности без определенного порядка, поэтому рассматриваемый пример программы может привести к двум разным результатам в зависимости от того, как интерпретатор расположит элементы словаря:

  • У меня есть собака и собака
  • У меня есть кошка и собака
В Python версии 3.6 и более поздних порядок перебора ключей будет такой же, как и при котором они созданы. В более ранних версиях Python порядок может отличаться.

Для решения этой проблемы можно заменить обычный словарь на упорядоченный словарь OrderedDict, который нужно импортировать следующей командой:

from collections import OrderedDict

Помимо импорта в программе нужно поменять буквально одну строку:

replace_values = {"кот": "кошка", "кошка": "собака"}

Изменить её надо на:

replace_values = OrderedDict([("кот", "кошка"), ("кошка", "собака")])

В этом случае, результат будет «У меня есть собака и собака», если же поменять местами элементы упорядоченного словаря при инициализации следующим образом: OrderedDict([("кошка", "собака"), ("кот", "кошка")]), то результат будет «У меня есть кошка и собака».

Вариант со списками

Замену нескольких значений можно реализовать и по-другому, для этого используем списки:

my_str = "У меня есть кот и кошка"
# в цикле передаем список (заменяемое, подставляемое) в метод replace
for x, y in ("кот", "кошка"), ("кошка", "собака"):
    my_str = my_str.replace(x, y)
print(my_str) # Выведет "У меня есть собака и собака"

В данном примере цикл for делает 2 итерации:

  1. Подставляет в метод replace значения из первого списка: replace(«кот», «кошка»), в результате чего получается строка «У меня есть кошка и кошка».
  2. Подставляет в метод replace значения из второго списка: replace(«кошка», «собака»), получается строка «У меня есть собака и собака».

Другие типы Python и метод replace

Метод replace есть не только у строк, с его помощью программист может изменять последовательности байт, время и дату.

Синтаксис метода для последовательности байт ничем не отличается от синтаксиса для строк, для дат и времени в аргументах метода replace нужно писать идентификатор изменяемой цели, например:

from datetime import date
t_date = date(2020, 4, 23)
t_date = t_date.replace(day = 11)
print(t_date) # Выведет 2020-04-11

Для времени метод replace применяется аналогично.