Документация Python неофициальный перевод

string.md

665 строк · 46.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.1/library/string.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 7.1. `string` – Основные операции со строками89> **См. также**10>11> [*Типы последовательностей – str, bytes, bytearray, list, tuple, range*](https://python-all.ru/3.1/library/stdtypes.html#typesseq)12>13> [*Методы строк*](https://python-all.ru/3.1/library/stdtypes.html#string-methods)1415## 7.1.1. Строковые константы1617Константы, определённые в этом модуле:1819#### `string.ascii_letters`2021Конкатенация констант2223[`ascii_lowercase`](https://python-all.ru/3.1/library/string.html#string.ascii_lowercase)2425и2627[`ascii_uppercase`](https://python-all.ru/3.1/library/string.html#string.ascii_uppercase)2829, описанных ниже. Это значение не зависит от локали.3031#### `string.ascii_lowercase`3233Строчные буквы3435`'abcdefghijklmnopqrstuvwxyz'`3637. Это значение не зависит от локали и не изменится.3839#### `string.ascii_uppercase`4041Прописные буквы4243`'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`4445. Это значение не зависит от локали и не изменится.4647#### `string.digits`4849Строка5051`'0123456789'`5253.5455#### `string.hexdigits`5657Строка5859`'0123456789abcdefABCDEF'`6061.6263#### `string.octdigits`6465Строка6667`'01234567'`6869.7071#### `string.punctuation`7273Строка символов ASCII, которые считаются знаками препинания в локали7475`C`7677.7879#### `string.printable`8081Строка символов ASCII, которые считаются печатными. Это комбинация8283[`digits`](https://python-all.ru/3.1/library/string.html#string.digits)8485,8687[`ascii_letters`](https://python-all.ru/3.1/library/string.html#string.ascii_letters)8889,9091[`punctuation`](https://python-all.ru/3.1/library/string.html#string.punctuation)9293и9495[`whitespace`](https://python-all.ru/3.1/library/string.html#string.whitespace)9697.9899#### `string.whitespace`100101Строка, содержащая все ASCII-символы, которые считаются пробельными. Включает символы: пробел, табуляция, перевод строки, возврат каретки, прогон страницы и вертикальная табуляция.102103## 7.1.2. Форматирование строк104105Встроенный строковый класс предоставляет возможность выполнять сложные подстановки переменных и форматирование значений с помощью метода [`format()`](https://python-all.ru/3.1/library/functions.html#format), описанного в [**PEP 3101**](https://python-all.ru/3.1/library/string.html). Класс [`Formatter`](https://python-all.ru/3.1/library/string.html#string.Formatter) в модуле `string` позволяет создавать и настраивать собственное поведение форматирования строк, используя ту же реализацию, что и встроенный метод [`format()`](https://python-all.ru/3.1/library/functions.html#format).106107#### `class string.Formatter`108109Класс [`Formatter`](https://python-all.ru/3.1/library/string.html#string.Formatter) имеет следующие открытые методы:110111#### `format(format_string, *args, **kwargs)`112113[`format()`](https://python-all.ru/3.1/library/functions.html#format)114115– это основной метод API. Он принимает шаблон форматирования строку и произвольный набор позиционных и именованных аргументов.116117[`format()`](https://python-all.ru/3.1/library/functions.html#format)118119– это обёртка, которая вызывает120121[`vformat()`](https://python-all.ru/3.1/library/string.html#string.Formatter.vformat)122123.124125#### `vformat(format_string, args, kwargs)`126127Эта функция выполняет фактическую работу по форматированию. Она вынесена как отдельная функция для случаев, когда нужно передать заранее определённый словарь аргументов, а не распаковывать и упаковывать словарь как отдельные аргументы с помощью синтаксиса128129`*args`130131и132133`**kwds`134135.136137[`vformat()`](https://python-all.ru/3.1/library/string.html#string.Formatter.vformat)138139выполняет разбиение шаблонной строки форматирования на символьные данные и поля замены. Она вызывает различные методы, описанные ниже.140141Кроме того, класс [`Formatter`](https://python-all.ru/3.1/library/string.html#string.Formatter) определяет ряд методов, предназначенных для замены в подклассах:142143#### `parse(format_string)`144145Перебирает format\_string и возвращает итератор кортежей (*literal\_text*, *field\_name*, *format\_spec*, *conversion*). Это используется [`vformat()`](https://python-all.ru/3.1/library/string.html#string.Formatter.vformat) для разбиения строки либо на литеральный текст, либо на поля подстановки.146147Значения кортежа концептуально представляют собой отрезок литерального текста, после которого следует одно поле подстановки. Если литерального текста нет (это может произойти, если два поля подстановки следуют подряд), то *literal\_text* будет строкой нулевой длины. Если поле подстановки отсутствует, то значения *field\_name*, *format\_spec* и *conversion* будут равны `None`.148149#### `get_field(field_name, args, kwargs)`150151При заданном152153*field\_name*154155, возвращаемом156157[`parse()`](https://python-all.ru/3.1/library/string.html#string.Formatter.parse)158159(см. выше), преобразует его в объект для форматирования. Возвращает кортеж (obj, used\_key). Версия по умолчанию принимает строки формы, определённой в160161[**PEP 3101**](https://python-all.ru/3.1/library/string.html)162163, например "0\[name\]" или "label.title".164165*args*166167и168169*kwargs*170171передаются в172173[`vformat()`](https://python-all.ru/3.1/library/string.html#string.Formatter.vformat)174175. Возвращаемое значение176177*used\_key*178179имеет тот же смысл, что и параметр180181*key*182183для184185[`get_value()`](https://python-all.ru/3.1/library/string.html#string.Formatter.get_value)186187.188189#### `get_value(key, args, kwargs)`190191Извлекает значение заданного поля. Аргумент *key* может быть целым числом или строкой. Если это целое число, оно представляет индекс позиционного аргумента в *args*; если строка – именованный аргумент в *kwargs*.192193Параметр *args* содержит список позиционных аргументов для [`vformat()`](https://python-all.ru/3.1/library/string.html#string.Formatter.vformat), а параметр *kwargs* – словарь именованных аргументов.194195Для составных имён полей эти функции вызываются только для первого компонента имени поля; последующие компоненты обрабатываются через обычные операции с атрибутами и индексацией.196197Так, например, для поля с выражением ‘0.name’ будет вызвана [`get_value()`](https://python-all.ru/3.1/library/string.html#string.Formatter.get_value) с аргументом *key*, равным 0. Затем атрибут `name` будет получен после возврата [`get_value()`](https://python-all.ru/3.1/library/string.html#string.Formatter.get_value) вызовом встроенной функции [`getattr()`](https://python-all.ru/3.1/library/functions.html#getattr).198199Если индекс или ключевое слово ссылаются на несуществующий элемент, то должно быть возбуждено исключение [`IndexError`](https://python-all.ru/3.1/library/exceptions.html#IndexError) или [`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError).200201#### `check_unused_args(used_args, args, kwargs)`202203Реализует проверку неиспользуемых аргументов (при необходимости). Аргументами этой функции являются множество всех ключей аргументов, которые фактически использовались в строке формата (целые числа для позиционных аргументов и строки для именованных), а также ссылка на204205*args*206207и208209*kwargs*210211, которые были переданы в vformat. Множество неиспользуемых аргументов можно вычислить из этих параметров. Предполагается, что212213[`check_unused_args()`](https://python-all.ru/3.1/library/string.html#string.Formatter.check_unused_args)214215возбуждает исключение, если проверка не проходит.216217#### `format_field(value, format_spec)`218219[`format_field()`](https://python-all.ru/3.1/library/string.html#string.Formatter.format_field)220221просто вызывает встроенную функцию222223[`format()`](https://python-all.ru/3.1/library/functions.html#format)224225. Этот метод предусмотрен, чтобы подклассы могли его переопределить.226227#### `convert_field(value, conversion)`228229Преобразует значение (возвращённое методом230231[`get_field()`](https://python-all.ru/3.1/library/string.html#string.Formatter.get_field)232233) по заданному типу преобразования (как в кортеже, возвращённом методом234235[`parse()`](https://python-all.ru/3.1/library/string.html#string.Formatter.parse)236237). Стандартная версия понимает типы преобразования ‘r’ (repr) и ‘s’ (str).238239## 7.1.3. Синтаксис строк форматирования240241Метод [`str.format()`](https://python-all.ru/3.1/library/stdtypes.html#str.format) и класс [`Formatter`](https://python-all.ru/3.1/library/string.html#string.Formatter) используют одинаковый синтаксис строк формата (хотя в случае [`Formatter`](https://python-all.ru/3.1/library/string.html#string.Formatter) подклассы могут определять собственный синтаксис строк формата).242243Строки форматирования содержат «поля замены», заключённые в фигурные скобки `{}`. Всё, что не находится в скобках, считается буквальным текстом и копируется в вывод без изменений. Если нужно включить символ скобки в буквальный текст, его можно экранировать удвоением: `{{` и `}}`.244245Грамматика поля замены выглядит следующим образом:246247> ```248>249> replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"250> field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*251> arg_name          ::=  [identifier | integer]252> attribute_name    ::=  identifier253> element_index     ::=  integer | index_string254> index_string      ::=  <any source character except "]"> +255> conversion        ::=  "r" | "s" | "a"256> format_spec       ::=  <described in the next section>257> ```258259В менее формальных терминах, поле замены может начинаться с *field\_name*, который задаёт объект, чьё значение должно быть отформатировано и вставлено в вывод вместо поля замены. За *field\_name* может опционально следовать поле *conversion*, которому предшествует восклицательный знак `'!'`, и *format\_spec*, которому предшествует двоеточие `':'`. Они задают нестандартный формат для заменяемого значения.260261См. также раздел [*Мини-язык спецификации формата*](https://python-all.ru/3.1/library/string.html#formatspec).262263Сам *field\_name* начинается с *arg\_name*, который является либо числом, либо ключевым словом. Если это число, оно ссылается на позиционный аргумент, а если ключевое слово – на именованный аргумент. Если числовые arg\_names в строке форматирования идут по порядку 0, 1, 2, ..., их можно опустить (не только некоторые), и числа 0, 1, 2, ... будут автоматически вставлены в том же порядке. За *arg\_name* может следовать любое количество выражений индекса или атрибута. Выражение вида `'.name'` выбирает именованный атрибут с помощью [`getattr()`](https://python-all.ru/3.1/library/functions.html#getattr), а выражение вида `'[index]'` выполняет поиск по индексу с помощью [`__getitem__()`](https://python-all.ru/3.1/reference/datamodel.html#object.__getitem__).264265Изменено в версии 3.1: Указатели позиционных аргументов можно опускать, поэтому `'{} {}'` эквивалентно `'{0} {1}'`.266267Несколько простых примеров строк форматирования:268269```python270"First, thou shalt count to {0}" # Ссылается на первый позиционный аргумент271"Bring me a {}"                  # Неявно ссылается на первый позиционный аргумент272"From {} to {}"                  # То же, что "From {0} to {1}"273"My quest is {name}"             # Ссылается на именованный аргумент 'name'274"Weight in tons {0.weight}"      # Атрибут 'weight' первого позиционного аргумента275"Units destroyed: {players[0]}"  # Первый элемент именованного аргумента 'players'.276```277278Поле *conversion* вызывает приведение типа перед форматированием. Обычно задачу форматирования значения выполняет метод [`__format__()`](https://python-all.ru/3.1/reference/datamodel.html#object.__format__) самого этого значения. Однако в некоторых случаях желательно принудительно отформатировать тип как строку, переопределив его собственное определение форматирования. Преобразовав значение в строку перед вызовом [`__format__()`](https://python-all.ru/3.1/reference/datamodel.html#object.__format__), можно обойти обычную логику форматирования.279280В настоящее время поддерживаются три флага преобразования: `'!s'`, который вызывает [`str()`](https://python-all.ru/3.1/library/functions.html#str) для значения; `'!r'`, вызывающий [`repr()`](https://python-all.ru/3.1/library/functions.html#repr); и `'!a'`, вызывающий [`ascii()`](https://python-all.ru/3.1/library/functions.html#ascii).281282Несколько примеров:283284```python285"Harold's a clever {0!s}"        # Сначала вызывает str() для аргумента286"Bring out the holy {name!r}"    # Сначала вызывает repr() для аргумента287"More {!a}"                      # Сначала вызывает ascii() для аргумента288```289290Поле *format\_spec* содержит спецификацию того, как должно быть представлено значение, включая такие детали, как ширина поля, выравнивание, заполнение, десятичная точность и так далее. Каждый тип значения может определять свой собственный «мини-язык форматирования» или интерпретацию *format\_spec*.291292Большинство встроенных типов поддерживают общий мини-язык форматирования, который описан в следующем разделе.293294Поле *format\_spec* может также содержать вложенные поля замены. Эти вложенные поля замены могут содержать только имя поля; флаги преобразования и спецификации формата не допускаются. Поля замены внутри format\_spec подставляются до того, как строка *format\_spec* будет интерпретирована. Это позволяет динамически задавать форматирование значения.295296Смотрите раздел [*Примеры форматирования*](https://python-all.ru/3.1/library/string.html#formatexamples) для примеров.297298### 7.1.3.1. Мини-язык спецификации формата299300«Спецификации формата» используются внутри полей замены, содержащихся в строке формата, чтобы определить, как отдельные значения представляются (см. [*Синтаксис строк формата*](https://python-all.ru/3.1/library/string.html#formatstrings)). Их также можно передавать напрямую встроенной функции [`format()`](https://python-all.ru/3.1/library/functions.html#format). Каждый форматируемый тип может определять, как следует интерпретировать спецификацию формата.301302Большинство встроенных типов реализуют следующие параметры для спецификаций формата, хотя некоторые параметры форматирования поддерживаются только числовыми типами.303304Общее соглашение: пустая строка формата (`""`) даёт тот же результат, как если бы была вызвана [`str()`](https://python-all.ru/3.1/library/functions.html#str) для этого значения. Непустая строка формата обычно изменяет результат.305306Общий вид *стандартного спецификатора формата*:307308```309310format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]311fill        ::=  <a character other than '}'>312align       ::=  "<" | ">" | "=" | "^"313sign        ::=  "+" | "-" | " "314width       ::=  integer315precision   ::=  integer316type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"317```318319Символом *заполнения* может быть любой символ, кроме '{' или '}'. Наличие символа заполнения обозначается следующим за ним символом, который должен быть одним из вариантов выравнивания. Если второй символ *format\_spec* не является допустимым вариантом выравнивания, то считается, что отсутствуют как символ заполнения, так и вариант выравнивания.320321Значение различных параметров выравнивания следующее:322323> | Параметр | Значение |324> | --- | --- |325> | `'<'` | Выравнивает поле по левому краю в пределах доступного пространства (это значение по умолчанию для большинства объектов). |326> | `'>'` | Выравнивает поле по правому краю в пределах доступного пространства (это значение по умолчанию для чисел). |327> | `'='` | Заставляет заполнение располагаться после знака (если он есть), но перед цифрами. Используется для печати полей в формате «+000000120». Этот вариант выравнивания применим только к числовым типам. |328> | `'^'` | Выравнивает поле по центру в пределах доступного пространства. |329330Обратите внимание, что если не задана минимальная ширина поля, ширина поля всегда будет равна размеру заполняемых данных, поэтому в этом случае параметр выравнивания не имеет смысла.331332Параметр *sign* допустим только для числовых типов и может быть одним из следующих:333334> | Параметр | Значение |335> | --- | --- |336> | `'+'` | указывает, что знак должен выводиться как для положительных, так и для отрицательных чисел. |337> | `'-'` | указывает, что знак должен выводиться только для отрицательных чисел (это поведение по умолчанию). |338> | пробел | указывает, что перед положительными числами должен ставиться пробел, а перед отрицательными – знак минус. |339340Параметр `'#'` допустим только для целых чисел и только для двоичного, восьмеричного или шестнадцатеричного вывода. Если он указан, это означает, что вывод будет предваряться соответственно `'0b'`, `'0o'` или `'0x'`.341342Опция `','` указывает на использование запятой в качестве разделителя групп разрядов. Для разделителя, учитывающего локаль, используйте вместо этого тип представления целых чисел `'n'`.343344Изменено в версии 3.1: Добавлена опция `','` (см. также [**PEP 378**](https://python-all.ru/3.1/library/string.html)).345346*ширина* – целое десятичное число, задающее минимальную ширину поля. Если не указано, ширина поля определяется содержимым.347348Если полю *width* предшествует символ нуля (`'0'`), это включает заполнение нулями. Это эквивалентно типу выравнивания *alignment* `'='` и символу заполнения *fill* `'0'`.349350Параметр *precision* – это десятичное число, указывающее, сколько цифр должно отображаться после десятичной точки для значения с плавающей запятой, отформатированного с помощью `'f'` и `'F'`, или до и после десятичной точки для значения с плавающей запятой, отформатированного с помощью `'g'` или `'G'`. Для нечисловых типов это поле указывает максимальный размер поля – иными словами, сколько символов будет взято из содержимого поля. Параметр *precision* не допускается для целых чисел.351352Наконец, *тип* определяет, как должны быть представлены данные.353354Доступные типы представления для строк:355356> | Тип | Значение |357> | --- | --- |358> | `'s'` | Формат строки. Это тип по умолчанию для строк и может быть опущен. |359> | None | То же, что и `'s'`. |360361Доступные типы представления для целых чисел:362363> | Тип | Значение |364> | --- | --- |365> | `'b'` | Двоичный формат. Выводит число в системе с основанием 2. |366> | `'c'` | Символ. Преобразует целое число в соответствующий символ Юникода перед выводом. |367> | `'d'` | Десятичное целое. Выводит число в системе с основанием 10. |368> | `'o'` | Восьмеричный формат. Выводит число в системе с основанием 8. |369> | `'x'` | Шестнадцатеричный формат. Выводит число по основанию 16, используя строчные буквы для цифр больше 9. |370> | `'X'` | Шестнадцатеричный формат. Выводит число по основанию 16, используя заглавные буквы для цифр больше 9. |371> | `'n'` | Число. То же, что и `'d'`, но с использованием текущей локали для вставки соответствующих разделителей групп разрядов. |372> | None | То же, что и `'d'`. |373374В дополнение к перечисленным выше типам форматирования, целые числа можно форматировать с помощью типов для чисел с плавающей запятой, перечисленных ниже (кроме `'n'` и None). В этом случае перед форматированием для преобразования целого числа в число с плавающей запятой используется [`float()`](https://python-all.ru/3.1/library/functions.html#float).375376Доступные типы представления для чисел с плавающей запятой и десятичных чисел:377378> | Тип | Значение |379> | --- | --- |380> | `'e'` | Экспоненциальная запись. Выводит число в экспоненциальной записи, используя букву 'e' для обозначения порядка. |381> | `'E'` | Экспоненциальная запись. То же, что и `'e'`, но с использованием заглавной буквы «E» в качестве разделителя. |382> | `'f'` | Фиксированная точка. Отображает число как число с фиксированной точкой. |383> | `'F'` | Фиксированная запись. То же, что и `'f'`, но преобразует `nan` в `NAN`, а `inf` в `INF`. |384> | `'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`. |385> | `'G'` | Общий формат. То же, что и `'g'`, но переключается на `'E'`, если число становится слишком большим. Представления бесконечности и NaN также выводятся заглавными буквами. |386> | `'n'` | Число. То же, что и `'g'`, но с использованием текущей локали для вставки соответствующих разделителей групп разрядов. |387> | `'%'` | Процент. Умножает число на 100 и выводит в фиксированном формате (`'f'`) с последующим знаком процента. |388> | None | Аналогично `'g'`, но с как минимум одной цифрой после десятичной точки и точностью по умолчанию 12. Этот формат предназначен для соответствия [`str()`](https://python-all.ru/3.1/library/functions.html#str), за исключением того, что можно добавлять другие модификаторы форматирования. |389390### 7.1.3.2. Примеры форматирования391392В этом разделе приведены примеры нового синтаксиса форматирования и сравнение со старым форматированием `%`.393394В большинстве случаев синтаксис похож на старое форматирование `%`, с добавлением `{}` и использованием `:` вместо `%`. Например, `'%03.2f'` можно перевести как `'{:03.2f}'`.395396Новый синтаксис форматирования также поддерживает новые и другие параметры, показанные в следующих примерах.397398Доступ к аргументам по позиции:399400```python401>>> '{0}, {1}, {2}'.format('a', 'b', 'c')402'a, b, c'403>>> '{}, {}, {}'.format('a', 'b', 'c')  # Только для версии 3.1+404'a, b, c'405>>> '{2}, {1}, {0}'.format('a', 'b', 'c')406'c, b, a'407>>> '{2}, {1}, {0}'.format(*'abc')      # Распаковка последовательности аргументов408'c, b, a'409>>> '{0}{1}{0}'.format('abra', 'cad')   # индексы аргументов могут повторяться410'abracadabra'411```412413Доступ к аргументам по имени:414415```python416>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')417'Coordinates: 37.24N, -115.81W'418>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}419>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)420'Coordinates: 37.24N, -115.81W'421```422423Доступ к атрибутам аргументов:424425```python426>>> c = 3-5j427>>> ('The complex number {0} is formed from the real part {0.real} '428...  'and the imaginary part {0.imag}.').format(c)429'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'430>>> class Point:431...     def __init__(self, x, y):432...         self.x, self.y = x, y433...     def __str__(self):434...         return 'Point({self.x}, {self.y})'.format(self=self)435...436>>> str(Point(4, 2))437'Point(4, 2)'438```439440Доступ к элементам аргументов:441442```python443>>> coord = (3, 5)444>>> 'X: {0[0]};  Y: {0[1]}'.format(coord)445'X: 3;  Y: 5'446```447448Замена `%s` и `%r`:449450```python451>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')452"repr() shows quotes: 'test1'; str() doesn't: test2"453```454455Выравнивание текста и указание ширины:456457```python458>>> '{:<30}'.format('left aligned')459'left aligned                  '460>>> '{:>30}'.format('right aligned')461'                 right aligned'462>>> '{:^30}'.format('centered')463'           centered           '464>>> '{:*^30}'.format('centered')  # использовать '*' в качестве символа заполнения465'***********centered***********'466```467468Замена `%+f`, `%-f`, и `% f` с указанием знака:469470```python471>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # отображать всегда472'+3.140000; -3.140000'473>>> '{: f}; {: f}'.format(3.14, -3.14)  # для положительных чисел отображать пробел474' 3.140000; -3.140000'475>>> '{:-f}; {:-f}'.format(3.14, -3.14)  # отображать только минус – то же, что и '{:f}; {:f}'476'3.140000; -3.140000'477```478479Замена `%x` и `%o` и преобразование значения в разные системы счисления:480481```python482>>> # format также поддерживает двоичные числа483>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)484'int: 42;  hex: 2a;  oct: 52;  bin: 101010'485>>> # с префиксом 0x, 0o или 0b:486>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)487'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'488```489490Использование запятой в качестве разделителя тысяч:491492```python493>>> '{:,}'.format(1234567890)494'1,234,567,890'495```496497Выражение процентов:498499```python500>>> points = 19501>>> total = 22502>>> 'Correct answers: {:.2%}.'.format(points/total)503'Correct answers: 86.36%'504```505506Использование форматирования с учётом типа:507508```python509>>> import datetime510>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)511>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)512'2010-07-04 12:15:58'513```514515Вложенные аргументы и более сложные примеры:516517```python518>>> for align, text in zip('<^>', ['left', 'center', 'right']):519...     '{0:{fill}{align}16}'.format(text, fill=align, align=align)520...521'left<<<<<<<<<<<<'522'^^^^^center^^^^^'523'>>>>>>>>>>>right'524>>>525>>> octets = [192, 168, 0, 1]526>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)527'C0A80001'528>>> int(_, 16)5293232235521530>>>531>>> width = 5532>>> for num in range(5,12):533...     for base in 'dXob':534...         print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')535...     print()536...537    5     5     5   101538    6     6     6   110539    7     7     7   111540    8     8    10  1000541    9     9    11  1001542   10     A    12  1010543   11     B    13  1011544```545546## 7.1.4. Шаблонные строки547548Шаблоны предоставляют более простые подстановки строк, как описано в [**PEP 292**](https://python-all.ru/3.1/library/string.html). Вместо обычных подстановок на основе `%`, шаблоны поддерживают подстановки на основе `$`, используя следующие правила:549550- `$$` – это escape-последовательность; она заменяется на один символ `$`.551- `$identifier` обозначает заполнитель подстановки, соответствующий ключу отображения `"identifier"`. По умолчанию, `"identifier"` должно быть корректным идентификатором Python. Первый символ, не являющийся идентификатором, после символа `$` завершает этот спецификатор заполнителя.552- `${identifier}` эквивалентно `$identifier`. Такая форма требуется, когда за заполнителем следуют символы, являющиеся корректными идентификаторами, но не входящие в состав заполнителя, как в `"${noun}ification"`.553554Любое другое появление `$` в строке приведёт к возбуждению исключения [`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError).555556Модуль `string` предоставляет класс [`Template`](https://python-all.ru/3.1/library/string.html#string.Template), который реализует эти правила. Методы класса [`Template`](https://python-all.ru/3.1/library/string.html#string.Template):557558#### `class string.Template(template)`559560Конструктор принимает единственный аргумент – строку шаблона.561562#### `substitute(mapping, **kwds)`563564Выполняет подстановку в шаблон, возвращая новую строку.565566*mapping*567568– это любой объект, подобный словарю, ключи которого соответствуют плейсхолдерам в шаблоне. В качестве альтернативы можно указать именованные аргументы, где имена аргументов являются плейсхолдерами. Если указаны и569570*mapping*571572, и573574*kwds*575576, и есть дубликаты, то плейсхолдеры из577578*kwds*579580имеют приоритет.581582#### `safe_substitute(mapping, **kwds)`583584Подобно [`substitute()`](https://python-all.ru/3.1/library/string.html#string.Template.substitute), но если плейсхолдеры отсутствуют в *mapping* и *kwds*, то вместо возбуждения исключения [`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError) исходный плейсхолдер останется в результирующей строке нетронутым. Также, в отличие от [`substitute()`](https://python-all.ru/3.1/library/string.html#string.Template.substitute), любые другие вхождения `$` просто вернут `$` вместо возбуждения [`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError).585586Хотя другие исключения всё ещё могут возникать, этот метод называется «безопасным» (safe), потому что подстановки всегда стараются вернуть рабочую строку вместо возбуждения исключения. В другом смысле, [`safe_substitute()`](https://python-all.ru/3.1/library/string.html#string.Template.safe_substitute) может быть чем угодно, но не безопасным, поскольку он молча игнорирует некорректные шаблоны, содержащие висячие разделители, несогласованные скобки или плейсхолдеры, не являющиеся валидными идентификаторами Python.587588Экземпляры [`Template`](https://python-all.ru/3.1/library/string.html#string.Template) также предоставляют один открытый атрибут данных:589590#### `template`591592Это объект, переданный в аргумент593594*template*595596конструктора. В общем случае его не следует изменять, но доступ только для чтения не гарантируется.597598Вот пример использования Template:599600```python601>>> from string import Template602>>> s = Template('$who likes $what')603>>> s.substitute(who='tim', what='kung pao')604'tim likes kung pao'605>>> d = dict(who='tim')606>>> Template('Give $who $100').substitute(d)607Traceback (most recent call last):608[...]609ValueError: Invalid placeholder in string: line 1, col 10610>>> Template('$who likes $what').substitute(d)611Traceback (most recent call last):612[...]613KeyError: 'what'614>>> Template('$who likes $what').safe_substitute(d)615'tim likes $what'616```617618Расширенное использование: можно создавать подклассы [`Template`](https://python-all.ru/3.1/library/string.html#string.Template), чтобы настроить синтаксис плейсхолдера, символ-разделитель или всё регулярное выражение, используемое для разбора строк шаблона. Для этого можно переопределить следующие атрибуты класса:619620- *delimiter* – это литерал строки, описывающий разделитель, который вводит заполнитель. Значение по умолчанию `$`. Обратите внимание: это *не* должно быть регулярным выражением, так как реализация при необходимости вызовет [`re.escape()`](https://python-all.ru/3.1/library/re.html#re.escape) для этой строки.621- *idpattern* – Это регулярное выражение, описывающее шаблон для плейсхолдеров без фигурных скобок (скобки будут добавлены автоматически по мере необходимости). Значение по умолчанию – регулярное выражение `[_a-z][_a-z0-9]*`.622623В качестве альтернативы можно указать всё регулярное выражение, переопределив атрибут класса *pattern*. Если это сделать, значение должно быть объектом регулярного выражения с четырьмя именованными захватывающими группами. Эти группы соответствуют правилам, приведённым выше, а также правилу недопустимых плейсхолдеров:624625- *escaped* – эта группа соответствует управляющей последовательности, например `$$`, в шаблоне по умолчанию.626- *named* – эта группа соответствует имени плейсхолдера без скобок; она не должна включать разделитель в захватывающую группу.627- *braced* – эта группа соответствует имени плейсхолдера, заключённого в скобки; она не должна включать ни разделитель, ни скобки в захватывающую группу.628- *invalid* – эта группа соответствует любому другому шаблону разделителя (обычно одиночному разделителю), и она должна появляться последней в регулярном выражении.629630## 7.1.5. Вспомогательные функции631632#### `string.capwords(s[, sep])`633634Разделяет аргумент на слова с помощью635636[`str.split()`](https://python-all.ru/3.1/library/stdtypes.html#str.split)637638, преобразует каждое слово в заглавные буквы с помощью639640[`str.capitalize()`](https://python-all.ru/3.1/library/stdtypes.html#str.capitalize)641642и соединяет преобразованные слова с помощью643644[`str.join()`](https://python-all.ru/3.1/library/stdtypes.html#str.join)645646. Если необязательный второй аргумент647648*sep*649650отсутствует или равен651652`None`653654, последовательности пробельных символов заменяются одним пробелом, а начальные и конечные пробелы удаляются; в противном случае655656*sep*657658используется для разделения и соединения слов.659660#### `string.maketrans(frm, to)`661662Возвращает таблицу перевода, подходящую для передачи в [`bytes.translate()`](https://python-all.ru/3.1/library/stdtypes.html#bytes.translate), которая будет сопоставлять каждый символ из *from* с символом на той же позиции в *to*; *from* и *to* должны иметь одинаковую длину.663664Устарело с версии 3.1: Используйте вместо этого статический метод [`bytes.maketrans()`](https://python-all.ru/3.1/library/stdtypes.html#bytes.maketrans).665