Коротко: экранирование это способ вставить в строку символ, который Python иначе поймет по-своему. Перед таким символом ставят обратный слэш: \" даст кавычку внутри строки в двойных кавычках, \n перенос строки, \t табуляцию, а \\ сам обратный слэш. Если же слэшей в тексте много и экранировать ничего не нужно, например в пути к файлу или в регулярном выражении, поставьте r перед открывающей кавычкой.

При работе со строками в Python иногда необходимо использовать определенные символы, которые имеют специальное значение. В этом случае на помощь приходит экранирование символов. Экранирование позволяет включить такие символы в строки без того, чтобы Python неправильно их интерпретировал. В этом руководстве мы рассмотрим основы экранирования символов в Python и изучим различные примеры его применения.

Кратко

  • Экранирование нужно, чтобы положить в строку символ, который иначе Python принял бы за часть синтаксиса.
  • Любая последовательность вида \n это один символ, а не два: длина строки "a\nb" равна трем.
  • Кавычку можно не экранировать, если строка обрамлена кавычками другого вида: "It's" и 'Она сказала "да"' работают как есть, а тройные кавычки снимают вопрос совсем.
  • Сырая строка r"C:\Users" отключает экранирование целиком, это основной прием для путей и регулярных выражений.
  • Сырая строка не может заканчиваться обратным слэшем, это синтаксическая ошибка.
  • Неизвестная последовательность вроде \d пока работает, но Python выдает на нее предупреждение SyntaxWarning.

Почему нам нужно экранирование?

Строки в Python заключаются в кавычки: "двойные кавычки" или 'одинарные кавычки'. Но что, если вам нужно использовать кавычку внутри строки, которая уже заключена в такой же тип кавычек? Или что, если вы хотите добавить перенос строки без перехода на новую строку в коде? В таких случаях экранирование символов позволяет сказать Python: "Этот символ должен интерпретироваться иначе!"

Основные символы экранирования

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

Последовательность Что вставляет в строку Пример
\\ один обратный слэш "Это обратный слэш: \\"
\" двойную кавычку внутри строки в двойных кавычках "Она сказала: \"Привет!\""
\' апостроф внутри строки в одинарных кавычках 'Он сказал: \'Привет\''
\n перевод строки, один символ с кодом 10 "Первая строка\nВторая строка"
\r возврат каретки, код 13; пара \r\n это перенос строки в файлах Windows и в сетевых протоколах "строка\r\n"
\t табуляцию, код 9 "Текст с отступом\tтекст"
\b управляющий символ backspace, код 8; из строки он ничего не удаляет в "ab\bc" четыре символа
\xhh символ по шестнадцатеричному коду "\x41" даст A
\uXXXX символ Unicode по его коду "\u041f" даст П

Примеры использования экранирования символов в Python

Вот несколько примеров экранирования символов в действии:

# Пример 1: Добавление кавычек в строку
text = "Он сказал, \"Добро пожаловать в Python!\""
print(text)
# Вывод: Он сказал, "Добро пожаловать в Python!"

# Пример 2: Добавление новой строки
message = "Привет\nМир"
print(message)
# Вывод:
# Привет
# Мир

# Пример 3: Добавление табуляции
items = "Элемент1\tЭлемент2\tЭлемент3"
print(items)
# Вывод: Элемент1   Элемент2   Элемент3

Сырые строки в Python

В некоторых случаях вам может понадобиться, чтобы Python игнорировал символы экранирования. Например, при работе с путями к файлам или регулярными выражениями. Это возможно с помощью сырых строк, которые создаются путем добавления r перед началом строки (полный перечень последовательностей есть в справочнике Python), например:

# Пример сырой строки
path = r"C:\Users\YourName\Documents\file.txt"
print(path)
# Вывод: C:\Users\YourName\Documents\file.txt

В этом примере Python интерпретирует path как сырую строку и не воспринимает \ как символ экранирования.

Тройные кавычки и f-строки

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

# Тройные кавычки: переносы и обе кавычки без единого слэша
text = """Он сказал: "Привет!" и ушел, не сказав 'пока'.
Вторая строка."""
print(text)
# Вывод:
# Он сказал: "Привет!" и ушел, не сказав 'пока'.
# Вторая строка.

Обратный слэш пригодится и тут, но в другой роли: поставленный последним символом строки, он гасит перенос, и две строки внутри тройных кавычек склеятся в одну. Второй прием это f-строки. Долгое время обратный слэш внутри фигурных скобок в них был запрещен, и разделитель приходилось выносить в отдельную переменную. С Python 3.12 ограничение сняли:

# Python 3.12 и новее: слэш внутри выражения f-строки разрешен
items = ["a", "b"]
print(f"{'\n'.join(items)}")
# Вывод:
# a
# b

На более старых версиях тот же результат получают в два шага: сначала sep = chr(10) или nl = "\n", потом print(f"{nl.join(items)}").

Экранирование символов в Python по сравнению с другими языками

Если вы знакомы с Java, C++ или другими языками программирования, то, возможно, заметите, что последовательности экранирования в Python довольно схожи. Однако сырые строки есть не во всех языках. В C++ они появились в C++11 в виде R"(...)", в C# их роль играют verbatim-строки @"...", а вот в Java сырых строк нет: предложение добавить их отозвали еще до релиза, а текстовые блоки из Java 15 избавляют от кавычек и переносов, но сами последовательности экранирования по-прежнему обрабатывают. Поэтому в Java пути и регулярные выражения пишут с удвоенными слэшами, и привычка ставить r перед строкой там не сработает.

Резюме

Экранирование символов в Python необходимо для правильной обработки специальных символов в строках. С помощью символов экранирования и сырых строк можно управлять кавычками, табуляцией и переносами строк. Запомните основные символы экранирования:

  • \\ - Обратный слэш
  • \' и \" - Одинарные и двойные кавычки
  • \n - Новая строка
  • \t - Табуляция

Освоение экранирования символов в Python поможет сделать ваш код более чистым и функциональным.

Вопросы и ответы

Что такое экранирование символов в Python?

Это способ сказать интерпретатору, что следующий символ надо понимать буквально, а не как часть синтаксиса. Записывается обратным слэшем перед символом: \" вставит кавычку, \n перенос строки, \\ сам обратный слэш. Вся последовательность занимает в строке ровно один символ.

Как вставить кавычку внутрь строки?

Если строка обрамлена кавычками того же вида, экранируйте: "Она сказала: \"Привет!\"". Но чаще проще обойтись без экранирования и взять кавычки другого вида: 'Она сказала "Привет!"' и "It's" работают без единого слэша. Для длинных текстов с обоими видами кавычек подойдут тройные кавычки.

Почему путь C:\Users вызывает ошибку?

Потому что Python видит в нем не разделители каталогов, а начало escape-последовательностей. На строке "C:\Users\YourName" он споткнется об \U и сообщит SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes. Решений три: поставить r перед строкой, удвоить каждый слэш или писать путь через прямые слэши, их Windows тоже понимает.

Что значит предупреждение invalid escape sequence?

Так Python реагирует на последовательность, которой не существует, например "\d+" в регулярном выражении. Сейчас такая строка работает и слэш в ней сохраняется, но интерпретатор выдает SyntaxWarning: invalid escape sequence и предупреждает, что в будущем поведение изменится. Лечится сырой строкой r"\d+" или удвоением слэша.

Правда ли, что \b удаляет предыдущий символ?

Нет. \b вставляет в строку управляющий символ backspace с кодом 8, и длина строки от этого только растет: в "ab\bc" ровно четыре символа. Удаления не происходит, просто терминал при выводе может сдвинуть курсор назад и нарисовать следующий символ поверх предыдущего. Чтобы действительно убрать символ, работайте со срезами строки.

Можно ли закончить сырую строку обратным слэшем?

Нет. Запись r"C:\" дает ошибку SyntaxError: unterminated string literal: даже в сырой строке слэш не дает закрывающей кавычке завершить литерал. Обходной путь это склейка: r"C:\Users" + "\\".

Читайте также: