> **Источник:** https://python-all.ru/3.5/library/string.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 6.1. [`string`](https://python-all.ru/3.5/library/string.html#module-string) – Общие операции со строками

**Исходный код:** [Lib/string.py](https://python-all.ru/src/3.5/Lib/string.py)

---

> **См. также**
>
> [Тип текстовой последовательности – str](https://python-all.ru/3.5/library/stdtypes.html#textseq)
>
> [Методы строк](https://python-all.ru/3.5/library/stdtypes.html#string-methods)

## 6.1.1. Строковые константы

Константы, определённые в этом модуле:

#### `string.ascii_letters`

Конкатенация констант [`ascii_lowercase`](https://python-all.ru/3.5/library/string.html#string.ascii_lowercase) и [`ascii_uppercase`](https://python-all.ru/3.5/library/string.html#string.ascii_uppercase), описанных ниже. Это значение не зависит от локали.

#### `string.ascii_lowercase`

Строчные буквы `'abcdefghijklmnopqrstuvwxyz'`. Это значение не зависит от локали и не изменится.

#### `string.ascii_uppercase`

Заглавные буквы `'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`. Это значение не зависит от локали и не изменится.

#### `string.digits`

Строка `'0123456789'`.

#### `string.hexdigits`

Строка `'0123456789abcdefABCDEF'`.

#### `string.octdigits`

Строка `'01234567'`.

#### `string.punctuation`

Строка символов ASCII, которые считаются знаками пунктуации в локали `C`.

#### `string.printable`

Строка ASCII-символов, которые считаются печатаемыми. Представляет собой комбинацию [`digits`](https://python-all.ru/3.5/library/string.html#string.digits), [`ascii_letters`](https://python-all.ru/3.5/library/string.html#string.ascii_letters), [`punctuation`](https://python-all.ru/3.5/library/string.html#string.punctuation), и [`whitespace`](https://python-all.ru/3.5/library/string.html#string.whitespace).

#### `string.whitespace`

Строка, содержащая все ASCII-символы, которые считаются пробельными. Включает символы: пробел, табуляция, перевод строки, возврат каретки, прогон страницы и вертикальная табуляция.

## 6.1.2. Пользовательское форматирование строк

Встроенный класс строк предоставляет возможность выполнять сложные замены переменных и форматирование значений с помощью метода [`format()`](https://python-all.ru/3.5/library/stdtypes.html#str.format), описанного в [**PEP 3101**](https://python-all.ru/3.5/library/string.html). Класс [`Formatter`](https://python-all.ru/3.5/library/string.html#string.Formatter) из модуля [`string`](https://python-all.ru/3.5/library/string.html#module-string) позволяет создавать и настраивать собственное поведение форматирования строк, используя ту же реализацию, что и встроенный метод [`format()`](https://python-all.ru/3.5/library/stdtypes.html#str.format).

#### `class string.Formatter`

Класс [`Formatter`](https://python-all.ru/3.5/library/string.html#string.Formatter) имеет следующие открытые методы:

#### `format(format_string, *args, **kwargs)`

Основной метод API. Принимает строку форматирования и произвольный набор позиционных и именованных аргументов. Это просто обёртка, вызывающая [`vformat()`](https://python-all.ru/3.5/library/string.html#string.Formatter.vformat).

Устарело с версии 3.5: Передача строки формата в качестве именованного аргумента *format\_string* устарела.

#### `vformat(format_string, args, kwargs)`

Эта функция выполняет фактическую работу по форматированию. Она представлена как отдельная функция на случай, если нужно передать предопределённый словарь аргументов, вместо распаковки и повторной упаковки словаря в отдельные аргументы с помощью синтаксиса `*args` и `**kwargs`. [`vformat()`](https://python-all.ru/3.5/library/string.html#string.Formatter.vformat) выполняет разбивку строки форматирования на символьные данные и поля замены. Затем вызываются различные методы, описанные ниже.

Кроме того, [`Formatter`](https://python-all.ru/3.5/library/string.html#string.Formatter) определяет ряд методов, предназначенных для переопределения в подклассах:

#### `parse(format_string)`

Перебирает format\_string и возвращает итерируемый объект кортежей (*literal\_text*, *field\_name*, *format\_spec*, *conversion*). Используется в [`vformat()`](https://python-all.ru/3.5/library/string.html#string.Formatter.vformat) для разбивки строки на буквальный текст или поля замены.

Значения в кортеже концептуально представляют собой фрагмент литерального текста, за которым следует одно поле подстановки. Если литерального текста нет (что может произойти, когда два поля подстановки идут подряд), то *literal\_text* будет строкой нулевой длины. Если поля подстановки нет, то значения *field\_name*, *format\_spec* и *conversion* будут равны `None`.

#### `get_field(field_name, args, kwargs)`

По заданному *field\_name*, возвращённому [`parse()`](https://python-all.ru/3.5/library/string.html#string.Formatter.parse) (см. выше), преобразует его в объект для форматирования. Возвращает кортеж (obj, used\_key). По умолчанию принимает строки вида, определённого в [**PEP 3101**](https://python-all.ru/3.5/library/string.html), например, “0\[name\]” или “label.title”. *args* и *kwargs* передаются так же, как в [`vformat()`](https://python-all.ru/3.5/library/string.html#string.Formatter.vformat). Возвращаемое значение *used\_key* имеет тот же смысл, что параметр *key* у [`get_value()`](https://python-all.ru/3.5/library/string.html#string.Formatter.get_value).

#### `get_value(key, args, kwargs)`

Извлекает значение заданного поля. Аргумент *key* может быть целым числом или строкой. Если это целое число, оно представляет индекс позиционного аргумента в *args*; если строка – именованный аргумент в *kwargs*.

Параметр *args* устанавливается в список позиционных аргументов для [`vformat()`](https://python-all.ru/3.5/library/string.html#string.Formatter.vformat), а параметр *kwargs* – в словарь именованных аргументов.

Для составных имён полей эти функции вызываются только для первого компонента имени поля; последующие компоненты обрабатываются через обычные операции с атрибутами и индексацией.

Например, выражение поля «0.name» вызовет [`get_value()`](https://python-all.ru/3.5/library/string.html#string.Formatter.get_value) с аргументом *key*, равным 0. Атрибут `name` будет получен после возврата из [`get_value()`](https://python-all.ru/3.5/library/string.html#string.Formatter.get_value) вызовом встроенной функции [`getattr()`](https://python-all.ru/3.5/library/functions.html#getattr).

Если индекс или ключевое слово ссылаются на несуществующий элемент, должно быть возбуждено исключение [`IndexError`](https://python-all.ru/3.5/library/exceptions.html#IndexError) или [`KeyError`](https://python-all.ru/3.5/library/exceptions.html#KeyError).

#### `check_unused_args(used_args, args, kwargs)`

Реализует проверку на неиспользованные аргументы при необходимости. Аргументы этой функции – множество всех ключей аргументов, которые фактически были использованы в строке форматирования (целые числа для позиционных аргументов и строки для именованных), а также ссылка на *args* и *kwargs*, переданные в vformat. Множество неиспользованных аргументов можно вычислить по этим параметрам. Предполагается, что [`check_unused_args()`](https://python-all.ru/3.5/library/string.html#string.Formatter.check_unused_args) возбуждает исключение, если проверка не пройдена.

#### `format_field(value, format_spec)`

[`format_field()`](https://python-all.ru/3.5/library/string.html#string.Formatter.format_field) просто вызывает глобальную встроенную функцию [`format()`](https://python-all.ru/3.5/library/functions.html#format). Метод предоставлен, чтобы подклассы могли переопределить его.

#### `convert_field(value, conversion)`

Преобразует значение (возвращённое [`get_field()`](https://python-all.ru/3.5/library/string.html#string.Formatter.get_field)) с учётом типа преобразования (как в кортеже, возвращаемом методом [`parse()`](https://python-all.ru/3.5/library/string.html#string.Formatter.parse)). Версия по умолчанию понимает типы преобразования 's' (str), 'r' (repr) и 'a' (ascii).

## 6.1.3. Синтаксис строк форматирования

Метод [`str.format()`](https://python-all.ru/3.5/library/stdtypes.html#str.format) и класс [`Formatter`](https://python-all.ru/3.5/library/string.html#string.Formatter) используют одинаковый синтаксис для строк форматирования (хотя в случае [`Formatter`](https://python-all.ru/3.5/library/string.html#string.Formatter) подклассы могут определять собственный синтаксис строк форматирования).

Строки форматирования содержат «поля замены», заключённые в фигурные скобки `{}`. Всё, что не находится в скобках, считается буквальным текстом и копируется в вывод без изменений. Если нужно включить символ скобки в буквальный текст, его можно экранировать удвоением: `{{` и `}}`.

Грамматика поля замены выглядит следующим образом:

> ```
>
> replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
> field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
> arg_name          ::=  [identifier | integer]
> attribute_name    ::=  identifier
> element_index     ::=  integer | index_string
> index_string      ::=  <any source character except "]"> +
> conversion        ::=  "r" | "s" | "a"
> format_spec       ::=  <described in the next section>
> ```

В менее формальных терминах, поле замены может начинаться с *field\_name*, который задаёт объект, чьё значение должно быть отформатировано и вставлено в вывод вместо поля замены. За *field\_name* может опционально следовать поле *conversion*, которому предшествует восклицательный знак `'!'`, и *format\_spec*, которому предшествует двоеточие `':'`. Они задают нестандартный формат для заменяемого значения.

См. также раздел [Мини-язык спецификации формата](https://python-all.ru/3.5/library/string.html#formatspec).

Сам *field\_name* начинается с *arg\_name*, который является либо числом, либо ключевым словом. Если это число, оно относится к позиционному аргументу, а если ключевое слово – к именованному аргументу. Если числовые arg\_names в строке форматирования идут по порядку 0, 1, 2, …, их все можно опустить (а не только некоторые), и числа 0, 1, 2, … будут автоматически подставлены в этом порядке. Поскольку *arg\_name* не ограничен кавычками, невозможно указать произвольные ключи словаря (например, строки `'10'` или `':-]'`) внутри строки форматирования. За *arg\_name* может следовать любое количество выражений индекса или атрибута. Выражение вида `'.name'` выбирает именованный атрибут с помощью [`getattr()`](https://python-all.ru/3.5/library/functions.html#getattr), а выражение вида `'[index]'` выполняет поиск по индексу с помощью [`__getitem__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__getitem__).

Изменено в версии 3.1: Указатели позиционных аргументов можно опускать, поэтому `'{} {}'` эквивалентно `'{0} {1}'`.

Несколько простых примеров строк форматирования:

```python
"First, thou shalt count to {0}"  # Ссылается на первый позиционный аргумент
"Bring me a {}"                   # Неявно ссылается на первый позиционный аргумент
"From {} to {}"                   # То же, что "From {0} to {1}"
"My quest is {name}"              # Ссылается на именованный аргумент 'name'
"Weight in tons {0.weight}"       # Атрибут 'weight' первого позиционного аргумента
"Units destroyed: {players[0]}"   # Первый элемент именованного аргумента 'players'.
```

Поле *conversion* вызывает приведение типа перед форматированием. Обычно задачу форматирования значения выполняет его собственный метод [`__format__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__format__). Однако в некоторых случаях требуется принудительно отформатировать тип как строку, переопределяя его собственное определение форматирования. Преобразовав значение в строку перед вызовом [`__format__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__format__), можно обойти обычную логику форматирования.

В настоящее время поддерживаются три флага преобразования: `'!s'` вызывает [`str()`](https://python-all.ru/3.5/library/stdtypes.html#str) для значения, `'!r'` вызывает [`repr()`](https://python-all.ru/3.5/library/functions.html#repr), и `'!a'` вызывает [`ascii()`](https://python-all.ru/3.5/library/functions.html#ascii).

Несколько примеров:

```python
"Harold's a clever {0!s}"        # Сначала вызывает str() для аргумента
"Bring out the holy {name!r}"    # Сначала вызывает repr() для аргумента
"More {!a}"                      # Сначала вызывает ascii() для аргумента
```

Поле *format\_spec* содержит спецификацию того, как должно быть представлено значение, включая такие детали, как ширина поля, выравнивание, заполнение, десятичная точность и так далее. Каждый тип значения может определять свой собственный «мини-язык форматирования» или интерпретацию *format\_spec*.

Большинство встроенных типов поддерживают общий мини-язык форматирования, который описан в следующем разделе.

Поле *format\_spec* также может содержать вложенные поля подстановки. Эти вложенные поля подстановки могут содержать имя поля, флаг преобразования и спецификацию формата, но более глубокая вложенность не допускается. Поля подстановки внутри format\_spec подставляются перед интерпретацией строки *format\_spec*. Это позволяет динамически задавать форматирование значения.

Смотрите раздел [Примеры форматирования](https://python-all.ru/3.5/library/string.html#formatexamples) для примеров.

### 6.1.3.1. Мини-язык спецификаций формата

«Спецификации формата» используются внутри полей замены, содержащихся в строке форматирования, чтобы определить, как представляются отдельные значения (см. [Синтаксис строк форматирования](https://python-all.ru/3.5/library/string.html#formatstrings)). Они также могут передаваться напрямую встроенной функции [`format()`](https://python-all.ru/3.5/library/functions.html#format). Каждый форматируемый тип может определять, как должна интерпретироваться спецификация формата.

Большинство встроенных типов реализуют следующие параметры для спецификаций формата, хотя некоторые параметры форматирования поддерживаются только числовыми типами.

Общее правило: пустая строка формата (`""`) даёт тот же результат, что и вызов [`str()`](https://python-all.ru/3.5/library/stdtypes.html#str) для значения. Непустая строка формата обычно изменяет результат.

Общий вид *стандартного спецификатора формата*:

```

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <any character>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
```

Если указано допустимое значение *align*, перед ним может стоять символ *fill*, которым может быть любой символ, а если он опущен, по умолчанию используется пробел. Невозможно использовать литеральную фигурную скобку («`{`» или «`}`») в качестве символа *fill* при использовании метода [`str.format()`](https://python-all.ru/3.5/library/stdtypes.html#str.format). Однако можно вставить фигурную скобку с помощью вложенного поля замены. Это ограничение не влияет на функцию [`format()`](https://python-all.ru/3.5/library/functions.html#format).

Значение различных параметров выравнивания следующее:

> | Параметр | Значение |
> | --- | --- |
> | `'<'` | Выравнивает поле по левому краю в пределах доступного пространства (это значение по умолчанию для большинства объектов). |
> | `'>'` | Выравнивает поле по правому краю в пределах доступного пространства (это значение по умолчанию для чисел). |
> | `'='` | Принудительно размещает отступ после знака (если он есть), но перед цифрами. Используется для вывода полей в формате ‘+000000120’. Эта опция выравнивания действительна только для числовых типов. Она становится значением по умолчанию, когда ‘0’ непосредственно предшествует ширине поля. |
> | `'^'` | Выравнивает поле по центру в пределах доступного пространства. |

Обратите внимание, что если не задана минимальная ширина поля, ширина поля всегда будет равна размеру заполняемых данных, поэтому в этом случае параметр выравнивания не имеет смысла.

Параметр *sign* допустим только для числовых типов и может быть одним из следующих:

> | Параметр | Значение |
> | --- | --- |
> | `'+'` | указывает, что знак должен выводиться как для положительных, так и для отрицательных чисел. |
> | `'-'` | указывает, что знак должен выводиться только для отрицательных чисел (это поведение по умолчанию). |
> | пробел | указывает, что перед положительными числами должен ставиться пробел, а перед отрицательными – знак минус. |

Опция `'#'` приводит к использованию «альтернативной формы» для преобразования. Альтернативная форма определяется по-разному для разных типов. Эта опция действительна только для целых чисел, чисел с плавающей запятой, комплексных чисел и типа Decimal. Для целых чисел при использовании двоичного, восьмеричного или шестнадцатеричного вывода эта опция добавляет к выходному значению соответствующий префикс `'0b'`, `'0o'` или `'0x'`. Для чисел с плавающей запятой, комплексных чисел и Decimal альтернативная форма приводит к тому, что результат преобразования всегда содержит символ десятичной точки, даже если за ним не следует цифр. Обычно символ десятичной точки появляется в результате этих преобразований только если за ним следует цифра. Кроме того, для преобразований `'g'` и `'G'` хвостовые нули не удаляются из результата.

Параметр `','` указывает на использование запятой в качестве разделителя тысяч. Для разделителя, учитывающего локаль, используйте тип представления целых чисел `'n'`.

Изменено в версии 3.1: Добавлена опция `','` (см. также [**PEP 378**](https://python-all.ru/3.5/library/string.html)).

*ширина* – целое десятичное число, задающее минимальную ширину поля. Если не указано, ширина поля определяется содержимым.

Если явное выравнивание не задано, перед полем *width* с символом ноля (`'0'`) включается знако-зависимое заполнение нулями для числовых типов. Это эквивалентно символу *fill* равному `'0'` с типом *alignment* равным `'='`.

Параметр *precision* – десятичное число, указывающее, сколько цифр должно быть отображено после десятичной точки для значения с плавающей запятой, отформатированного с помощью `'f'` и `'F'`, или до и после десятичной точки для значения с плавающей запятой, отформатированного с помощью `'g'` или `'G'`. Для нечисловых типов этот параметр указывает максимальный размер поля – другими словами, сколько символов будет использовано из содержимого поля. Параметр *precision* не допускается для целых чисел.

Наконец, *тип* определяет, как должны быть представлены данные.

Доступные типы представления для строк:

> | Тип | Значение |
> | --- | --- |
> | `'s'` | Формат строки. Это тип по умолчанию для строк и может быть опущен. |
> | None | То же, что и `'s'`. |

Доступные типы представления для целых чисел:

> | Тип | Значение |
> | --- | --- |
> | `'b'` | Двоичный формат. Выводит число в системе с основанием 2. |
> | `'c'` | Символ. Преобразует целое число в соответствующий символ Юникода перед выводом. |
> | `'d'` | Десятичное целое. Выводит число в системе с основанием 10. |
> | `'o'` | Восьмеричный формат. Выводит число в системе с основанием 8. |
> | `'x'` | Шестнадцатеричный формат. Выводит число по основанию 16, используя строчные буквы для цифр больше 9. |
> | `'X'` | Шестнадцатеричный формат. Выводит число по основанию 16, используя заглавные буквы для цифр больше 9. |
> | `'n'` | Число. То же, что и `'d'`, за исключением того, что для вставки соответствующих разделителей групп разрядов используется текущая локаль. |
> | None | То же, что и `'d'`. |

В дополнение к указанным выше типам представления целые числа можно форматировать с помощью типов представления чисел с плавающей запятой, перечисленных ниже (кроме `'n'` и `None`). В этом случае для преобразования целого числа в число с плавающей запятой перед форматированием используется [`float()`](https://python-all.ru/3.5/library/functions.html#float).

Доступные типы представления для чисел с плавающей запятой и десятичных чисел:

> | Тип | Значение |
> | --- | --- |
> | `'e'` | Экспоненциальная запись. Выводит число в научной нотации, используя букву 'e' для обозначения показателя степени. Точность по умолчанию – `6`. |
> | `'E'` | Экспоненциальная запись. То же, что и `'e'`, за исключением того, что в качестве разделителя используется прописная буква 'E'. |
> | `'f'` | Фиксированная точка. Отображает число в формате с фиксированной точкой. Точность по умолчанию: `6`. |
> | `'F'` | Фиксированная точка. То же, что и `'f'`, но преобразует `nan` в `NAN` и `inf` в `INF`. |
> | `'g'` | Общий формат. Для заданной точности `p >= 1` округляет число до `p` значащих цифр, а затем форматирует результат либо в формате с фиксированной точкой, либо в научной нотации, в зависимости от его величины. Точные правила таковы: предположим, что результат, отформатированный с типом представления `'e'` и точностью `p-1`, имел бы экспоненту `exp`. Тогда если `-4 <= exp < p`, число форматируется с типом представления `'f'` и точностью `p-1-exp`. В противном случае число форматируется с типом представления `'e'` и точностью `p-1`. В обоих случаях незначащие завершающие нули удаляются из мантиссы, а десятичная точка также удаляется, если после неё не осталось цифр. Положительная и отрицательная бесконечность, положительный и отрицательный ноль, а также nan форматируются как `inf`, `-inf`, `0`, `-0` и `nan` соответственно, независимо от точности. Точность `0` считается эквивалентной точности `1`. Точность по умолчанию – `6`. |
> | `'G'` | Общий формат. То же, что и `'g'`, за исключением того, что переключается на `'E'`, если число становится слишком большим. Представления бесконечности и NaN также переводятся в верхний регистр. |
> | `'n'` | Число. То же, что и `'g'`, за исключением того, что для вставки соответствующих разделителей групп разрядов используется текущая локаль. |
> | `'%'` | Проценты. Умножает число на 100 и выводит в фиксированном формате (`'f'`) с последующим знаком процента. |
> | None | Аналогично `'g'`, за исключением того, что запись с фиксированной точкой, при использовании, содержит хотя бы одну цифру после десятичной точки. Точность по умолчанию настолько высока, насколько необходимо для представления конкретного значения. Общий эффект заключается в том, чтобы соответствовать выводу [`str()`](https://python-all.ru/3.5/library/stdtypes.html#str), изменённому другими модификаторами формата. |

### 6.1.3.2. Примеры форматирования

Этот раздел содержит примеры синтаксиса [`str.format()`](https://python-all.ru/3.5/library/stdtypes.html#str.format) и сравнение со старым форматированием `%`.

В большинстве случаев синтаксис похож на старое форматирование `%`, с добавлением `{}` и использованием `:` вместо `%`. Например, `'%03.2f'` можно преобразовать в `'{:03.2f}'`.

Новый синтаксис форматирования также поддерживает новые и другие параметры, показанные в следующих примерах.

Доступ к аргументам по позиции:

```python
>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c')  # Только для версии 3.1+
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc')      # Распаковка последовательности аргументов
'c, b, a'
>>> '{0}{1}{0}'.format('abra', 'cad')   # индексы аргументов могут повторяться
'abracadabra'
```

Доступ к аргументам по имени:

```python
>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'
```

Доступ к атрибутам аргументов:

```python
>>> c = 3-5j
>>> ('The complex number {0} is formed from the real part {0.real} '
...  'and the imaginary part {0.imag}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
>>> class Point:
...     def __init__(self, x, y):
...         self.x, self.y = x, y
...     def __str__(self):
...         return 'Point({self.x}, {self.y})'.format(self=self)
...
>>> str(Point(4, 2))
'Point(4, 2)'
```

Доступ к элементам аргументов:

```python
>>> coord = (3, 5)
>>> 'X: {0[0]};  Y: {0[1]}'.format(coord)
'X: 3;  Y: 5'
```

Замена `%s` и `%r`:

```python
>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"
```

Выравнивание текста и указание ширины:

```python
>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # использовать '*' в качестве символа заполнения
'***********centered***********'
```

Замена `%+f`, `%-f` и `% f` и указание знака:

```python
>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # отображать всегда
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14)  # для положительных чисел отображать пробел
' 3.140000; -3.140000'
>>> '{:-f}; {:-f}'.format(3.14, -3.14)  # отображать только минус – то же, что и '{:f}; {:f}'
'3.140000; -3.140000'
```

Замена `%x` и `%o` и преобразование значения в разные системы счисления:

```python
>>> # format также поддерживает двоичные числа
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # с префиксом 0x, 0o или 0b:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'
```

Использование запятой в качестве разделителя тысяч:

```python
>>> '{:,}'.format(1234567890)
'1,234,567,890'
```

Выражение процентов:

```python
>>> points = 19
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'
```

Использование форматирования с учётом типа:

```python
>>> import datetime
>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'
```

Вложенные аргументы и более сложные примеры:

```python
>>> for align, text in zip('<^>', ['left', 'center', 'right']):
...     '{0:{fill}{align}16}'.format(text, fill=align, align=align)
...
'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>> octets = [192, 168, 0, 1]
>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)
'C0A80001'
>>> int(_, 16)
3232235521
>>>
>>> width = 5
>>> for num in range(5,12): 
...     for base in 'dXob':
...         print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')
...     print()
...
    5     5     5   101
    6     6     6   110
    7     7     7   111
    8     8    10  1000
    9     9    11  1001
   10     A    12  1010
   11     B    13  1011
```

## 6.1.4. Шаблонные строки

Шаблоны предоставляют более простые подстановки строк, как описано в [**PEP 292**](https://python-all.ru/3.5/library/string.html). Вместо обычных подстановок на основе `%`, шаблоны поддерживают подстановки на основе `$`, используя следующие правила:

- `$$` – это escape-последовательность; она заменяется на один символ `$`.
- `$identifier` обозначает заполнитель подстановки, соответствующий ключу отображения `"identifier"`. По умолчанию `"identifier"` ограничивается любой алфавитно-цифровой строкой ASCII без учёта регистра (включая подчёркивания), которая начинается с подчёркивания или буквы ASCII. Первый символ, не являющийся идентификатором, после символа `$` завершает спецификацию этого заполнителя.
- `${identifier}` эквивалентно `$identifier`. Это необходимо, когда после заполнителя следуют допустимые символы идентификатора, не являющиеся частью заполнителя, например `"${noun}ification"`.

Любое другое появление `$` в строке приведёт к вызову исключения [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError).

Модуль [`string`](https://python-all.ru/3.5/library/string.html#module-string) предоставляет класс [`Template`](https://python-all.ru/3.5/library/string.html#string.Template), реализующий эти правила. Методы [`Template`](https://python-all.ru/3.5/library/string.html#string.Template):

#### `class string.Template(template)`

Конструктор принимает единственный аргумент – строку шаблона.

#### `substitute(mapping, **kwds)`

Выполняет подстановку в шаблон, возвращая новую строку. *mapping* – это любой объект, подобный словарю, ключи которого соответствуют плейсхолдерам в шаблоне. В качестве альтернативы можно указать именованные аргументы, где имена аргументов являются плейсхолдерами. Если указаны и *mapping*, и *kwds*, и есть дубликаты, то плейсхолдеры из *kwds* имеют приоритет.

#### `safe_substitute(mapping, **kwds)`

Как и [`substitute()`](https://python-all.ru/3.5/library/string.html#string.Template.substitute), за исключением того, что если плейсхолдеры отсутствуют в *mapping* и *kwds*, то вместо возбуждения исключения [`KeyError`](https://python-all.ru/3.5/library/exceptions.html#KeyError) исходный плейсхолдер остаётся в результирующей строке без изменений. Кроме того, в отличие от [`substitute()`](https://python-all.ru/3.5/library/string.html#string.Template.substitute), любые другие появления `$` просто возвращают `$`, а не возбуждают [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError).

Хотя другие исключения всё ещё могут возникать, этот метод называется «безопасным» поскольку подстановки всегда пытаются вернуть используемую строку вместо возбуждения исключения. В другом смысле [`safe_substitute()`](https://python-all.ru/3.5/library/string.html#string.Template.safe_substitute) может быть чем угодно, кроме безопасного, так как он молча игнорирует некорректные шаблоны, содержащие незакрытые разделители, непарные скобки или заполнители, не являющиеся допустимыми идентификаторами Python.

Экземпляры [`Template`](https://python-all.ru/3.5/library/string.html#string.Template) также предоставляют один открытый атрибут данных:

#### `template`

Это объект, переданный в аргумент *template* конструктора. В общем случае его не следует изменять, но доступ только для чтения не гарантируется.

Вот пример использования Template:

```python
>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
...
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'
```

Расширенное использование: можно создать подклассы [`Template`](https://python-all.ru/3.5/library/string.html#string.Template), чтобы настроить синтаксис заполнителя, символ-разделитель или всё регулярное выражение, используемое для разбора шаблонных строк. Для этого можно переопределить следующие атрибуты класса:

- *разделитель* – это литеральная строка, описывающая разделитель, предваряющий заполнитель. Значение по умолчанию – `$`. Обратите внимание, что это *не* должно быть регулярным выражением, так как реализация при необходимости вызовет [`re.escape()`](https://python-all.ru/3.5/library/re.html#re.escape) для этой строки.
- *idpattern* – это регулярное выражение, описывающее шаблон для заполнителей без фигурных скобок (скобки будут добавлены автоматически по мере необходимости). Значением по умолчанию является регулярное выражение `[_a-z][_a-z0-9]*`.
- *flags* – флаги регулярного выражения, которые будут применяться при компиляции регулярного выражения, используемого для распознавания подстановок. Значение по умолчанию – `re.IGNORECASE`. Обратите внимание, что `re.VERBOSE` всегда будет добавляться к флагам, поэтому пользовательские *idpattern* должны соответствовать соглашениям для многострочных регулярных выражений.

  Новое в версии 3.2.

В качестве альтернативы можно указать всё регулярное выражение, переопределив атрибут класса *pattern*. Если это сделать, значение должно быть объектом регулярного выражения с четырьмя именованными захватывающими группами. Эти группы соответствуют правилам, приведённым выше, а также правилу недопустимых плейсхолдеров:

- *escaped* – эта группа соответствует управляющей последовательности, например `$$`, в шаблоне по умолчанию.
- *named* – эта группа соответствует имени плейсхолдера без скобок; она не должна включать разделитель в захватывающую группу.
- *braced* – эта группа соответствует имени плейсхолдера, заключённого в скобки; она не должна включать ни разделитель, ни скобки в захватывающую группу.
- *invalid* – эта группа соответствует любому другому шаблону разделителя (обычно одиночному разделителю), и она должна появляться последней в регулярном выражении.

## 6.1.5. Вспомогательные функции

#### `string.capwords(s, sep=None)`

Разбивает аргумент на слова, используя [`str.split()`](https://python-all.ru/3.5/library/stdtypes.html#str.split), делает заглавной первую букву каждого слова с помощью [`str.capitalize()`](https://python-all.ru/3.5/library/stdtypes.html#str.capitalize) и объединяет слова, начинающиеся с заглавной буквы, используя [`str.join()`](https://python-all.ru/3.5/library/stdtypes.html#str.join). Если необязательный второй аргумент *sep* отсутствует или равен `None`, последовательности пробельных символов заменяются одним пробелом, а начальные и конечные пробелы удаляются; в противном случае *sep* используется для разбиения и объединения слов.
