Функция 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'