Как выполняется замена фрагментов текста в Python: практическое руководство
Способы замены фрагментов строк в Python
Основной и самый эффективный метод для замены точной подстроки в строке в Python – str.replace(). Этот метод возвращает новую строку, в которой все вхождения старой подстроки заменены на новую. Исходная строка остаётся неизменной, так как строки в Python являются неизменяемыми объектами.
Синтаксис: str.replace(old, new, count). Параметр count необязателен и ограничивает количество замен.
s = 'Привет, мир! Мир прекрасен.'
new_s = s.replace('мир', 'вселенная')
print(new_s)
# Вывод: Привет, вселенная! Мир прекрасен.заменить текст python (замена подстроки в строке в python)
Обратите внимание: замена чувствительна к регистру. Слово Мир не было заменено.
Типичные проблемы:
- Если подстрока не найдена, возвращается исходная строка (без ошибки).
- Метод не изменяет строку на месте, поэтому результат нужно присваивать новой переменной.
- Для замены с игнорированием регистра str.replace не подходит, требуется использовать регулярные выражения.
Как заменить все вхождения по шаблону, а не по точной строке?
Для замены по шаблону (регулярному выражению) используется функция re.sub() из модуля re. Она позволяет заменять текст, соответствующий сложным правилам.
import re
s = 'Телефон: +7-123-456-78-90, другой: +7-987-654-32-10'
result = re.sub(r'\+7-\d{3}-\d{3}-\d{2}-\d{2}', '[КОНТАКТ]', s)
print(result)
# Вывод: Телефон: [КОНТАКТ], другой: [КОНТАКТ]Python заменить число (замена числа в python (например, в строке))
Возможные ошибки:
- Не забывайте импортировать re.
- Специальные символы (например, точка, звёздочка) в шаблоне нужно экранировать обратной косой чертой.
- Регулярные выражения могут работать медленнее на очень больших строках.
Как заменить только первое вхождение подстроки?
Используйте параметр count со значением 1 в методе str.replace().
s = 'один, два, один, три'
result = s.replace('один', 'раз', 1)
print(result)
# Вывод: раз, два, один, три
Python часть текста (извлечение подстроки из строки в python)
Можно также использовать re.sub() с параметром count=1, но для простой строки replace предпочтительнее.
Как заменить слово независимо от регистра?
Для замены без учёта регистра используйте re.sub() с флагом re.IGNORECASE.
import re
s = 'Python – лучший язык. Я люблю PYTHON.'
result = re.sub(r'python', 'JavaScript', s, flags=re.IGNORECASE)
print(result)
# Вывод: JavaScript – лучший язык. Я люблю JavaScript.Print split python (использование split с print в python)
Проблема: если замена должна сохранять исходный регистр (например, заменить Python на JavaScript, оставив PYTHON -> JAVASCRIPT), потребуется более сложная функция замены с обращением к match-объекту.
Как заменить несколько разных подстрок одновременно?
Есть несколько способов.
Способ 1: последовательный вызов replace
s = 'Кошка и собака дружат'
result = s.replace('Кошка', 'Собака').replace('собака', 'Кошка')
print(result)
# Вывод: Собака и Кошка дружат (но это может дать неверный результат при пересечении)код пробела python (код символа пробела в python)
Способ 2: с использованием цикла по словарю
s = 'Кошка и собака дружат'
mapping = {'Кошка': 'Собака', 'собака': 'Кошка'}
for old, new in mapping.items():
s = s.replace(old, new)
print(s)
# Вывод: Собака и Кошка дружатPython количество пробелов (количество пробелов в строке python)
Способ 3: через maketrans и translate – эффективен для замены отдельных символов (каждый символ заменяется ровно на один). Для подстрок разной длины не подходит.
s = 'abc123xyz'
table = str.maketrans('abc', '123')
result = s.translate(table)
print(result)
# Вывод: 123123xyzколичество символов в тексте python (подсчет количества символов в строке python)
Как заменить подстроку, используя функцию для вычисления значения замены?
В re.sub() вторым аргументом можно передать функцию, которая получает объект совпадения и возвращает строку замены.
import re
s = 'Сегодня 15.03.2025, завтра 16.03.2025'
def replace_date(match):
# match.group() – вся найденная дата
parts = match.group().split('.')
return f'{parts[2]}-{parts[1]}-{parts[0]}' # формат ISO
result = re.sub(r'\d{2}\.\d{2}\.\d{4}', replace_date, s)
print(result)
# Вывод: Сегодня 2025-03-15, завтра 2025-03-16
Расширенные примеры замены подстрок в Python
1. Замена с обратными ссылками в регулярном выражении
Использование группы захвата для перестановки частей строки.
import re
s = 'Иванов Иван, Петров Пётр'
result = re.sub(r'(\w+)\s+(\w+)', r'\2 \1', s) # меняем фамилию и имя местами
print(result)
# Вывод: Иван Иванов, Пётр Петров
Иван Иванов, Пётр Петров
2. Замена с использованием функции и сохранением регистра
Замена слова 'python' на 'JavaScript' с сохранением регистра исходного слова.
import re
def replace_preserve_case(match):
word = match.group()
if word.isupper():
return 'JAVASCRIPT'
elif word.istitle():
return 'Javascript'
else:
return 'javascript'
s = 'I love Python and PYTHON is great.'
result = re.sub(r'python', replace_preserve_case, s, flags=re.IGNORECASE)
print(result)
# Вывод: I love Javascript and JAVASCRIPT is great.
I love Javascript and JAVASCRIPT is great.
3. Замена с использованием str.replace в цепочке и предотвращение пересечения
Использование временного маркера для обхода проблемы замены, когда строки пересекаются.
s = 'aaabbb'
# хотим заменить 'aa' на 'cc' и 'ab' на 'xy' (пересечение)
s = s.replace('aa', 'TEMP') # временный маркер
s = s.replace('ab', 'xy')
s = s.replace('TEMP', 'cc')
print(s)
# Вывод: cccxyb
cccxyb
4. Замена с разделением и объединением (split и join)
Подходит, если замена должна учитывать границы слов (например, заменить слово целиком).
s = 'the quick brown fox jumps over the lazy dog'
words = s.split()
# Заменим слово 'the' на 'a', но только если оно стоит в начале или окружено пробелами
new_words = [('a' if w == 'the' else w) for w in words]
result = ' '.join(new_words)
print(result)
# Вывод: a quick brown fox jumps over a lazy dog
a quick brown fox jumps over a lazy dog
5. Замена с использованием модуля string.Template
string.Template позволяет делать шаблонную замену с помощью $ и safe_substitute.
from string import Template
t = Template('Здравствуйте, $name! Ваш заказ №$order.')
result = t.safe_substitute(name='Анна', order='12345')
print(result)
# Вывод: Здравствуйте, Анна! Ваш заказ №12345.
Здравствуйте, Анна! Ваш заказ №12345.
6. Замена с использованием регулярного выражения и границ слов (\b)
Чтобы заменить только целое слово, а не часть другого слова.
import re
s = 'cat concat catwalk'
result = re.sub(r'\bcat\b', 'dog', s)
print(result)
# Вывод: dog concat catwalk
dog concat catwalk
7. Замена с помощью bytes и bytearray (для бинарных данных)
Если требуется замена в байтовых строках, используется метод replace у bytes или bytearray (изменяемый).
b = bytearray(b'hello world')
b.replace(b'world', b'Python')
print(b)
# Вывод: bytearray(b'hello Python')
bytearray(b'hello Python')
8. Замена с подсчётом количества произведённых замен
Метод str.replace не возвращает количество, но можно использовать re.subn.
import re
s = 'a b a b a'
new_s, count = re.subn(r'a', 'X', s)
print(f'Результат: {new_s}, замен: {count}')
# Вывод: Результат: X b X b X, замен: 3
Результат: X b X b X, замен: 3
9. Замена с использованием list comprehension и условной логики
Пример замены символов с условием (заменить все цифры на звёздочку, кроме первой).
s = 'abc123def456'
result = ''.join(['*' if (ch.isdigit() and idx > 0) else ch for idx, ch in enumerate(s)])
print(result)
# Вывод: abc***def***
abc***def***
10. Замена с использованием модуля pathlib для путей файловой системы
Замена части пути с помощью PurePath.with_name или str.replace.
from pathlib import PurePosixPath
p = PurePosixPath('/home/user/docs/file.txt')
new_p = p.with_name('report.pdf') # замена имени файла
print(new_p)
# Вывод: /home/user/docs/report.pdf
/home/user/docs/report.pdf