Методы замены данных: строки и списки в Python

Раздел: Обработка данных -> Обработка строк и списков

Функция замены в Python: обзор методов

Замена символов или подстрок в строках и элементах списков - одна из частых операций при обработке данных. Python предоставляет несколько инструментов для этой задачи. Ниже рассмотрены основные подходы.

Как эффективно заменить все вхождения подстроки в строке?

Самый простой и быстрый метод - str.replace(old, new[, count]). Он возвращает копию строки, в которой все вхождения old заменены на new. Необязательный параметр count ограничивает количество замен.

text = "кот кот кот"
new_text = text.replace("кот", "пёс")
print(new_text)

Python функция заменить (функция замены в python)

пёс пёс пёс

Этот метод применяется для замены подстрок в тексте, очистки данных, форматирования. Проблемы: строка не изменяется на месте - результат нужно присваивать; replace не поддерживает регулярные выражения.

Как заменить только первое вхождение подстроки?

Используем параметр count=1.

text = "кот кот кот"
result = text.replace("кот", "пёс", 1)
print(result)
пёс кот кот

Этот вариант полезен, когда нужно обновить первый элемент в списке или заменить первое упоминание.

Как заменить символы с учётом регистра?

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

text = "Кот кот КОТ"
lower = text.lower()
result = lower.replace("кот", "пёс")
print(result)
пёс пёс пёс

Как заменить подстроки в списке строк?

Для списка удобно использовать генератор списков.

words = ["кот", "собака", "котёнок"]
new_words = [w.replace("кот", "пёс") for w in words]
print(new_words)
['пёс', 'собака', 'пёсёнок']

Если нужно заменить только полные совпадения, придётся проверять равенство.

words = ["кот", "собака", "котёнок"]
new_words = ["пёс" if w == "кот" else w for w in words]
print(new_words)
['пёс', 'собака', 'котёнок']

Как выполнить сложную замену с помощью регулярных выражений?

Модуль re даёт гибкие возможности. Функция re.sub(pattern, repl, string, count=0) заменяет совпадения шаблона.

import re
text = "Кот котёнок КОТ"
result = re.sub(r'кот', 'пёс', text, flags=re.IGNORECASE)
print(result)
пёс пёсёнок пёс

Такой подход полезен при замене по шаблону (номера телефонов, email), но требует осторожности с экранированием спецсимволов.

Как заменить один символ на другой (трансляция)?

Для замены отдельных символов эффективен метод str.translate(table) совместно со str.maketrans.

text = "abc123"
table = str.maketrans({'a':'x', 'b':'y', 'c':'z'})
result = text.translate(table)
print(result)
xyz123

Это быстрее множественных вызовов replace для однобайтовых замен. Проблема: маппинг только для символов, не для подстрок.

Как заменить подстроку с учётом контекста (например, только целые слова)?

Используем регулярное выражение с границами слов .

import re
text = "кот котёнок кот"
result = re.sub(r'\bкот\b', 'пёс', text)
print(result)
пёс котёнок пёс

Это предотвращает замену внутри слов.

Как заменить сразу несколько разных подстрок?

Последовательный вызов replace может быть неэффективным. Лучше использовать re.sub с функцией замены.

import re
text = "кот собака кот"
replacements = {'кот': 'пёс', 'собака': 'кошка'}
pattern = re.compile('|'.join(map(re.escape, replacements.keys())))
result = pattern.sub(lambda m: replacements[m.group(0)], text)
print(result)
пёс кошка пёс

Этот метод удобен для массовой замены, но требует аккуратности с приоритетом совпадений.

Как заменить элементы в списке, если они удовлетворяют условию?

Применяем генератор с условием и заменой.

numbers = [1, 2, 3, 4, 5]
new_numbers = [0 if x % 2 == 0 else x for x in numbers]
print(new_numbers)
[1, 0, 3, 0, 5]

Такой подход заменяет элементы списка по логическому правилу.

Как заменить с помощью метода join/split?

Этот приём позволяет заменить разделитель или удалить подстроку.

text = "кот,собака,кот"
parts = text.split('кот')
result = 'пёс'.join(parts)
print(result)
пёс,собака,пёс

Работает, но менее читаемо. Подходит для простой замены одного разделителя.

Типичные ошибки и их решение:

  • Забыли присвоить результат: text.replace(...) не меняет исходную строку.
  • Путают replace для строк и списков: для списка нет встроенного replace, нужен генератор.
  • В регулярных выражениях не экранируют спецсимволы: используйте re.escape.
  • Используют replace для очень больших объёмов данных - лучше использовать translate или re.sub с компиляцией.

Расширенные примеры замены в Python

Пример 1: замена с использованием map и лямбда-функции для списка.

Пример
words = ['cat', 'dog', 'catbird']
new_words = list(map(lambda w: w.replace('cat', 'bird'), words))
print(new_words)
['bird', 'dog', 'birdbird']

Пример 2: замена с условной заменой по индексу.

Пример
import re
text = "2023 год, 2024 год"
result = re.sub(r'(\d{4})', lambda m: str(int(m.group(1)) + 1), text)
print(result)
2024 год, 2025 год

Пример 3: замена вложенных структур (список списков).

Пример
matrix = [[1,2],[3,4]]
new_matrix = [[0 if x%2 else x for x in row] for row in matrix]
print(new_matrix)
[[0, 2], [0, 4]]

Пример 4: множественная замена с помощью цикла и частичного применения.

Пример
from functools import reduce
text = "a b c"
replacements = {'a':'1','b':'2','c':'3'}
result = reduce(lambda s, kv: s.replace(*kv), replacements.items(), text)
print(result)
1 2 3

Пример 5: замена с сохранением регистра (заглавные буквы заменяются на заглавные, строчные на строчные).

Пример
def smart_replace(text, old, new):
    return re.sub(re.escape(old), lambda m: new.upper() if m.group(0).isupper() else new.lower(), text, flags=re.IGNORECASE)

text = "Кот кот КОТ"
print(smart_replace(text, "кот", "пёс"))
Пёс пёс ПЁС

Пример 6: использование str.maketrans для замены нескольких символов быстро.

Пример
import string
text = "Hello World!"
table = str.maketrans('Helo', 'hELO')
print(text.translate(table))
hELLO WOrld!

Пример 7: замена с подсчетом количества замен.

Пример
text = "abcabc"
def count_replace(s, old, new):
    count = 0
    def repl(m):
        nonlocal count
        count += 1
        return new
    result = re.sub(re.escape(old), repl, s)
    return result, count

res, cnt = count_replace(text, 'a', 'x')
print(res, cnt)
xbcxbc 2

Пример 8: замена с использованием f-строк и форматирования.

Пример
name = "Мир"
template = "Привет, {name}!"
result = template.replace('{name}', name)
print(result)
Привет, Мир!

Функция замены в Python - comments

En
Python функция заменить (python)