Перейти к содержанию

412 уроков, 25 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 13 из 20 Начальный 20 мин 100 XP

Экранирование и сырые строки

Как напечатать кавычку внутри кавычек и путь Windows, который не ломается? Знакомимся с обратным слэшем — символом, который меняет смысл следующего символа.

Редакция Питоники

Обратный слэш — самый «сложный» символ Python для новичка. Внутри строки он не печатается сам по себе, а меняет смысл следующего символа: превращает обычную букву n в перевод строки, обычную кавычку — в безопасную кавычку внутри кавычек. Разбираем все рабочие случаи и главный способ перестать об этом думать — сырые строки.

Кавычка внутри кавычек

В уроке 1 мы обходились выбором кавычек снаружи. Если нужны внутри СТРОГО такие же, как снаружи, — на помощь приходит экран: обратный слэш перед кавычкой говорит Python «это часть текста, а не конец строки».

экран спасает строку
print('Он сказал: \'старт\'')
print("Файл \"отчёт.xlsx\" готов")

phrase = 'Экран: обратный слэш ' + chr(92)
print(phrase)
Вывод
Он сказал: 'старт'
Файл "отчёт.xlsx" готов
Экран: обратный слэш \

\n и \t: перевод строки и табуляция

Две самые используемые последовательности: \n — перевод строки (текст продолжается с новой строки), \t — табуляция (широкий отступ для колонок). Они печатаются не как буквы с слэшем, а как реальные действия при выводе через print.

перевод строки и табуляция в деле
print('Строка один\nСтрока два')
print('Товар\tЦена')
print('Молоко\t89')
Вывод
Строка один
Строка два
Товар	Цена
Молоко	89

Сырые строки: r перед кавычками

Иногда слэш нужен КАК СИМВОЛ: путь Windows C:\temp\new, шаблон регулярного выражения. Обычная строка попытается истолковать \t и \n как табуляцию и перевод — и путь сломается. Сырая строка (буква r перед кавычками) отключает экранирование: всё содержимое — буквально.

обычная против сырой
print('C:\temp\new')
print(r'C:\temp\new')
Вывод
C:	emp
ew
C:\temp\new

Тройные кавычки: многострочный текст

Когда текст длинный и с переводами строк, экранировать каждый \n мучительно. Тройные кавычки '''...''' или """...""" позволяют писать текст в несколько физических строк — переводы строк входят в строку как есть. Так оформляют длинные описания, письма, шаблоны.

многострочный текст без экранирования
letter = '''Здравствуйте, Анна!

Ваш заказ №105 отправлен.
Ожидаемая дата доставки — 24 октября.

Команда магазина'''
print(letter[:46])
Вывод
Здравствуйте, Анна!

Ваш заказ №105 отправлен.
ЗаписьЧто этоГде применять
\'Кавычка внутри кавычекВложенные цитаты
\nПеревод строкиРазделение строк вывода
\tТабуляцияКолонки простых таблиц
\\Один обратный слэшКогда слэш нужен как символ
r'...'Сырая строка без экрановПути Windows, шаблоны
'''...'''Многострочный текстПисьма, описания, шаблоны

Экранирование — не тема для заучивания, а инструмент точности: знаете, что пишете обычный текст, — не думайте о слэшах; появился путь или шаблон — ставьте r; понадобилась кавычка внутри кавычек — поставьте экран или выберите другие кавычки снаружи.

Что такое escape-последовательности в Python

Строка в Python хранит символы, а не картинку. Символ кавычки внутри строки — это символ; символ перевода строки — тоже символ, только невидимый. Чтобы вставить в строку служебный символ, Python использует escape-последовательность: обратный слэш перед символом означает «вот это не текст, а команда». Так работает весь текстовый формат — от сообщений об ошибках до парсеров конфигураций.

перевод строки и табуляция
print('Строка один\nСтрока два')
print('Товар\tЦена')
print('Молоко\t89')
Вывод
Строка один
Строка два
Товар	Цена
Молоко	89

Две самые используемые последовательности — \n (перевод строки) и \t (табуляция). В примере они выглядят как обычный текст, но при выводе превращаются в настоящие символы: текст продолжается с новой строки, а табуляция сдвигает курсор к следующей позиции табуляции. Именно поэтому print('Товар\tЦена') даёт две колонки, а print('Товар\t\tЦена') — три: каждая \t занимает свою позицию.

ПоследовательностьЧто этоКогда применять
\nперевод строкиразделение строк вывода
\tтабуляцияколонки простых таблиц
\rвозврат кареткистарый формат Windows, CRLF
\\один обратный слэшпути, регулярные выражения
\'кавычка внутри строкивложенные цитаты
\0нулевой символредко, в протоколах
\x41символ по кодубайты и непечатаемые символы
\u200bсимвол по коду Unicodezero-width space, невидимые символы

Как увидеть невидимое: repr

Главная проблема escape-последовательностей в том, что их эффект не виден в коде. Строка с \n и строка без него выглядят одинаково, пока не напечатаешь. Функция repr решает эту задачу: она печатает строку в кавычках и показывает служебные символы escape-последовательностями.

repr показывает, что внутри
print(repr('Таб\tи перенос\n'))
print('Таб\tи перенос\n')
print(len('Таб\tи перенос\n'))
Вывод
'Таб\tи перенос\n'
Таб	и перенос

14

Первый вывод печатает escape-последовательности как текст — видно, что внутри строки девять символов плюс табуляция и перевод. Второй вывод — как строка выглядит на самом деле: табуляция раздвигает текст, перевод обрывает строку. А третий говорит, сколько символов в строке на самом деле: 13. repr — тот самый инструмент, которым стоит пользоваться, когда «строка не такая, как я думаю».

repr показывает и невидимые символы
t = '\u200bкот\u200b'
print(repr(t.strip()))
print(repr(t.strip('\u200b')))
Вывод
'\u200bкот\u200b'
'кот'

Здесь strip() не сработал — и это не баг. Zero-width space (U+200B) в Python не считается пробельным символом: у него isspace() возвращает False, поэтому strip его не трогает. repr показывает, что он внутри строки остался. А вот явный strip('\u200b') снимает его — методу передали набор символов, и он честно их срезал. Так выглядит отладка невидимых символов в данных.

Сырые строки: r перед кавычками

Иногда слэш нужен КАК СИМВОЛ: путь Windows, шаблон регулярного выражения, JSON в исходнике. Обычная строка попытается истолковать \t как табуляцию и \n как перевод — и путь сломается. Сырая строка (буква r перед кавычками) отключает экранирование: всё содержимое берётся буквально.

обычная против сырой
print('C:\temp\new')
print(r'C:\temp\new')
Вывод
C:	emp
ew
C:\temp\new

Первая печать — наглядная поломка: \t стал табуляцией (C:, табуляция, emp), а \n — переводом строки, и «ew» уехал вниз. Сырая строка печатает путь как есть. Правило простое: пути Windows и шаблоны регулярных выражений — всегда r-строки.

Тройные кавычки: многострочный текст без экранирования

Когда текст длинный и с переводами строк, экранировать каждый \n мучительно. Тройные кавычки '''...''' или \"\"\"...\"\"\" позволяют писать текст в несколько физических строк — переводы строк входят в строку как есть. Так оформляют длинные описания, письма, шаблоны и, кстати, docstring'и функций.

многострочный текст без экранирования
letter = '''Здравствуйте, Анна!

Ваш заказ №105 отправлен.
Ожидаемая дата доставки — 24 октября.

Команда магазина'''
print(letter[:46])
Вывод
Здравствуйте, Анна!

Ваш заказ №105 отправлен.

Тройные кавычки — это не отдельный тип данных, а просто удобная запись обычной строки. Внутри работают те же escape-последовательности, что и в одинарных кавычках, плюс сам перевод строки. Важная деталь: если в тексте встречается тройная кавычка, её надо экранировать — иначе строка закончится раньше времени. На практике такое бывает в текстах с примерами кода.

И ещё одна особенность, на которой спотыкаются: отступы внутри тройных кавычек становятся частью строки. Если текст сдвинут вправо «для красоты», эти пробелы попадут и в результат, и в len. Закрывающие кавычки принято ставить на уровне открывающих, без лишнего сдвига. Если нужен чистый текст без общего отступа — есть textwrap.dedent, который срезает общий префикс пробелов; разбор многострочных строк целиком — в уроке 17.

Как записать обратный слэш в строке

Это простой вопрос, на котором спотыкаются чаще, чем ожидаешь. Чтобы в строке оказался один обратный слэш, в исходнике нужно написать два: \\. Один слэш — это escape-последовательность, которая говорит Python «вот это не текст, а команда». Два слэша — это экранированный слэш, то есть настоящий символ.

один слэш и два
path = 'C:\\reports\\2026'
print(path)
print(len(path))
Вывод
C:\reports\2026
15

Здесь 15 символов: два обратных слэша в исходнике дали по одному настоящему. Альтернатива — сырая строка r'C:\reports\2026', где каждый слэш пишется один раз. Что выбрать: сырая строка читается понятнее, удвоение слэшей привычнее для тех, кто пишет на C и Java. В Python я бы выбрал сырую строку — тут она и придумана.

Отдельно стоит сказать про \0 — нулевой символ. В строках он встречается редко, но в протоколах и в некоторых бинарных форматах его используют как разделитель. В Python строка с ним прекрасно существует, но при записи в файл без указания кодировки может вызвать ошибку — многие текстовые системы не принимают нулевой байт.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

print('Имя:\tОлег')
normal = 'C:\users'
raw = r'C:\users'
print(normal == raw)
print(len('a\tb'))
Проверь себя
0 / 8

1. Что напечатает print('a\nb')?

2. Зачем экран перед кавычкой внутри строки в тех же кавычках?

3. Что напечатает print(r'C:\temp')?

4. Как записать многострочный текст без экранов перед каждым переносом?

5. Что означает \\ внутри обычной строки?

6. Как получить в строке один обратный слэш?

7. Что напечатает print(repr('а\tб'))?

8. Что произойдёт, если в строке есть zero-width space (U+200B)?

Карточки терминов
Запомнено: 0 / 6
Практика

Напечатайте в три строки с помощью одной строки кода: «Шапка отчёта», пустую строку и «Итого: 100». Затем напечатайте путь Windows C:\reports\2026 как есть, используя сырую строку.

practice.py
Вопросы и ответы по уроку

Почему путь 'C:\new\test' ломается в Python?

\n превратится в перевод строки, \t — в табуляцию: путь исказится молча. Решения: сырая строка r'C:\new\test', двойные слэши или прямые слэши — Python на Windows понимает и 'C:/new/test'.

Что означает Warning: invalid escape sequence?

В обычной строке встретился слэш перед символом, для которого экрана не существует (например, \d). Python исполнит его буквально, но предупредит: скорее всего, вы хотели сырую строку. Ставьте r.

Можно ли писать кавычки внутри f-строк?

Да, но разные с внешними: f'Он сказал "старт"' — норм. Вложенные фигурные скобки в f-строках до 3.12 требуют разных кавычек внутри выражения — с 3.12 ограничение сняли.

Почему путь 'C:\new\test' ломается в Python?

\n превратится в перевод строки, \t — в табуляцию: путь исказится молча. Решения: сырая строка r'C:\new\test', двойные слэши или прямые слэши — Python на Windows понимает и 'C:/new/test'.

Что означает Warning: invalid escape sequence?

В обычной строке встретился слэш перед символом, для которого экрана не существует (например, \d). Python исполнит его буквально, но предупредит: скорее всего, вы хотели сырую строку. Ставьте r — и предупреждение уйдёт.

Что такое сырая строка r'...' и когда её применять?

Это строка с отключённым экранированием: всё содержимое берётся буквально. Обязательна для путей Windows и шаблоны регулярных выражений, где обратный слэш — часть значения. Учтите: r-строка не может заканчиваться обратным слэшем — парсер выдаст SyntaxError.

Понравился урок? Сошлитесь на него

«Обратный слэш — самый «сложный» символ Python для новичка.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.