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

string.md

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

1> **Источник:** https://python-all.ru/3.13/library/string.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `string` – Общие операции со строками89**Исходный код:** [Lib/string.py](https://python-all.ru/src/3.13/Lib/string.py)1011---1213> **См. также**14>15> [Тип текстовой последовательности – str](https://python-all.ru/3.13/library/stdtypes.html#textseq)16>17> [Методы строк](https://python-all.ru/3.13/library/stdtypes.html#string-methods)1819## Константы строк2021Константы, определённые в этом модуле:2223#### `string.ascii_letters`2425Конкатенация констант [`ascii_lowercase`](https://python-all.ru/3.13/library/string.html#string.ascii_lowercase) и [`ascii_uppercase`](https://python-all.ru/3.13/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-символов, которые Python считает печатаемыми. Это комбинация [`digits`](https://python-all.ru/3.13/library/string.html#string.digits), [`ascii_letters`](https://python-all.ru/3.13/library/string.html#string.ascii_letters), [`punctuation`](https://python-all.ru/3.13/library/string.html#string.punctuation) и [`whitespace`](https://python-all.ru/3.13/library/string.html#string.whitespace).5455> **Примечание**56>57> По замыслу, [`string.printable.isprintable()`](https://python-all.ru/3.13/library/stdtypes.html#str.isprintable) возвращает [`False`](https://python-all.ru/3.13/library/constants.html#False). В частности, `string.printable` не является печатаемым в смысле POSIX (см. *[LC\_CTYPE](https://python-all.ru/3.13/library/string.html)*).5859#### `string.whitespace`6061Строка, содержащая все ASCII-символы, которые считаются пробельными. Включает символы: пробел, табуляция, перевод строки, возврат каретки, прогон страницы и вертикальная табуляция.6263## Пользовательское форматирование строк6465Встроенный класс строк предоставляет возможность выполнять сложные замены переменных и форматирование значений с помощью метода [`format()`](https://python-all.ru/3.13/library/stdtypes.html#str.format), описанного в [**PEP 3101**](https://python-all.ru/3.13/library/string.html). Класс [`Formatter`](https://python-all.ru/3.13/library/string.html#string.Formatter) из модуля `string` позволяет создавать и настраивать собственное поведение форматирования строк, используя ту же реализацию, что и встроенный метод `format()`.6667#### `class string.Formatter`6869Класс `Formatter` имеет следующие открытые методы:7071#### `format(format_string, /, *args, **kwargs)`7273Основной метод API. Принимает строку форматирования и произвольный набор позиционных и именованных аргументов. Это просто обёртка, вызывающая [`vformat()`](https://python-all.ru/3.13/library/string.html#string.Formatter.vformat).7475Изменено в версии 3.7: Аргумент строки форматирования теперь является [только позиционным](https://python-all.ru/3.13/glossary.html#positional-only-parameter).7677#### `vformat(format_string, args, kwargs)`7879Эта функция выполняет фактическую работу по форматированию. Она представлена как отдельная функция на случай, если нужно передать предопределённый словарь аргументов, вместо распаковки и повторной упаковки словаря в отдельные аргументы с помощью синтаксиса `*args` и `**kwargs`. `vformat()` выполняет разбивку строки форматирования на символьные данные и поля замены. Затем вызываются различные методы, описанные ниже.8081Кроме того, `Formatter` определяет ряд методов, предназначенных для переопределения в подклассах:8283#### `parse(format_string)`8485Перебирает format\_string и возвращает итерируемый объект кортежей (*literal\_text*, *field\_name*, *format\_spec*, *conversion*). Используется в [`vformat()`](https://python-all.ru/3.13/library/string.html#string.Formatter.vformat) для разбивки строки на буквальный текст или поля замены.8687Значения в кортеже концептуально представляют собой фрагмент литерального текста, за которым следует одно поле подстановки. Если литерального текста нет (что может произойти, когда два поля подстановки идут подряд), то *literal\_text* будет строкой нулевой длины. Если поля подстановки нет, то значения *field\_name*, *format\_spec* и *conversion* будут равны `None`.8889#### `get_field(field_name, args, kwargs)`9091По заданному *field\_name*, возвращённому [`parse()`](https://python-all.ru/3.13/library/string.html#string.Formatter.parse) (см. выше), преобразует его в объект для форматирования. Возвращает кортеж (obj, used\_key). По умолчанию принимает строки вида, определённого в [**PEP 3101**](https://python-all.ru/3.13/library/string.html), например, “0\[name\]” или “label.title”. *args* и *kwargs* передаются так же, как в [`vformat()`](https://python-all.ru/3.13/library/string.html#string.Formatter.vformat). Возвращаемое значение *used\_key* имеет тот же смысл, что параметр *key* у [`get_value()`](https://python-all.ru/3.13/library/string.html#string.Formatter.get_value).9293#### `get_value(key, args, kwargs)`9495Извлекает значение заданного поля. Аргумент *key* может быть целым числом или строкой. Если это целое число, оно представляет индекс позиционного аргумента в *args*; если строка – именованный аргумент в *kwargs*.9697Параметр *args* устанавливается в список позиционных аргументов для [`vformat()`](https://python-all.ru/3.13/library/string.html#string.Formatter.vformat), а параметр *kwargs* – в словарь именованных аргументов.9899Для составных имён полей эти функции вызываются только для первого компонента имени поля; последующие компоненты обрабатываются через обычные операции доступа к атрибутам и индексации.100101Например, выражение поля «0.name» вызовет `get_value()` с аргументом *key*, равным 0. Атрибут `name` будет получен после возврата из `get_value()` вызовом встроенной функции [`getattr()`](https://python-all.ru/3.13/library/functions.html#getattr).102103Если индекс или ключевое слово ссылаются на несуществующий элемент, должно быть возбуждено исключение [`IndexError`](https://python-all.ru/3.13/library/exceptions.html#IndexError) или [`KeyError`](https://python-all.ru/3.13/library/exceptions.html#KeyError).104105#### `check_unused_args(used_args, args, kwargs)`106107Реализует проверку на неиспользованные аргументы при необходимости. Аргументы этой функции – множество всех ключей аргументов, которые фактически были использованы в строке форматирования (целые числа для позиционных аргументов и строки для именованных), а также ссылка на *args* и *kwargs*, переданные в vformat. Множество неиспользованных аргументов можно вычислить по этим параметрам. Предполагается, что `check_unused_args()` возбуждает исключение, если проверка не пройдена.108109#### `format_field(value, format_spec)`110111`format_field()` просто вызывает глобальную встроенную функцию [`format()`](https://python-all.ru/3.13/library/functions.html#format). Метод предоставлен, чтобы подклассы могли переопределить его.112113#### `convert_field(value, conversion)`114115Преобразует значение (возвращённое [`get_field()`](https://python-all.ru/3.13/library/string.html#string.Formatter.get_field)) с учётом типа преобразования (как в кортеже, возвращаемом методом [`parse()`](https://python-all.ru/3.13/library/string.html#string.Formatter.parse)). Версия по умолчанию понимает типы преобразования 's' (str), 'r' (repr) и 'a' (ascii).116117## Синтаксис строк форматирования118119Метод [`str.format()`](https://python-all.ru/3.13/library/stdtypes.html#str.format) и класс [`Formatter`](https://python-all.ru/3.13/library/string.html#string.Formatter) используют одинаковый синтаксис строк форматирования (хотя в случае `Formatter` подклассы могут определять свой собственный синтаксис). Этот синтаксис связан с синтаксисом [f-строк](https://python-all.ru/3.13/reference/lexical_analysis.html#f-strings), но менее сложен и, в частности, не поддерживает произвольные выражения.120121Строки форматирования содержат «поля замены», заключённые в фигурные скобки `{}`. Всё, что не находится в скобках, считается буквальным текстом и копируется в вывод без изменений. Если нужно включить символ скобки в буквальный текст, его можно экранировать удвоением: `{{` и `}}`.122123Грамматика поля замены выглядит следующим образом:124125```126127replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"128field_name        ::= arg_name ("." attribute_name | "[" element_index "]")*129arg_name          ::= [identifier | digit+]130attribute_name    ::= identifier131element_index     ::= digit+ | index_string132index_string      ::= <any source character except "]"> +133conversion        ::= "r" | "s" | "a"134format_spec       ::= format-spec:format_spec135```136137В менее формальных терминах, поле замены может начинаться с *field\_name*, который задаёт объект, чьё значение должно быть отформатировано и вставлено в вывод вместо поля замены. За *field\_name* может опционально следовать поле *conversion*, которому предшествует восклицательный знак `'!'`, и *format\_spec*, которому предшествует двоеточие `':'`. Они задают нестандартный формат для заменяемого значения.138139См. также раздел [Мини-язык спецификации формата](https://python-all.ru/3.13/library/string.html#formatspec).140141Сам *field\_name* начинается с *arg\_name*, который может быть числом или ключевым словом. Если это число, оно ссылается на позиционный аргумент; если ключевое слово – на именованный аргумент. *arg\_name* считается числом, если вызов [`str.isdecimal()`](https://python-all.ru/3.13/library/stdtypes.html#str.isdecimal) для этой строки вернёт true. Если числовые arg\_names в строке форматирования идут по порядку: 0, 1, 2, …, их все можно опустить (не только некоторые), и числа 0, 1, 2, … будут автоматически вставлены в этом порядке. Поскольку *arg\_name* не ограничен кавычками, невозможно задать произвольные ключи словаря (например, строки `'10'` или `':-]'`) внутри строки форматирования. За *arg\_name* может следовать любое количество выражений индекса или атрибута. Выражение вида `'.name'` выбирает именованный атрибут с помощью [`getattr()`](https://python-all.ru/3.13/library/functions.html#getattr), а выражение вида `'[index]'` выполняет поиск по индексу с помощью [`__getitem__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__getitem__).142143Изменено в версии 3.1: Спецификаторы позиционных аргументов можно опускать для [`str.format()`](https://python-all.ru/3.13/library/stdtypes.html#str.format), поэтому `'{} {}'.format(a, b)` эквивалентно `'{0} {1}'.format(a, b)`.144145Изменено в версии 3.4: Спецификаторы позиционных аргументов можно опускать для [`Formatter`](https://python-all.ru/3.13/library/string.html#string.Formatter).146147Несколько простых примеров строк форматирования:148149```python150"First, thou shalt count to {0}"  # Ссылается на первый позиционный аргумент151"Bring me a {}"                   # Неявно ссылается на первый позиционный аргумент152"From {} to {}"                   # То же, что "From {0} to {1}"153"My quest is {name}"              # Ссылается на именованный аргумент 'name'154"Weight in tons {0.weight}"       # Атрибут 'weight' первого позиционного аргумента155"Units destroyed: {players[0]}"   # Первый элемент именованного аргумента 'players'.156```157158Поле *conversion* вызывает приведение типа перед форматированием. Обычно задачу форматирования значения выполняет его собственный метод [`__format__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__format__). Однако в некоторых случаях требуется принудительно отформатировать тип как строку, переопределяя его собственное определение форматирования. Преобразовав значение в строку перед вызовом `__format__()`, можно обойти обычную логику форматирования.159160В настоящее время поддерживаются три флага преобразования: `'!s'` вызывает [`str()`](https://python-all.ru/3.13/library/stdtypes.html#str) для значения, `'!r'` вызывает [`repr()`](https://python-all.ru/3.13/library/functions.html#repr), и `'!a'` вызывает [`ascii()`](https://python-all.ru/3.13/library/functions.html#ascii).161162Несколько примеров:163164```python165"Harold's a clever {0!s}"        # Сначала вызывает str() для аргумента166"Bring out the holy {name!r}"    # Сначала вызывает repr() для аргумента167"More {!a}"                      # Сначала вызывает ascii() для аргумента168```169170Поле *format\_spec* содержит спецификацию того, как должно быть представлено значение, включая такие детали, как ширина поля, выравнивание, заполнение, десятичная точность и так далее. Каждый тип значения может определять свой собственный «мини-язык форматирования» или интерпретацию *format\_spec*.171172Большинство встроенных типов поддерживают общий мини-язык форматирования, который описан в следующем разделе.173174Поле *format\_spec* также может содержать вложенные поля подстановки. Эти вложенные поля подстановки могут содержать имя поля, флаг преобразования и спецификацию формата, но более глубокая вложенность не допускается. Поля подстановки внутри format\_spec подставляются перед интерпретацией строки *format\_spec*. Это позволяет динамически задавать форматирование значения.175176Смотрите раздел [Примеры форматирования](https://python-all.ru/3.13/library/string.html#formatexamples) для примеров.177178### Мини-язык спецификации формата179180«Спецификации формата» используются внутри полей подстановки в строке форматирования для определения представления отдельных значений (см. [Синтаксис строк форматирования](https://python-all.ru/3.13/library/string.html#formatstrings) и [f-строки](https://python-all.ru/3.13/reference/lexical_analysis.html#f-strings)). Они также могут передаваться напрямую встроенной функции [`format()`](https://python-all.ru/3.13/library/functions.html#format). Каждый форматируемый тип может определять, как интерпретировать спецификацию формата.181182Большинство встроенных типов реализуют следующие параметры для спецификаций формата, хотя некоторые параметры форматирования поддерживаются только числовыми типами.183184Пустая спецификация формата даёт тот же результат, что и вызов [`str()`](https://python-all.ru/3.13/library/stdtypes.html#str) для значения. Непустая спецификация формата обычно изменяет результат.185186Общий вид *стандартного спецификатора формата*:187188```189190format_spec ::= [options][width][grouping]["." precision][type]191options     ::= [[fill]align][sign]["z"]["#"]["0"]192fill        ::= <any character>193align       ::= "<" | ">" | "=" | "^"194sign        ::= "+" | "-" | " "195width       ::= digit+196grouping    ::= "," | "_"197precision   ::= digit+198type        ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g"199                | "G" | "n" | "o" | "s" | "x" | "X" | "%"200```201202Если указано допустимое значение *align*, ему может предшествовать символ *fill*, который может быть любым символом и по умолчанию является пробелом, если не указан. Нельзя использовать фигурную скобку (”`{`” или “`}`”) в качестве символа *fill* в [форматированном строковом литерале](https://python-all.ru/3.13/reference/lexical_analysis.html#f-strings) или при использовании метода [`str.format()`](https://python-all.ru/3.13/library/stdtypes.html#str.format). Однако можно вставить фигурную скобку с помощью вложенного поля подстановки. Это ограничение не влияет на функцию [`format()`](https://python-all.ru/3.13/library/functions.html#format).203204Значение различных параметров выравнивания следующее:205206| Параметр | Значение |207| --- | --- |208| `'<'` | Выравнивает поле по левому краю в пределах доступного пространства (это значение по умолчанию для большинства объектов). |209| `'>'` | Выравнивает поле по правому краю в пределах доступного пространства (это значение по умолчанию для чисел). |210| `'='` | Размещает заполнение после знака (если он есть), но перед цифрами. Используется для вывода полей в виде ‘+000000120’. Этот параметр выравнивания допустим только для числовых типов, исключая [`complex`](https://python-all.ru/3.13/library/functions.html#complex). Он становится значением по умолчанию для чисел, когда «0» непосредственно предшествует ширине поля. |211| `'^'` | Выравнивает поле по центру в пределах доступного пространства. |212213Обратите внимание, что если не задана минимальная ширина поля, ширина поля всегда будет равна размеру заполняемых данных, поэтому в этом случае параметр выравнивания не имеет смысла.214215Параметр *sign* допустим только для числовых типов и может быть одним из следующих:216217| Параметр | Значение |218| --- | --- |219| `'+'` | Указывает, что знак должен использоваться как для положительных, так и для отрицательных чисел. |220| `'-'` | Указывает, что знак должен использоваться только для отрицательных чисел (это поведение по умолчанию). |221| пробел | Указывает, что для положительных чисел должен использоваться ведущий пробел, а для отрицательных – знак минуса. |222223Параметр `'z'` приводит отрицательный ноль с плавающей запятой к положительному нулю после округления до точности формата. Этот параметр действителен только для типов представления с плавающей запятой.224225Изменено в версии 3.11: Добавлен параметр `'z'` (см. также [**PEP 682**](https://python-all.ru/3.13/library/string.html)).226227Параметр `'#'` заставляет использовать «альтернативную форму» для преобразования. Альтернативная форма определяется по-разному для разных типов. Этот параметр действителен только для целых, вещественных и комплексных типов. Для целых чисел при двоичном, восьмеричном или шестнадцатеричном выводе этот параметр добавляет соответствующий префикс `'0b'`, `'0o'`, `'0x'` или `'0X'` к выходному значению. Для вещественных и комплексных чисел альтернативная форма приводит к тому, что результат преобразования всегда содержит десятичную точку, даже если за ней нет цифр. Обычно десятичная точка появляется в результате этих преобразований только если за ней следует цифра. Кроме того, для преобразований `'g'` и `'G'` конечные нули не удаляются из результата.228229*width* – это десятичное целое число, определяющее минимальную общую ширину поля, включая любые префиксы, разделители и другие форматирующие символы. Если не указано, ширина поля определяется содержимым.230231Если явное выравнивание не задано, предшествование полю *width* символа нуля (`'0'`) включает знакозависимое дополнение нулями для числовых типов, исключая [`complex`](https://python-all.ru/3.13/library/functions.html#complex). Это эквивалентно символу заполнения *fill* типа `'0'` с типом выравнивания *alignment* `'='`.232233Изменено в версии 3.10: Предшествование полю *width* символа `'0'` больше не влияет на выравнивание по умолчанию для строк.234235Опция *grouping* после поля *width* задаёт разделитель групп цифр для целой части числа. Она может принимать одно из следующих значений:236237| Параметр | Значение |238| --- | --- |239| `','` | Вставляет запятую каждые 3 цифры для целочисленного типа представления `'d'` и типов представления с плавающей запятой, исключая `'n'`. Для других типов представления этот параметр не поддерживается. |240| `'_'` | Вставляет подчеркивание каждые 3 цифры для целочисленного типа представления `'d'` и типов представления с плавающей запятой, исключая `'n'`. Для целочисленных типов представления `'b'`, `'o'`, `'x'` и `'X'` подчеркивания вставляются каждые 4 цифры. Для других типов представления этот параметр не поддерживается. |241242Для разделителя, учитывающего локаль, используйте `'n'` [тип представления с плавающей запятой](https://python-all.ru/3.13/library/string.html#n-format-float) или [тип представления целого числа](https://python-all.ru/3.13/library/string.html#n-format-integer).243244Изменено в версии 3.1: Добавлена опция `','` (см. также [**PEP 378**](https://python-all.ru/3.13/library/string.html)).245246Изменено в версии 3.6: Добавлена опция `'_'` (см. также [**PEP 515**](https://python-all.ru/3.13/library/string.html)).247248*precision* – это десятичное целое число, указывающее, сколько цифр должно отображаться после десятичной точки для типов представления `'f'` и `'F'`, или до и после десятичной точки для типов представления `'g'` или `'G'`. Для строковых типов представления это поле указывает максимальный размер поля – иными словами, сколько символов будет использовано из содержимого поля. *precision* не допускается для целочисленных типов представления.249250Наконец, *тип* определяет, как должны быть представлены данные.251252Доступные типы представления для строк:253254> | Тип | Значение |255> | --- | --- |256> | `'s'` | Формат строки. Это тип по умолчанию для строк и может быть опущен. |257> | None | То же, что и `'s'`. |258259Доступные типы представления для целых чисел:260261> | Тип | Значение |262> | --- | --- |263> | `'b'` | Двоичный формат. Выводит число в системе с основанием 2. |264> | `'c'` | Символ. Преобразует целое число в соответствующий символ Юникода перед выводом. |265> | `'d'` | Десятичное целое. Выводит число в системе с основанием 10. |266> | `'o'` | Восьмеричный формат. Выводит число в системе с основанием 8. |267> | `'x'` | Шестнадцатеричный формат. Выводит число в системе с основанием 16, используя строчные буквы для цифр больше 9. |268> | `'X'` | Шестнадцатеричный формат. Выводит число в системе с основанием 16, используя заглавные буквы для цифр больше 9. Если указан `'#'`, префикс `'0x'` также будет приведён к верхнему регистру `'0X'`. |269> | `'n'` | Число. То же, что и `'d'`, за исключением того, что использует текущую локаль для вставки соответствующих разделителей групп цифр. Обратите внимание, что локаль по умолчанию не является системной локалью. В зависимости от ситуации может потребоваться установить [`LC_NUMERIC`](https://python-all.ru/3.13/library/locale.html#locale.LC_NUMERIC) с помощью [`locale.setlocale()`](https://python-all.ru/3.13/library/locale.html#locale.setlocale) перед использованием `'n'`. |270> | None | То же, что и `'d'`. |271272В дополнение к перечисленным выше типам представления, целые числа можно форматировать с помощью типов представления с плавающей запятой, перечисленных ниже (кроме `'n'` и `None`). В этом случае [`float()`](https://python-all.ru/3.13/library/functions.html#float) используется для преобразования целого числа в число с плавающей запятой перед форматированием.273274Доступные типы представления для значений [`float`](https://python-all.ru/3.13/library/functions.html#float) и [`Decimal`](https://python-all.ru/3.13/library/decimal.html#decimal.Decimal):275276> | Тип | Значение |277> | --- | --- |278> | `'e'` | Экспоненциальная запись. Для заданной точности `p` форматирует число в экспоненциальной записи с буквой 'e', разделяющей мантиссу и порядок. Мантисса содержит одну цифру до и `p` цифр после десятичной точки, всего `p + 1` значащих цифр. Если точность не задана, используется точность `6` цифр после десятичной точки для [`float`](https://python-all.ru/3.13/library/functions.html#float), и показываются все цифры мантиссы для [`Decimal`](https://python-all.ru/3.13/library/decimal.html#decimal.Decimal). Если `p=0`, десятичная точка опускается, если не используется опция `#`. Для [`float`](https://python-all.ru/3.13/library/functions.html#float) порядок всегда содержит как минимум две цифры и равен нулю, если значение равно нулю. |279> | `'E'` | Экспоненциальная запись. То же, что и `'e'`, за исключением использования заглавной буквы 'E' в качестве разделителя. |280> | `'f'` | Фиксированная запись. Для заданной точности `p` форматирует число как десятичное число с ровно `p` цифрами после десятичной точки. Если точность не задана, используется точность `6` цифр после десятичной точки для [`float`](https://python-all.ru/3.13/library/functions.html#float), и используется точность, достаточная для отображения всех цифр мантиссы для [`Decimal`](https://python-all.ru/3.13/library/decimal.html#decimal.Decimal). Если `p=0`, десятичная точка опускается, если не используется опция `#`. |281> | `'F'` | Фиксированная запись. То же, что и `'f'`, но преобразует `nan` в `NAN`, а `inf` в `INF`. |282> | `'g'` | Общий формат. Для заданной точности `p >= 1` округляет число до `p` значащих цифр, а затем форматирует результат в фиксированном формате или в экспоненциальной записи в зависимости от его величины. Точность `0` считается эквивалентной точности `1`. Точные правила следующие: предположим, что результат, отформатированный с типом представления `'e'` и точностью `p-1`, имеет порядок `exp`. Тогда, если `m <= exp < p`, где `m` равно -4 для чисел с плавающей запятой и -6 для [`Decimals`](https://python-all.ru/3.13/library/decimal.html#decimal.Decimal), число форматируется с типом представления `'f'` и точностью `p-1-exp`. В противном случае число форматируется с типом представления `'e'` и точностью `p-1`. В обоих случаях незначащие конечные нули удаляются из мантиссы, а десятичная точка также удаляется, если после неё не осталось цифр, если только не используется опция `'#'`. Если точность не задана, используется точность `6` значащих цифр для [`float`](https://python-all.ru/3.13/library/functions.html#float). Для [`Decimal`](https://python-all.ru/3.13/library/decimal.html#decimal.Decimal) мантисса результата формируется из цифр мантиссы значения; экспоненциальная запись используется для значений, меньших `1e-6` по абсолютной величине, и значений, где разряд наименьшей значащей цифры больше 1, в противном случае используется фиксированная запись. Положительная и отрицательная бесконечность, положительный и отрицательный ноль, а также nan форматируются как `inf`, `-inf`, `0`, `-0` и `nan` соответственно, независимо от точности. |283> | `'G'` | Общий формат. То же, что и `'g'`, за исключением того, что переключается на `'E'`, если число становится слишком большим. Представления бесконечности и NaN также переводятся в верхний регистр. |284> | `'n'` | Число. То же, что и `'g'`, за исключением того, что использует текущую локаль для вставки соответствующих разделителей групп цифр для целой части числа. Обратите внимание, что локаль по умолчанию не является системной локалью. В зависимости от ситуации может потребоваться установить [`LC_NUMERIC`](https://python-all.ru/3.13/library/locale.html#locale.LC_NUMERIC) с помощью [`locale.setlocale()`](https://python-all.ru/3.13/library/locale.html#locale.setlocale) перед использованием `'n'`. |285> | `'%'` | Проценты. Умножает число на 100 и выводит в фиксированном формате (`'f'`) с последующим знаком процента. |286> | None | Для [`float`](https://python-all.ru/3.13/library/functions.html#float) это похоже на тип `'g'`, за исключением того, что при использовании нотации с фиксированной точкой для форматирования результата всегда включается хотя бы одна цифра после десятичной точки, и переключение на научную нотацию происходит, когда `exp >= p - 1`. Если точность не указана, последняя будет настолько большой, насколько это необходимо для точного представления заданного значения. Для [`Decimal`](https://python-all.ru/3.13/library/decimal.html#decimal.Decimal) это то же самое, что `'g'` или `'G'`, в зависимости от значения `context.capitals` для текущего десятичного контекста. Общий эффект заключается в соответствии выходным данным [`str()`](https://python-all.ru/3.13/library/stdtypes.html#str), изменённым другими модификаторами форматирования. |287288Результат должен быть правильно округлён до заданной точности `p` цифр после десятичной точки. Режим округления для [`float`](https://python-all.ru/3.13/library/functions.html#float) соответствует режиму встроенной функции [`round()`](https://python-all.ru/3.13/library/functions.html#round). Для [`Decimal`](https://python-all.ru/3.13/library/decimal.html#decimal.Decimal) будет использоваться режим округления текущего [контекста](https://python-all.ru/3.13/library/decimal.html#decimal-context).289290Доступные типы представления для [`complex`](https://python-all.ru/3.13/library/functions.html#complex) такие же, как и для [`float`](https://python-all.ru/3.13/library/functions.html#float) (`'%'` не допускается). Как действительная, так и мнимая части комплексного числа форматируются как числа с плавающей запятой в соответствии с указанным типом представления. Они разделяются обязательным знаком мнимой части, причём последняя завершается суффиксом `j`. Если тип представления отсутствует, результат будет соответствовать выводу [`str()`](https://python-all.ru/3.13/library/stdtypes.html#str) (комплексные числа с ненулевой действительной частью также заключаются в круглые скобки), возможно, изменённому другими модификаторами форматирования.291292### Примеры форматирования293294Этот раздел содержит примеры синтаксиса [`str.format()`](https://python-all.ru/3.13/library/stdtypes.html#str.format) и сравнение со старым форматированием `%`.295296В большинстве случаев синтаксис похож на старое форматирование `%`, с добавлением `{}` и использованием `:` вместо `%`. Например, `'%03.2f'` можно преобразовать в `'{:03.2f}'`.297298Новый синтаксис форматирования также поддерживает новые и другие параметры, показанные в следующих примерах.299300Доступ к аргументам по позиции:301302```python303>>> '{0}, {1}, {2}'.format('a', 'b', 'c')304'a, b, c'305>>> '{}, {}, {}'.format('a', 'b', 'c')  # Только для версии 3.1+306'a, b, c'307>>> '{2}, {1}, {0}'.format('a', 'b', 'c')308'c, b, a'309>>> '{2}, {1}, {0}'.format(*'abc')      # Распаковка последовательности аргументов310'c, b, a'311>>> '{0}{1}{0}'.format('abra', 'cad')   # индексы аргументов могут повторяться312'abracadabra'313```314315Доступ к аргументам по имени:316317```python318>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')319'Coordinates: 37.24N, -115.81W'320>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}321>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)322'Coordinates: 37.24N, -115.81W'323```324325Доступ к атрибутам аргументов:326327```python328>>> c = 3-5j329>>> ('The complex number {0} is formed from the real part {0.real} '330...  'and the imaginary part {0.imag}.').format(c)331'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'332>>> class Point:333...     def __init__(self, x, y):334...         self.x, self.y = x, y335...     def __str__(self):336...         return 'Point({self.x}, {self.y})'.format(self=self)337...338>>> str(Point(4, 2))339'Point(4, 2)'340```341342Доступ к элементам аргументов:343344```python345>>> coord = (3, 5)346>>> 'X: {0[0]};  Y: {0[1]}'.format(coord)347'X: 3;  Y: 5'348```349350Замена `%s` и `%r`:351352```python353>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')354"repr() shows quotes: 'test1'; str() doesn't: test2"355```356357Выравнивание текста и указание ширины:358359```python360>>> '{:<30}'.format('left aligned')361'left aligned                  '362>>> '{:>30}'.format('right aligned')363'                 right aligned'364>>> '{:^30}'.format('centered')365'           centered           '366>>> '{:*^30}'.format('centered')  # использовать '*' в качестве символа заполнения367'***********centered***********'368```369370Замена `%+f`, `%-f` и `% f` и указание знака:371372```python373>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # отображать всегда374'+3.140000; -3.140000'375>>> '{: f}; {: f}'.format(3.14, -3.14)  # для положительных чисел отображать пробел376' 3.140000; -3.140000'377>>> '{:-f}; {:-f}'.format(3.14, -3.14)  # отображать только минус – то же, что и '{:f}; {:f}'378'3.140000; -3.140000'379```380381Замена `%x` и `%o` и преобразование значения в разные системы счисления:382383```python384>>> # format также поддерживает двоичные числа385>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)386'int: 42;  hex: 2a;  oct: 52;  bin: 101010'387>>> # с префиксом 0x, 0o или 0b:388>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)389'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'390```391392Использование запятой или подчёркивания в качестве разделителя групп цифр:393394```python395>>> '{:,}'.format(1234567890)396'1,234,567,890'397>>> '{:_}'.format(1234567890)398'1_234_567_890'399>>> '{:_b}'.format(1234567890)400'100_1001_1001_0110_0000_0010_1101_0010'401>>> '{:_x}'.format(1234567890)402'4996_02d2'403```404405Выражение процентов:406407```python408>>> points = 19409>>> total = 22410>>> 'Correct answers: {:.2%}'.format(points/total)411'Correct answers: 86.36%'412```413414Использование форматирования с учётом типа:415416```python417>>> import datetime as dt418>>> d = dt.datetime(2010, 7, 4, 12, 15, 58)419>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)420'2010-07-04 12:15:58'421```422423Вложенные аргументы и более сложные примеры:424425```python426>>> for align, text in zip('<^>', ['left', 'center', 'right']):427...     '{0:{fill}{align}16}'.format(text, fill=align, align=align)428...429'left<<<<<<<<<<<<'430'^^^^^center^^^^^'431'>>>>>>>>>>>right'432>>>433>>> octets = [192, 168, 0, 1]434>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)435'C0A80001'436>>> int(_, 16)4373232235521438>>>439>>> width = 5440>>> for num in range(5,12):441...     for base in 'dXob':442...         print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')443...     print()444...445    5     5     5   101446    6     6     6   110447    7     7     7   111448    8     8    10  1000449    9     9    11  1001450   10     A    12  1010451   11     B    13  1011452```453454## Шаблонные строки455456Шаблонные строки предоставляют более простые подстановки строк, как описано в [**PEP 292**](https://python-all.ru/3.13/library/string.html). Основной вариант использования шаблонных строк – интернационализация (i18n), поскольку в этом контексте более простой синтаксис и функциональность упрощают перевод по сравнению с другими встроенными средствами форматирования строк в Python. В качестве примера библиотеки, построенной на шаблонных строках для i18n, см. пакет [flufl.i18n](https://python-all.ru/3.13/library/string.html).457458Шаблонные строки поддерживают подстановки на основе `$`, используя следующие правила:459460- `$$` – это escape-последовательность; она заменяется на один символ `$`.461- `$identifier` обозначает заполнитель подстановки, соответствующий ключу отображения `"identifier"`. По умолчанию `"identifier"` ограничивается любой алфавитно-цифровой строкой ASCII без учёта регистра (включая подчёркивания), которая начинается с подчёркивания или буквы ASCII. Первый символ, не являющийся идентификатором, после символа `$` завершает спецификацию этого заполнителя.462- `${identifier}` эквивалентно `$identifier`. Это необходимо, когда после заполнителя следуют допустимые символы идентификатора, не являющиеся частью заполнителя, например `"${noun}ification"`.463464Любое другое появление `$` в строке приведёт к вызову исключения [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError).465466Модуль `string` предоставляет класс [`Template`](https://python-all.ru/3.13/library/string.html#string.Template), реализующий эти правила. Методы `Template`:467468#### `class string.Template(template)`469470Конструктор принимает единственный аргумент – строку шаблона.471472#### `substitute(mapping={}, /, **kwds)`473474Выполняет подстановку в шаблон, возвращая новую строку. *mapping* – это любой объект, подобный словарю, ключи которого соответствуют плейсхолдерам в шаблоне. В качестве альтернативы можно указать именованные аргументы, где имена аргументов являются плейсхолдерами. Если указаны и *mapping*, и *kwds*, и есть дубликаты, то плейсхолдеры из *kwds* имеют приоритет.475476#### `safe_substitute(mapping={}, /, **kwds)`477478Как и [`substitute()`](https://python-all.ru/3.13/library/string.html#string.Template.substitute), за исключением того, что если плейсхолдеры отсутствуют в *mapping* и *kwds*, то вместо возбуждения исключения [`KeyError`](https://python-all.ru/3.13/library/exceptions.html#KeyError) исходный плейсхолдер остаётся в результирующей строке без изменений. Кроме того, в отличие от `substitute()`, любые другие появления `$` просто возвращают `$`, а не возбуждают [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError).479480Хотя другие исключения всё ещё могут возникать, этот метод называется «безопасным», потому что он всегда старается вернуть пригодную строку вместо возбуждения исключения. В другом смысле `safe_substitute()` может быть чем угодно, кроме безопасного, поскольку он молча игнорирует некорректные шаблоны, содержащие висячие разделители, непарные скобки или плейсхолдеры, не являющиеся допустимыми идентификаторами Python.481482#### `is_valid()`483484Возвращает `False`, если шаблон содержит недопустимые плейсхолдеры, которые приведут к тому, что [`substitute()`](https://python-all.ru/3.13/library/string.html#string.Template.substitute) возбудит [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError).485486Добавлено в версии 3.12.487488#### `get_identifiers()`489490Возвращает список допустимых идентификаторов в шаблоне, в порядке их первого появления, игнорируя любые недопустимые идентификаторы.491492Добавлено в версии 3.12.493494Экземпляры `Template` также предоставляют один открытый атрибут данных:495496#### `template`497498Это объект, переданный в аргумент *template* конструктора. В общем случае его не следует изменять, но доступ только для чтения не гарантируется.499500Вот пример использования Template:501502```python503>>> from string import Template504>>> s = Template('$who likes $what')505>>> s.substitute(who='tim', what='kung pao')506'tim likes kung pao'507>>> d = dict(who='tim')508>>> Template('Give $who $100').substitute(d)509Traceback (most recent call last):510...511ValueError: Invalid placeholder in string: line 1, col 11512>>> Template('$who likes $what').substitute(d)513Traceback (most recent call last):514...515KeyError: 'what'516>>> Template('$who likes $what').safe_substitute(d)517'tim likes $what'518```519520Расширенное использование: можно создать подклассы [`Template`](https://python-all.ru/3.13/library/string.html#string.Template), чтобы настроить синтаксис плейсхолдеров, символ разделителя или всё регулярное выражение, используемое для разбора шаблонных строк. Для этого можно переопределить следующие атрибуты класса:521522- *delimiter* – это буквальная строка, описывающая разделитель, вводящий плейсхолдер. Значение по умолчанию – `$`. Обратите внимание, что это *не* должно быть регулярным выражением, так как реализация будет вызывать [`re.escape()`](https://python-all.ru/3.13/library/re.html#re.escape) для этой строки по мере необходимости. Кроме того, нельзя изменить разделитель после создания класса (т.е. другой разделитель должен быть задан в пространстве имён подкласса).523- *idpattern* – это регулярное выражение, описывающее шаблон для плейсхолдеров без скобок. Значение по умолчанию – регулярное выражение `(?a:[_a-z][_a-z0-9]*)`. Если оно задано, а *braceidpattern* равно `None`, то этот шаблон будет также применяться к плейсхолдерам в скобках.524525  > **Примечание**526  >527  > Поскольку значение по умолчанию *flags* равно `re.IGNORECASE`, шаблон `[a-z]` может совпадать с некоторыми не ASCII-символами. Вот почему здесь используется локальный флаг `a`.528529  Изменено в версии 3.7: *braceidpattern* можно использовать для определения отдельных шаблонов, используемых внутри и снаружи скобок.530- *braceidpattern* – похож на *idpattern*, но описывает шаблон для плейсхолдеров в скобках. По умолчанию `None`, что означает возврат к *idpattern* (т.е. один и тот же шаблон используется как внутри, так и вне скобок). Если задан, это позволяет определить разные шаблоны для плейсхолдеров в скобках и без скобок.531532  Добавлено в версии 3.7.533- *flags* – флаги регулярного выражения, которые будут применяться при компиляции регулярного выражения, используемого для распознавания подстановок. Значение по умолчанию – `re.IGNORECASE`. Обратите внимание, что `re.VERBOSE` всегда будет добавляться к флагам, поэтому пользовательские *idpattern* должны соответствовать соглашениям для многострочных регулярных выражений.534535  Добавлено в версии 3.2.536537В качестве альтернативы можно указать всё регулярное выражение, переопределив атрибут класса *pattern*. Если это сделать, значение должно быть объектом регулярного выражения с четырьмя именованными захватывающими группами. Эти группы соответствуют правилам, приведённым выше, а также правилу недопустимых плейсхолдеров:538539- *escaped* – эта группа соответствует управляющей последовательности, например `$$`, в шаблоне по умолчанию.540- *named* – эта группа соответствует имени плейсхолдера без скобок; она не должна включать разделитель в захватывающую группу.541- *braced* – эта группа соответствует имени плейсхолдера, заключённого в скобки; она не должна включать ни разделитель, ни скобки в захватывающую группу.542- *invalid* – эта группа соответствует любому другому шаблону разделителя (обычно одиночному разделителю), и она должна появляться последней в регулярном выражении.543544Методы этого класса возбуждают [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError), если шаблон соответствует регулярному выражению без совпадения одной из этих именованных групп.545546## Вспомогательные функции547548#### `string.capwords(s, sep=None)`549550Разбивает аргумент на слова, используя [`str.split()`](https://python-all.ru/3.13/library/stdtypes.html#str.split), делает заглавной первую букву каждого слова с помощью [`str.capitalize()`](https://python-all.ru/3.13/library/stdtypes.html#str.capitalize) и объединяет слова, начинающиеся с заглавной буквы, используя [`str.join()`](https://python-all.ru/3.13/library/stdtypes.html#str.join). Если необязательный второй аргумент *sep* отсутствует или равен `None`, последовательности пробельных символов заменяются одним пробелом, а начальные и конечные пробелы удаляются; в противном случае *sep* используется для разбиения и объединения слов.551