Функция replace в Python: синтаксис, варианты и примеры применения

Раздел: Строки -> Методы строк

Основное использование replace

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

text = "Python is great. Python is powerful."
new_text = text.replace("Python", "Java")
print(new_text)

Lower python (метод lower() в python для строк)

Java is great. Java is powerful.

Python line starts with (проверка начала строки в python (метод startswith))

Типичная ошибка:

Забыть присвоить результат, так как строка неизменяема. Вызов replace без присваивания не влияет на исходную переменную.

text = "hello"
text.replace("l", "L")  # ничего не произойдет
print(text)  # hello

функция replace python (функция replace в python)

Решение: всегда присваивать результат: text = text.replace("l", "L").

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

Параметр count указывает максимальное число замен, начиная с левого края строки.

text = "one two one two one"
result = text.replace("one", "1", 2)
print(result)
1 two 1 two one

Если count больше числа вхождений, заменяются все вхождения.

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

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

text = "Hello, World!"
result = text.replace("Hello", "Hi").replace("World", "Python")
print(result)
Hi, Python!

Порядок замен важен: если новая подстрока сама является заменяемой, может произойти неожиданная вложенная замена.

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

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

replacements = {"cat": "dog", "bird": "fish", "mouse": "elephant"}
text = "The cat chased the mouse and the bird flew away."
for old, new in replacements.items():
    text = text.replace(old, new)
print(text)
The dog chased the elephant and the fish flew away.

Если словарь большой, каждая замена создает новую строку, что может быть неэффективно. Альтернатива: использовать регулярные выражения с функцией замены.

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

Модуль re предоставляет функцию re.sub(pattern, repl, string) для замены по шаблону.

import re
text = "Phone: 123-456-7890, 555-666-7777"
result = re.sub(r'\d{3}-\d{3}-\d{4}', '[PHONE REMOVED]', text)
print(result)
Phone: [PHONE REMOVED], [PHONE REMOVED]

Специальные символы в шаблоне нужно экранировать. Для литеральной замены используйте re.escape().

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

Можно проверить наличие подстроки в начале с startswith() и затем заменить через срез.

text = "prefix_data"
if text.startswith("prefix_"):
    text = "new_" + text[len("prefix_"):]
print(text)
new_data

Или с помощью регулярного выражения с якорем ^:

import re
text = "prefix_data"
result = re.sub(r'^prefix_', 'new_', text)
print(result)
new_data

Как заменить только в конце строки?

Аналогично, используйте endswith() и срез.

text = "file.txt"
if text.endswith(".txt"):
    text = text[:-4] + ".md"
print(text)
file.md

Или регулярное выражение с $:

import re
text = "file.txt"
result = re.sub(r'\.txt$', '.md', text)
print(result)
file.md

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

При использовании регулярных выражений укажите флаг re.IGNORECASE.

import re
text = "Python PYTHON python"
result = re.sub(r'python', 'Java', text, flags=re.IGNORECASE)
print(result)
Java Java Java

Без regex можно привести строку к нижнему регистру, но это изменит другие символы. Лучше использовать re.

Расширенные примеры использования replace

Замена нескольких символов с помощью translate и maketrans

Метод str.translate() в сочетании с str.maketrans() позволяет заменять отдельные символы по таблице. Это эффективнее цепочки replace для однозначных замен.

Пример
text = "hello world"
trans_table = str.maketrans({'h': 'H', 'w': 'W', 'l': 'L'})
result = text.translate(trans_table)
print(result)
HeLLo WorLd

Maketrans может заменять только символы, а не подстроки. Для подстрок используйте replace или re.sub.

Замена с использованием re.sub и функции обратного вызова

Вместо строки замены можно передать функцию, которая принимает объект Match и возвращает новую строку. Это полезно для динамической замены.

Пример
import re
text = "Цена: 123 руб., скидка 45 руб."
def replace_price(match):
    price = int(match.group(1))
    return f"{price * 0.9:.2f} руб."
result = re.sub(r'(\d+)\s*руб\.', replace_price, text)
print(result)
Цена: 110.70 руб., скидка 40.50 руб.

Замена с учетом границ слов

Чтобы заменить только целые слова, используйте шаблон с границами слов \b.

Пример
import re
text = "cat catalog category cat"
result = re.sub(r'\bcat\b', 'dog', text)
print(result)
dog catalog category dog

Если слово содержит дефис или другие символы, границы могут работать неожиданно. Тестируйте на реальных данных.

Экранирование специальных символов в регулярном выражении

Если искомый шаблон содержит метасимволы (например, точку, звездочку), используйте re.escape() для создания литеральной строки.

Пример
import re
text = "file.txt (data.txt) result.txt"
pattern = re.escape(".txt")
result = re.sub(pattern, '.csv', text)
print(result)
file.csv (data.csv) result.csv

Замена с использованием split и join (альтернативный подход)

Можно разделить строку по подстроке, а затем соединить с новой подстрокой. Это эквивалентно replace всех вхождений.

Пример
text = "a,b,c,d"
result = ','.join(text.split(','))
print(result)  # join с тем же разделителем не меняет строку
# Замена запятой на точку с запятой:
result = ';'.join(text.split(','))
print(result)
a,b,c,d
a;b;c;d

Split создает список, что может потреблять больше памяти для больших строк. Для простой замены replace обычно быстрее.

Замена последних N вхождений

Метод replace позволяет заменить только первые N вхождений, но не последние. Чтобы заменить последние, можно перевернуть строку, сделать замену первых, затем снова перевернуть.

Пример
def replace_last(text, old, new, count=1):
    reversed_text = text[::-1]
    reversed_old = old[::-1]
    reversed_new = new[::-1]
    reversed_result = reversed_text.replace(reversed_old, reversed_new, count)
    return reversed_result[::-1]

print(replace_last("one two one two one", "one", "1", 2))
one two 1 two 1

Этот способ не работает, если подстрока палиндром (например, "aba") или если замена изменяет длину. Альтернатива: использовать re.sub с отрицательным просмотром вперед.

Замена с условием (например, только вне кавычек)

С помощью регулярных выражений и lookahead/lookbehind можно ограничить замену только теми вхождениями, которые не находятся внутри определенного контекста.

Пример
import re
text = 'say "hello world" and "goodbye world"'
# Заменим "world" на "Python" только вне кавычек
# Используем lookbehind: не перед символом " кавычки?
# Это сложно. Упростим: замена всех "world" внутри кавычек?
# Пример замены только если после "world" идет не буква
result = re.sub(r'world(?![\w\"])', 'Python', text)
print(result)
say "hello world" and "goodbye world"

Для сложных контекстов используйте парсеры, например, re.finditer и анализ.

Производительность: замена в больших строках

Для многократных замен в очень больших строках может быть эффективнее собрать новую строку через список.

Пример
def fast_replace(text, old, new):
    parts = text.split(old)
    return new.join(parts)
# Пример: заменить все пробелы на подчеркивания
large_text = "a b c d " * 100000
text = large_text
result = fast_replace(text, ' ', '_')
print(len(result))
400000

Split создает список всех фрагментов, что может занять много памяти. Для очень больших строк лучше использовать replace, который оптимизирован в C.

Замена в байтовых строках (bytes)

Тип bytes также имеет метод replace, работающий аналогично.

Пример
b = b"hello world"
result = b.replace(b"world", b"Python")
print(result)
b'hello Python'

Функция replace в Python - comments

En
функция replace python (python)