Экранирование и сырые строки
Как напечатать кавычку внутри кавычек и путь 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 | символ по коду Unicode | zero-width space, невидимые символы |
Как увидеть невидимое: repr
Главная проблема escape-последовательностей в том, что их эффект не виден в коде. Строка с \n и строка без него выглядят одинаково, пока не напечатаешь. Функция repr решает эту задачу: она печатает строку в кавычках и показывает служебные символы escape-последовательностями.
print(repr('Таб\tи перенос\n'))
print('Таб\tи перенос\n')
print(len('Таб\tи перенос\n'))
'Таб\tи перенос\n' Таб и перенос 14
Первый вывод печатает escape-последовательности как текст — видно, что внутри строки девять символов плюс табуляция и перевод. Второй вывод — как строка выглядит на самом деле: табуляция раздвигает текст, перевод обрывает строку. А третий говорит, сколько символов в строке на самом деле: 13. 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'))
1. Что напечатает print('a\nb')?
2. Зачем экран перед кавычкой внутри строки в тех же кавычках?
3. Что напечатает print(r'C:\temp')?
4. Как записать многострочный текст без экранов перед каждым переносом?
5. Что означает \\ внутри обычной строки?
6. Как получить в строке один обратный слэш?
7. Что напечатает print(repr('а\tб'))?
8. Что произойдёт, если в строке есть zero-width space (U+200B)?
Напечатайте в три строки с помощью одной строки кода: «Шапка отчёта», пустую строку и «Итого: 100». Затем напечатайте путь Windows C:\reports\2026 как есть, используя сырую строку.
Почему путь '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-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Строки · Урок 1
Строки в Python: текст как данные
Строка — самый частый тип данных в реальных задачах: имена, города, сообщения. Знакомимся с типом str: кавычки, len, конкатенация и умножение — и узнаём, почему строку нельзя переписать на месте.
Строки · Урок 14
Юникод: ord, chr и кодировки
Каждый символ — это число из таблицы Юникода. Учимся видеть строку глазами компьютера: ord и chr, байты через encode, и главная боль новичков — кракозябры из-за кодировок.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
Функции · Урок 18
docstring в Python: документация внутри функции
Документация живёт внутри функции: строка в тройных кавычках после def, атрибут __doc__ и честный формат короткого описания.
тройные кавычки python
Множества · Урок 2
Создание множеств: {} и set() — литерал, список, строка
Два способа создать множество: литерал в фигурных скобках и set() от списка или строки. Пустые скобки — это словарь, поэтому пустое множество пишут set().
set от строки
Строки · Урок 17
Многострочные строки и тексты
Тройные кавычки хранят текст с переводами строк: заказ из трёх строк, стихотворение, лог. Считаем длину многострочной строки, ловим отступы и режем текст методом splitlines.
многострочные строки pythonpython тройные кавычки