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

string.md

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

1> **Источник:** https://python-all.ru/3.6/library/string.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 6.1. [`string`](https://python-all.ru/3.6/library/string.html#module-string) – Общие операции со строками89**Исходный код:** [Lib/string.py](https://python-all.ru/src/3.6/Lib/string.py)1011---1213> **См. также**14>15> [Тип текстовой последовательности – str](https://python-all.ru/3.6/library/stdtypes.html#textseq)16>17> [Методы строк](https://python-all.ru/3.6/library/stdtypes.html#string-methods)1819## 6.1.1. Константы строк2021Константы, определённые в этом модуле:2223#### `string.ascii_letters`2425Конкатенация констант [`ascii_lowercase`](https://python-all.ru/3.6/library/string.html#string.ascii_lowercase) и [`ascii_uppercase`](https://python-all.ru/3.6/library/string.html#string.ascii_uppercase), описанных ниже. Это значение не зависит от локали.2627#### `string.ascii_lowercase`2829Строчные буквы `'abcdefghijklmnopqrstuvwxyz'`. Это значение не зависит от локали и не изменится.3031#### `string.ascii_uppercase`3233Заглавные буквы `'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`. Это значение не зависит от локали и не изменится.3435#### `string.digits`3637Строка `'0123456789'`.3839#### `string.hexdigits`4041Строка `'0123456789abcdefABCDEF'`.4243#### `string.octdigits`4445Строка `'01234567'`.4647#### `string.punctuation`4849Строка символов ASCII, которые считаются знаками пунктуации в локали `C`.5051#### `string.printable`5253Строка ASCII-символов, которые считаются печатаемыми. Представляет собой комбинацию [`digits`](https://python-all.ru/3.6/library/string.html#string.digits), [`ascii_letters`](https://python-all.ru/3.6/library/string.html#string.ascii_letters), [`punctuation`](https://python-all.ru/3.6/library/string.html#string.punctuation), и [`whitespace`](https://python-all.ru/3.6/library/string.html#string.whitespace).5455#### `string.whitespace`5657Строка, содержащая все ASCII-символы, которые считаются пробельными. Включает символы: пробел, табуляция, перевод строки, возврат каретки, прогон страницы и вертикальная табуляция.5859## 6.1.2. Пользовательское форматирование строк6061Встроенный класс строк предоставляет возможность выполнять сложные замены переменных и форматирование значений с помощью метода [`format()`](https://python-all.ru/3.6/library/stdtypes.html#str.format), описанного в [**PEP 3101**](https://python-all.ru/3.6/library/string.html). Класс [`Formatter`](https://python-all.ru/3.6/library/string.html#string.Formatter) из модуля [`string`](https://python-all.ru/3.6/library/string.html#module-string) позволяет создавать и настраивать собственное поведение форматирования строк, используя ту же реализацию, что и встроенный метод [`format()`](https://python-all.ru/3.6/library/stdtypes.html#str.format).6263#### `class string.Formatter`6465Класс [`Formatter`](https://python-all.ru/3.6/library/string.html#string.Formatter) имеет следующие открытые методы:6667#### `format(format_string, *args, **kwargs)`6869Основной метод API. Принимает строку форматирования и произвольный набор позиционных и именованных аргументов. Это просто обёртка, вызывающая [`vformat()`](https://python-all.ru/3.6/library/string.html#string.Formatter.vformat).7071Устарело с версии 3.5: Передача строки формата в качестве именованного аргумента *format\_string* устарела.7273#### `vformat(format_string, args, kwargs)`7475Эта функция выполняет фактическую работу по форматированию. Она представлена как отдельная функция на случай, если нужно передать предопределённый словарь аргументов, вместо распаковки и повторной упаковки словаря в отдельные аргументы с помощью синтаксиса `*args` и `**kwargs`. [`vformat()`](https://python-all.ru/3.6/library/string.html#string.Formatter.vformat) выполняет разбивку строки форматирования на символьные данные и поля замены. Затем вызываются различные методы, описанные ниже.7677Кроме того, [`Formatter`](https://python-all.ru/3.6/library/string.html#string.Formatter) определяет ряд методов, предназначенных для переопределения в подклассах:7879#### `parse(format_string)`8081Перебирает format\_string и возвращает итерируемый объект кортежей (*literal\_text*, *field\_name*, *format\_spec*, *conversion*). Используется в [`vformat()`](https://python-all.ru/3.6/library/string.html#string.Formatter.vformat) для разбивки строки на буквальный текст или поля замены.8283Значения в кортеже концептуально представляют собой фрагмент литерального текста, за которым следует одно поле подстановки. Если литерального текста нет (что может произойти, когда два поля подстановки идут подряд), то *literal\_text* будет строкой нулевой длины. Если поля подстановки нет, то значения *field\_name*, *format\_spec* и *conversion* будут равны `None`.8485#### `get_field(field_name, args, kwargs)`8687По заданному *field\_name*, возвращённому [`parse()`](https://python-all.ru/3.6/library/string.html#string.Formatter.parse) (см. выше), преобразует его в объект для форматирования. Возвращает кортеж (obj, used\_key). По умолчанию принимает строки вида, определённого в [**PEP 3101**](https://python-all.ru/3.6/library/string.html), например, “0\[name\]” или “label.title”. *args* и *kwargs* передаются так же, как в [`vformat()`](https://python-all.ru/3.6/library/string.html#string.Formatter.vformat). Возвращаемое значение *used\_key* имеет тот же смысл, что параметр *key* у [`get_value()`](https://python-all.ru/3.6/library/string.html#string.Formatter.get_value).8889#### `get_value(key, args, kwargs)`9091Извлекает значение заданного поля. Аргумент *key* может быть целым числом или строкой. Если это целое число, оно представляет индекс позиционного аргумента в *args*; если строка – именованный аргумент в *kwargs*.9293Параметр *args* устанавливается в список позиционных аргументов для [`vformat()`](https://python-all.ru/3.6/library/string.html#string.Formatter.vformat), а параметр *kwargs* – в словарь именованных аргументов.9495Для составных имён полей эти функции вызываются только для первого компонента имени поля; последующие компоненты обрабатываются через обычные операции с атрибутами и индексацией.9697Например, выражение поля «0.name» вызовет [`get_value()`](https://python-all.ru/3.6/library/string.html#string.Formatter.get_value) с аргументом *key*, равным 0. Атрибут `name` будет получен после возврата из [`get_value()`](https://python-all.ru/3.6/library/string.html#string.Formatter.get_value) вызовом встроенной функции [`getattr()`](https://python-all.ru/3.6/library/functions.html#getattr).9899Если индекс или ключевое слово ссылаются на несуществующий элемент, должно быть возбуждено исключение [`IndexError`](https://python-all.ru/3.6/library/exceptions.html#IndexError) или [`KeyError`](https://python-all.ru/3.6/library/exceptions.html#KeyError).100101#### `check_unused_args(used_args, args, kwargs)`102103Реализует проверку на неиспользованные аргументы при необходимости. Аргументы этой функции – множество всех ключей аргументов, которые фактически были использованы в строке форматирования (целые числа для позиционных аргументов и строки для именованных), а также ссылка на *args* и *kwargs*, переданные в vformat. Множество неиспользованных аргументов можно вычислить по этим параметрам. Предполагается, что [`check_unused_args()`](https://python-all.ru/3.6/library/string.html#string.Formatter.check_unused_args) возбуждает исключение, если проверка не пройдена.104105#### `format_field(value, format_spec)`106107[`format_field()`](https://python-all.ru/3.6/library/string.html#string.Formatter.format_field) просто вызывает глобальную встроенную функцию [`format()`](https://python-all.ru/3.6/library/functions.html#format). Метод предоставлен, чтобы подклассы могли переопределить его.108109#### `convert_field(value, conversion)`110111Преобразует значение (возвращённое [`get_field()`](https://python-all.ru/3.6/library/string.html#string.Formatter.get_field)) с учётом типа преобразования (как в кортеже, возвращаемом методом [`parse()`](https://python-all.ru/3.6/library/string.html#string.Formatter.parse)). Версия по умолчанию понимает типы преобразования 's' (str), 'r' (repr) и 'a' (ascii).112113## 6.1.3. Синтаксис строки формата114115Метод [`str.format()`](https://python-all.ru/3.6/library/stdtypes.html#str.format) и класс [`Formatter`](https://python-all.ru/3.6/library/string.html#string.Formatter) используют одинаковый синтаксис для строк форматирования (хотя в случае [`Formatter`](https://python-all.ru/3.6/library/string.html#string.Formatter) подклассы могут определять свой собственный синтаксис строк форматирования). Этот синтаксис родственен синтаксису [форматированных строковых литералов](https://python-all.ru/3.6/reference/lexical_analysis.html#f-strings), но между ними есть различия.116117Строки форматирования содержат «поля замены», заключённые в фигурные скобки `{}`. Всё, что не находится в скобках, считается буквальным текстом и копируется в вывод без изменений. Если нужно включить символ скобки в буквальный текст, его можно экранировать удвоением: `{{` и `}}`.118119Грамматика поля замены выглядит следующим образом:120121> ```122>123> replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"124> field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*125> arg_name          ::=  [identifier | digit+]126> attribute_name    ::=  identifier127> element_index     ::=  digit+ | index_string128> index_string      ::=  <any source character except "]"> +129> conversion        ::=  "r" | "s" | "a"130> format_spec       ::=  <described in the next section>131> ```132133В менее формальных терминах, поле замены может начинаться с *field\_name*, который задаёт объект, чьё значение должно быть отформатировано и вставлено в вывод вместо поля замены. За *field\_name* может опционально следовать поле *conversion*, которому предшествует восклицательный знак `'!'`, и *format\_spec*, которому предшествует двоеточие `':'`. Они задают нестандартный формат для заменяемого значения.134135См. также раздел [Мини-язык спецификации формата](https://python-all.ru/3.6/library/string.html#formatspec).136137Сам *field\_name* начинается с *arg\_name*, который является либо числом, либо ключевым словом. Если это число, оно относится к позиционному аргументу, а если ключевое слово – к именованному аргументу. Если числовые arg\_names в строке форматирования идут по порядку 0, 1, 2, …, их все можно опустить (а не только некоторые), и числа 0, 1, 2, … будут автоматически подставлены в этом порядке. Поскольку *arg\_name* не ограничен кавычками, невозможно указать произвольные ключи словаря (например, строки `'10'` или `':-]'`) внутри строки форматирования. За *arg\_name* может следовать любое количество выражений индекса или атрибута. Выражение вида `'.name'` выбирает именованный атрибут с помощью [`getattr()`](https://python-all.ru/3.6/library/functions.html#getattr), а выражение вида `'[index]'` выполняет поиск по индексу с помощью [`__getitem__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__getitem__).138139Изменено в версии 3.1: Спецификаторы позиционных аргументов можно опускать для [`str.format()`](https://python-all.ru/3.6/library/stdtypes.html#str.format), поэтому `'{} {}'.format(a, b)` эквивалентно `'{0} {1}'.format(a, b)`.140141Изменено в версии 3.4: Спецификаторы позиционных аргументов можно опускать для [`Formatter`](https://python-all.ru/3.6/library/string.html#string.Formatter).142143Несколько простых примеров строк форматирования:144145```python146"First, thou shalt count to {0}"  # Ссылается на первый позиционный аргумент147"Bring me a {}"                   # Неявно ссылается на первый позиционный аргумент148"From {} to {}"                   # То же, что "From {0} to {1}"149"My quest is {name}"              # Ссылается на именованный аргумент 'name'150"Weight in tons {0.weight}"       # Атрибут 'weight' первого позиционного аргумента151"Units destroyed: {players[0]}"   # Первый элемент именованного аргумента 'players'.152```153154Поле *conversion* вызывает приведение типа перед форматированием. Обычно задачу форматирования значения выполняет его собственный метод [`__format__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__format__). Однако в некоторых случаях требуется принудительно отформатировать тип как строку, переопределяя его собственное определение форматирования. Преобразовав значение в строку перед вызовом [`__format__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__format__), можно обойти обычную логику форматирования.155156В настоящее время поддерживаются три флага преобразования: `'!s'` вызывает [`str()`](https://python-all.ru/3.6/library/stdtypes.html#str) для значения, `'!r'` вызывает [`repr()`](https://python-all.ru/3.6/library/functions.html#repr), и `'!a'` вызывает [`ascii()`](https://python-all.ru/3.6/library/functions.html#ascii).157158Несколько примеров:159160```python161"Harold's a clever {0!s}"        # Сначала вызывает str() для аргумента162"Bring out the holy {name!r}"    # Сначала вызывает repr() для аргумента163"More {!a}"                      # Сначала вызывает ascii() для аргумента164```165166Поле *format\_spec* содержит спецификацию того, как должно быть представлено значение, включая такие детали, как ширина поля, выравнивание, заполнение, десятичная точность и так далее. Каждый тип значения может определять свой собственный «мини-язык форматирования» или интерпретацию *format\_spec*.167168Большинство встроенных типов поддерживают общий мини-язык форматирования, который описан в следующем разделе.169170Поле *format\_spec* также может содержать вложенные поля подстановки. Эти вложенные поля подстановки могут содержать имя поля, флаг преобразования и спецификацию формата, но более глубокая вложенность не допускается. Поля подстановки внутри format\_spec подставляются перед интерпретацией строки *format\_spec*. Это позволяет динамически задавать форматирование значения.171172Смотрите раздел [Примеры форматирования](https://python-all.ru/3.6/library/string.html#formatexamples) для примеров.173174### 6.1.3.1. Мини-язык спецификации формата175176«Спецификации формата» используются в полях замены внутри строки форматирования для определения того, как отдельные значения представляются (см. [Синтаксис строки форматирования](https://python-all.ru/3.6/library/string.html#formatstrings) и [Форматированные строковые литералы](https://python-all.ru/3.6/reference/lexical_analysis.html#f-strings)). Они также могут передаваться напрямую встроенной функции [`format()`](https://python-all.ru/3.6/library/functions.html#format). Каждый форматируемый тип может определять, как следует интерпретировать спецификацию формата.177178Большинство встроенных типов реализуют следующие параметры для спецификаций формата, хотя некоторые параметры форматирования поддерживаются только числовыми типами.179180Общее правило: пустая строка формата (`""`) даёт тот же результат, что и вызов [`str()`](https://python-all.ru/3.6/library/stdtypes.html#str) для значения. Непустая строка формата обычно изменяет результат.181182Общий вид *стандартного спецификатора формата*:183184```185186format_spec     ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]187fill            ::=  <any character>188align           ::=  "<" | ">" | "=" | "^"189sign            ::=  "+" | "-" | " "190width           ::=  digit+191grouping_option ::=  "_" | ","192precision       ::=  digit+193type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"194```195196Если указано допустимое значение *align*, ему может предшествовать символ *fill*, который может быть любым символом и по умолчанию является пробелом, если не указан. Нельзя использовать фигурную скобку (”`{`” или “`}`”) в качестве символа *fill* в [форматированном строковом литерале](https://python-all.ru/3.6/reference/lexical_analysis.html#f-strings) или при использовании метода [`str.format()`](https://python-all.ru/3.6/library/stdtypes.html#str.format). Однако можно вставить фигурную скобку с помощью вложенного поля подстановки. Это ограничение не влияет на функцию [`format()`](https://python-all.ru/3.6/library/functions.html#format).197198Значение различных параметров выравнивания следующее:199200> | Параметр | Значение |201> | --- | --- |202> | `'<'` | Выравнивает поле по левому краю в пределах доступного пространства (это значение по умолчанию для большинства объектов). |203> | `'>'` | Выравнивает поле по правому краю в пределах доступного пространства (это значение по умолчанию для чисел). |204> | `'='` | Принудительно размещает отступ после знака (если он есть), но перед цифрами. Используется для вывода полей в формате ‘+000000120’. Эта опция выравнивания действительна только для числовых типов. Она становится значением по умолчанию, когда ‘0’ непосредственно предшествует ширине поля. |205> | `'^'` | Выравнивает поле по центру в пределах доступного пространства. |206207Обратите внимание, что если не задана минимальная ширина поля, ширина поля всегда будет равна размеру заполняемых данных, поэтому в этом случае параметр выравнивания не имеет смысла.208209Параметр *sign* допустим только для числовых типов и может быть одним из следующих:210211> | Параметр | Значение |212> | --- | --- |213> | `'+'` | указывает, что знак должен выводиться как для положительных, так и для отрицательных чисел. |214> | `'-'` | указывает, что знак должен выводиться только для отрицательных чисел (это поведение по умолчанию). |215> | пробел | указывает, что перед положительными числами должен ставиться пробел, а перед отрицательными – знак минус. |216217Опция `'#'` приводит к использованию «альтернативной формы» для преобразования. Альтернативная форма определяется по-разному для разных типов. Эта опция действительна только для целых чисел, чисел с плавающей запятой, комплексных чисел и типа Decimal. Для целых чисел при использовании двоичного, восьмеричного или шестнадцатеричного вывода эта опция добавляет к выходному значению соответствующий префикс `'0b'`, `'0o'` или `'0x'`. Для чисел с плавающей запятой, комплексных чисел и Decimal альтернативная форма приводит к тому, что результат преобразования всегда содержит символ десятичной точки, даже если за ним не следует цифр. Обычно символ десятичной точки появляется в результате этих преобразований только если за ним следует цифра. Кроме того, для преобразований `'g'` и `'G'` хвостовые нули не удаляются из результата.218219Параметр `','` указывает на использование запятой в качестве разделителя тысяч. Для разделителя, учитывающего локаль, используйте тип представления целых чисел `'n'`.220221Изменено в версии 3.1: Добавлена опция `','` (см. также [**PEP 378**](https://python-all.ru/3.6/library/string.html)).222223Параметр `'_'` указывает на использование символа подчёркивания в качестве разделителя тысяч для типов представления чисел с плавающей запятой и для типа представления целых чисел `'d'`. Для типов представления целых чисел `'b'`, `'o'`, `'x'` и `'X'` символы подчёркивания вставляются через каждые 4 цифры. Для других типов представления указание этого параметра является ошибкой.224225Изменено в версии 3.6: Добавлена опция `'_'` (см. также [**PEP 515**](https://python-all.ru/3.6/library/string.html)).226227*ширина* – целое десятичное число, задающее минимальную ширину поля. Если не указано, ширина поля определяется содержимым.228229Если явное выравнивание не задано, перед полем *width* с символом ноля (`'0'`) включается знако-зависимое заполнение нулями для числовых типов. Это эквивалентно символу *fill* равному `'0'` с типом *alignment* равным `'='`.230231Параметр *precision* – десятичное число, указывающее, сколько цифр должно быть отображено после десятичной точки для значения с плавающей запятой, отформатированного с помощью `'f'` и `'F'`, или до и после десятичной точки для значения с плавающей запятой, отформатированного с помощью `'g'` или `'G'`. Для нечисловых типов этот параметр указывает максимальный размер поля – другими словами, сколько символов будет использовано из содержимого поля. Параметр *precision* не допускается для целых чисел.232233Наконец, *тип* определяет, как должны быть представлены данные.234235Доступные типы представления для строк:236237> | Тип | Значение |238> | --- | --- |239> | `'s'` | Формат строки. Это тип по умолчанию для строк и может быть опущен. |240> | None | То же, что и `'s'`. |241242Доступные типы представления для целых чисел:243244> | Тип | Значение |245> | --- | --- |246> | `'b'` | Двоичный формат. Выводит число в системе с основанием 2. |247> | `'c'` | Символ. Преобразует целое число в соответствующий символ Юникода перед выводом. |248> | `'d'` | Десятичное целое. Выводит число в системе с основанием 10. |249> | `'o'` | Восьмеричный формат. Выводит число в системе с основанием 8. |250> | `'x'` | Шестнадцатеричный формат. Выводит число в системе с основанием 16, используя строчные буквы для цифр больше 9. |251> | `'X'` | Шестнадцатеричный формат. Выводит число по основанию 16, используя заглавные буквы для цифр от 10 до 15. |252> | `'n'` | Число. То же, что и `'d'`, за исключением того, что для вставки соответствующих разделителей групп разрядов используется текущая локаль. |253> | None | То же, что и `'d'`. |254255В дополнение к указанным выше типам представления целые числа можно форматировать с помощью типов представления чисел с плавающей запятой, перечисленных ниже (кроме `'n'` и `None`). В этом случае для преобразования целого числа в число с плавающей запятой перед форматированием используется [`float()`](https://python-all.ru/3.6/library/functions.html#float).256257Доступные типы представления для чисел с плавающей запятой и десятичных чисел:258259> | Тип | Значение |260> | --- | --- |261> | `'e'` | Экспоненциальная запись. Выводит число в научной нотации, используя букву 'e' для обозначения показателя степени. Точность по умолчанию – `6`. |262> | `'E'` | Экспоненциальная запись. То же, что и `'e'`, за исключением того, что в качестве разделителя используется прописная буква 'E'. |263> | `'f'` | Запись с фиксированной точкой. Отображает число как число с фиксированной точкой. Точность по умолчанию – `6`. |264> | `'F'` | Фиксированная запись. То же, что и `'f'`, но преобразует `nan` в `NAN`, а `inf` в `INF`. |265> | `'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`. |266> | `'G'` | Общий формат. То же, что и `'g'`, за исключением того, что переключается на `'E'`, если число становится слишком большим. Представления бесконечности и NaN также переводятся в верхний регистр. |267> | `'n'` | Число. То же, что и `'g'`, за исключением того, что для вставки соответствующих разделителей групп разрядов используется текущая локаль. |268> | `'%'` | Проценты. Умножает число на 100 и выводит в фиксированном формате (`'f'`) с последующим знаком процента. |269> | None | Аналогично `'g'`, за исключением того, что запись с фиксированной точкой, при использовании, содержит хотя бы одну цифру после десятичной точки. Точность по умолчанию настолько высока, насколько необходимо для представления конкретного значения. Общий эффект заключается в том, чтобы соответствовать выводу [`str()`](https://python-all.ru/3.6/library/stdtypes.html#str), изменённому другими модификаторами формата. |270271### 6.1.3.2. Примеры форматирования272273Этот раздел содержит примеры синтаксиса [`str.format()`](https://python-all.ru/3.6/library/stdtypes.html#str.format) и сравнение со старым форматированием `%`.274275В большинстве случаев синтаксис похож на старое форматирование `%`, с добавлением `{}` и использованием `:` вместо `%`. Например, `'%03.2f'` можно преобразовать в `'{:03.2f}'`.276277Новый синтаксис форматирования также поддерживает новые и другие параметры, показанные в следующих примерах.278279Доступ к аргументам по позиции:280281```python282>>> '{0}, {1}, {2}'.format('a', 'b', 'c')283'a, b, c'284>>> '{}, {}, {}'.format('a', 'b', 'c')  # Только для версии 3.1+285'a, b, c'286>>> '{2}, {1}, {0}'.format('a', 'b', 'c')287'c, b, a'288>>> '{2}, {1}, {0}'.format(*'abc')      # Распаковка последовательности аргументов289'c, b, a'290>>> '{0}{1}{0}'.format('abra', 'cad')   # индексы аргументов могут повторяться291'abracadabra'292```293294Доступ к аргументам по имени:295296```python297>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')298'Coordinates: 37.24N, -115.81W'299>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}300>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)301'Coordinates: 37.24N, -115.81W'302```303304Доступ к атрибутам аргументов:305306```python307>>> c = 3-5j308>>> ('The complex number {0} is formed from the real part {0.real} '309...  'and the imaginary part {0.imag}.').format(c)310'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'311>>> class Point:312...     def __init__(self, x, y):313...         self.x, self.y = x, y314...     def __str__(self):315...         return 'Point({self.x}, {self.y})'.format(self=self)316...317>>> str(Point(4, 2))318'Point(4, 2)'319```320321Доступ к элементам аргументов:322323```python324>>> coord = (3, 5)325>>> 'X: {0[0]};  Y: {0[1]}'.format(coord)326'X: 3;  Y: 5'327```328329Замена `%s` и `%r`:330331```python332>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')333"repr() shows quotes: 'test1'; str() doesn't: test2"334```335336Выравнивание текста и указание ширины:337338```python339>>> '{:<30}'.format('left aligned')340'left aligned                  '341>>> '{:>30}'.format('right aligned')342'                 right aligned'343>>> '{:^30}'.format('centered')344'           centered           '345>>> '{:*^30}'.format('centered')  # использовать '*' в качестве символа заполнения346'***********centered***********'347```348349Замена `%+f`, `%-f` и `% f` и указание знака:350351```python352>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # отображать всегда353'+3.140000; -3.140000'354>>> '{: f}; {: f}'.format(3.14, -3.14)  # для положительных чисел отображать пробел355' 3.140000; -3.140000'356>>> '{:-f}; {:-f}'.format(3.14, -3.14)  # отображать только минус – то же, что и '{:f}; {:f}'357'3.140000; -3.140000'358```359360Замена `%x` и `%o` и преобразование значения в разные системы счисления:361362```python363>>> # format также поддерживает двоичные числа364>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)365'int: 42;  hex: 2a;  oct: 52;  bin: 101010'366>>> # с префиксом 0x, 0o или 0b:367>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)368'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'369```370371Использование запятой в качестве разделителя тысяч:372373```python374>>> '{:,}'.format(1234567890)375'1,234,567,890'376```377378Выражение процентов:379380```python381>>> points = 19382>>> total = 22383>>> 'Correct answers: {:.2%}'.format(points/total)384'Correct answers: 86.36%'385```386387Использование форматирования с учётом типа:388389```python390>>> import datetime391>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)392>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)393'2010-07-04 12:15:58'394```395396Вложенные аргументы и более сложные примеры:397398```python399>>> for align, text in zip('<^>', ['left', 'center', 'right']):400...     '{0:{fill}{align}16}'.format(text, fill=align, align=align)401...402'left<<<<<<<<<<<<'403'^^^^^center^^^^^'404'>>>>>>>>>>>right'405>>>406>>> octets = [192, 168, 0, 1]407>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)408'C0A80001'409>>> int(_, 16)4103232235521411>>>412>>> width = 5413>>> for num in range(5,12): 414...     for base in 'dXob':415...         print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')416...     print()417...418    5     5     5   101419    6     6     6   110420    7     7     7   111421    8     8    10  1000422    9     9    11  1001423   10     A    12  1010424   11     B    13  1011425```426427## 6.1.4. Шаблонные строки428429Шаблонные строки предоставляют более простые подстановки строк, как описано в [**PEP 292**](https://python-all.ru/3.6/library/string.html). Основной вариант использования шаблонных строк – интернационализация (i18n), поскольку в этом контексте более простой синтаксис и функциональность упрощают перевод по сравнению с другими встроенными средствами форматирования строк в Python. В качестве примера библиотеки, построенной на шаблонных строках для i18n, см. пакет [flufl.i18n](https://python-all.ru/3.6/library/string.html).430431Шаблонные строки поддерживают подстановки на основе `$`, используя следующие правила:432433- `$$` – это escape-последовательность; она заменяется на один символ `$`.434- `$identifier` обозначает заполнитель подстановки, соответствующий ключу отображения `"identifier"`. По умолчанию `"identifier"` ограничивается любой алфавитно-цифровой строкой ASCII без учёта регистра (включая подчёркивания), которая начинается с подчёркивания или буквы ASCII. Первый символ, не являющийся идентификатором, после символа `$` завершает спецификацию этого заполнителя.435- `${identifier}` эквивалентно `$identifier`. Это необходимо, когда после заполнителя следуют допустимые символы идентификатора, не являющиеся частью заполнителя, например `"${noun}ification"`.436437Любое другое появление `$` в строке приведёт к вызову исключения [`ValueError`](https://python-all.ru/3.6/library/exceptions.html#ValueError).438439Модуль [`string`](https://python-all.ru/3.6/library/string.html#module-string) предоставляет класс [`Template`](https://python-all.ru/3.6/library/string.html#string.Template), реализующий эти правила. Методы [`Template`](https://python-all.ru/3.6/library/string.html#string.Template):440441#### `class string.Template(template)`442443Конструктор принимает единственный аргумент – строку шаблона.444445#### `substitute(mapping, **kwds)`446447Выполняет подстановку в шаблон, возвращая новую строку. *mapping* – это любой объект, подобный словарю, ключи которого соответствуют плейсхолдерам в шаблоне. В качестве альтернативы можно указать именованные аргументы, где имена аргументов являются плейсхолдерами. Если указаны и *mapping*, и *kwds*, и есть дубликаты, то плейсхолдеры из *kwds* имеют приоритет.448449#### `safe_substitute(mapping, **kwds)`450451Как и [`substitute()`](https://python-all.ru/3.6/library/string.html#string.Template.substitute), за исключением того, что если плейсхолдеры отсутствуют в *mapping* и *kwds*, то вместо возбуждения исключения [`KeyError`](https://python-all.ru/3.6/library/exceptions.html#KeyError) исходный плейсхолдер остаётся в результирующей строке без изменений. Кроме того, в отличие от [`substitute()`](https://python-all.ru/3.6/library/string.html#string.Template.substitute), любые другие появления `$` просто возвращают `$`, а не возбуждают [`ValueError`](https://python-all.ru/3.6/library/exceptions.html#ValueError).452453Хотя другие исключения всё ещё могут возникать, этот метод называется «безопасным», потому что он всегда старается вернуть пригодную строку вместо возбуждения исключения. В другом смысле [`safe_substitute()`](https://python-all.ru/3.6/library/string.html#string.Template.safe_substitute) может быть чем угодно, кроме безопасного, поскольку он молча игнорирует некорректные шаблоны, содержащие висячие разделители, непарные скобки или плейсхолдеры, не являющиеся допустимыми идентификаторами Python.454455Экземпляры [`Template`](https://python-all.ru/3.6/library/string.html#string.Template) также предоставляют один открытый атрибут данных:456457#### `template`458459Это объект, переданный в аргумент *template* конструктора. В общем случае его не следует изменять, но доступ только для чтения не гарантируется.460461Вот пример использования Template:462463```python464>>> from string import Template465>>> s = Template('$who likes $what')466>>> s.substitute(who='tim', what='kung pao')467'tim likes kung pao'468>>> d = dict(who='tim')469>>> Template('Give $who $100').substitute(d)470Traceback (most recent call last):471...472ValueError: Invalid placeholder in string: line 1, col 11473>>> Template('$who likes $what').substitute(d)474Traceback (most recent call last):475...476KeyError: 'what'477>>> Template('$who likes $what').safe_substitute(d)478'tim likes $what'479```480481Расширенное использование: можно создать подклассы [`Template`](https://python-all.ru/3.6/library/string.html#string.Template), чтобы настроить синтаксис заполнителя, символ-разделитель или всё регулярное выражение, используемое для разбора шаблонных строк. Для этого можно переопределить следующие атрибуты класса:482483- *разделитель* – это литеральная строка, описывающая разделитель, предваряющий заполнитель. Значение по умолчанию – `$`. Обратите внимание, что это *не* должно быть регулярным выражением, так как реализация при необходимости вызовет [`re.escape()`](https://python-all.ru/3.6/library/re.html#re.escape) для этой строки.484- *idpattern* – это регулярное выражение, описывающее шаблон для заполнителей без фигурных скобок (фигурные скобки будут добавлены автоматически при необходимости). Значение по умолчанию – регулярное выражение `(?-i:[_a-zA-Z][_a-zA-Z0-9]*)`.485486  > **Примечание**487  >488  > Since default *flags* is `re.IGNORECASE`, pattern `[a-z]` can match with some non-ASCII characters. That’s why we use local `-i` flag here.489  >490  > Хотя флаги *flags* остаются `re.IGNORECASE` для обратной совместимости, при создании подкласса их можно переопределить на `0` или `re.IGNORECASE | re.ASCII`.491- *flags* – флаги регулярного выражения, которые будут применяться при компиляции регулярного выражения, используемого для распознавания подстановок. Значение по умолчанию – `re.IGNORECASE`. Обратите внимание, что `re.VERBOSE` всегда будет добавляться к флагам, поэтому пользовательские *idpattern* должны соответствовать соглашениям для многострочных регулярных выражений.492493  Новое в версии 3.2.494495В качестве альтернативы можно указать всё регулярное выражение, переопределив атрибут класса *pattern*. Если это сделать, значение должно быть объектом регулярного выражения с четырьмя именованными захватывающими группами. Эти группы соответствуют правилам, приведённым выше, а также правилу недопустимых плейсхолдеров:496497- *escaped* – эта группа соответствует управляющей последовательности, например `$$`, в шаблоне по умолчанию.498- *named* – эта группа соответствует имени плейсхолдера без скобок; она не должна включать разделитель в захватывающую группу.499- *braced* – эта группа соответствует имени плейсхолдера, заключённого в скобки; она не должна включать ни разделитель, ни скобки в захватывающую группу.500- *invalid* – эта группа соответствует любому другому шаблону разделителя (обычно одиночному разделителю), и она должна появляться последней в регулярном выражении.501502## 6.1.5. Вспомогательные функции503504#### `string.capwords(s, sep=None)`505506Разбивает аргумент на слова, используя [`str.split()`](https://python-all.ru/3.6/library/stdtypes.html#str.split), делает заглавной первую букву каждого слова с помощью [`str.capitalize()`](https://python-all.ru/3.6/library/stdtypes.html#str.capitalize) и объединяет слова, начинающиеся с заглавной буквы, используя [`str.join()`](https://python-all.ru/3.6/library/stdtypes.html#str.join). Если необязательный второй аргумент *sep* отсутствует или равен `None`, последовательности пробельных символов заменяются одним пробелом, а начальные и конечные пробелы удаляются; в противном случае *sep* используется для разбиения и объединения слов.507