string
— Распространенные операции со строками¶
Исходный код: Lib/string.py
Строковые константы¶
Константами, определенными в этом модуле, являются:
- string.ascii_letters¶
Объединение констант
ascii_lowercase
иascii_uppercase
, описанное ниже. Это значение не зависит от языкового стандарта.
- string.ascii_lowercase¶
Строчные буквы
'abcdefghijklmnopqrstuvwxyz'
. Это значение не зависит от языка и не изменится.
- string.ascii_uppercase¶
Заглавные буквы
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
. Это значение не зависит от языка и не изменится.
- string.digits¶
Строка
'0123456789'
.
- string.hexdigits¶
Строка
'0123456789abcdefABCDEF'
.
- string.octdigits¶
Строка
'01234567'
.
- string.punctuation¶
Строка символов ASCII, которые считаются знаками препинания в языковом стандарте
C
:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
.
- string.printable¶
Строка символов ASCII, которые считаются пригодными для печати. Это комбинация символов
digits
,ascii_letters
,punctuation
, иwhitespace
.
- string.whitespace¶
Строка, содержащая все символы ASCII, которые считаются пробелами. Сюда входят символы пробела, табуляции, перевода строки, возврата, перевода формы и вертикальной табуляции.
Пользовательское форматирование строк¶
Встроенный класс string предоставляет возможность выполнять сложные подстановки переменных и форматирование значений с помощью метода format()
, описанного в разделе PEP 3101. Класс Formatter
в модуле string
позволяет вам создавать и настраивать свои собственные методы форматирования строк, используя ту же реализацию, что и встроенный метод format()
.
- class string.Formatter¶
Класс
Formatter
содержит следующие общедоступные методы:- format(format_string, /, *args, **kwargs)¶
Основной метод API. Он принимает строку формата и произвольный набор позиционных аргументов и ключевых слов. Это просто оболочка, которая вызывает
vformat()
.Изменено в версии 3.7: Аргументом форматной строки теперь является positional-only.
- vformat(format_string, args, kwargs)¶
Эта функция выполняет фактическую работу по форматированию. Он предоставляется как отдельная функция для случаев, когда вы хотите передать предопределенный словарь аргументов, а не распаковывать и переупаковывать словарь в виде отдельных аргументов, используя синтаксис
*args
и**kwargs
.vformat()
выполняет разбиение строки формата на символьные данные и поля для замены. Он вызывает различные методы, описанные ниже.
Кроме того,
Formatter
определяет ряд методов, которые предназначены для замены подклассами:- parse(format_string)¶
Выполните цикл по format_string и верните повторяющийся набор кортежей (literal_text, field_name, format_spec, conversion). Это используется
vformat()
для разбиения строки либо на буквальный текст, либо на заменяющие поля.Значения в кортеже концептуально представляют собой фрагмент буквального текста, за которым следует одно поле для замены. Если буквального текста нет (что может произойти, если два поля для замены встречаются последовательно), то literal_text будет строкой нулевой длины. Если заменяющего поля нет, то значения имя_поля, формат_спец и преобразование будут равны
None
.
- get_field(field_name, args, kwargs)¶
Учитывая значение имя_поля, возвращаемое
parse()
(см. выше), преобразуйте его в объект, который необходимо отформатировать. Возвращает кортеж (obj, used_key). Версия по умолчанию принимает строки вида, определенного в PEP 3101, такие как «0[имя]» или «label.title». аргументы и kwargs передаются вvformat()
. Возвращаемое значение used_key имеет то же значение, что и параметр key дляget_value()
.
- get_value(key, args, kwargs)¶
Извлеките заданное значение поля. Аргументом key будет либо целое число, либо строка. Если это целое число, оно представляет индекс позиционного аргумента в args; если это строка, то она представляет именованный аргумент в kwargs.
Параметру args для списка позиционных аргументов присваивается значение
vformat()
, а параметру kwargs для словаря аргументов ключевых слов.Для составных имен полей эти функции вызываются только для первого компонента имени поля; последующие компоненты обрабатываются с помощью обычных операций атрибуции и индексации.
Так, например, выражение поля „0.name“ приведет к вызову
get_value()
с аргументом key, равным 0. Атрибутname
будет найден после возвратаget_value()
путем вызова встроенной функцииgetattr()
.Если индекс или ключевое слово ссылаются на элемент, который не существует, то следует задать значение
IndexError
илиKeyError
.
- check_unused_args(used_args, args, kwargs)¶
При желании реализуйте проверку на наличие неиспользуемых аргументов. Аргументами этой функции является набор всех ключей аргументов, на которые фактически ссылаются в строке формата (целые числа для позиционных аргументов и строки для именованных аргументов), а также ссылка на args и kwargs, которые были переданы в vformat. Набор неиспользуемых аргументов может быть вычислен на основе этих параметров. Предполагается, что
check_unused_args()
вызывает исключение в случае сбоя проверки.
- format_field(value, format_spec)¶
format_field()
просто вызывает глобальный встроенныйformat()
. Метод предусмотрен для того, чтобы подклассы могли его переопределять.
- convert_field(value, conversion)¶
Преобразует значение (возвращаемое методом
get_field()
) с учетом типа преобразования (как в кортеже, возвращаемом методомparse()
). Версия по умолчанию поддерживает типы преобразования «s» (str), «r» (repr) и «a» (ascii).
Синтаксис форматной строки¶
Метод str.format()
и класс Formatter
используют один и тот же синтаксис для форматирования строк (хотя в случае Formatter
подклассы могут определять свой собственный синтаксис форматирования строк). Синтаксис похож на синтаксис formatted string literals, но он менее сложный и, в частности, не поддерживает произвольные выражения.
Форматные строки содержат «заменяющие поля», заключенные в фигурные скобки {}
. Все, что не заключено в фигурные скобки, считается буквальным текстом, который копируется в выходные данные без изменений. Если вам нужно включить в текст буквальную скобку, ее можно экранировать, удвоив: {{
и }}
.
Грамматика для поля замены выглядит следующим образом:
replacement_field ::= "{" [field_name
] ["!"conversion
] [":"format_spec
] "}" field_name ::=arg_name
("."attribute_name
| "["element_index
"]")* arg_name ::= [identifier
|digit
+] attribute_name ::=identifier
element_index ::=digit
+ |index_string
index_string ::= <any source character except "]"> + conversion ::= "r" | "s" | "a" format_spec ::=format-spec:format_spec
Выражаясь менее формально, поле замены может начинаться с имя_поля, которое указывает объект, значение которого должно быть отформатировано и вставлено в выходные данные вместо поля замены. За имя_поля необязательно следует поле преобразования, перед которым ставится восклицательный знак '!'
, и format_spec, перед которым ставится двоеточие ':'
. Они определяют формат значения для замены, отличный от используемого по умолчанию.
Смотрите также раздел Мини-язык спецификации формата.
Само поле field_name начинается с arg_name, которое является либо числом, либо ключевым словом. Если это число, то оно относится к позиционному аргументу, а если это ключевое слово, то оно относится к именованному ключевому аргументу. arg_name обрабатывается как число, если вызов str.isdecimal()
в строке возвращает значение true. Если числовые значения arg_names в строке формата равны 0, 1, 2, … последовательно, все они могут быть опущены (а не только некоторые), и числа 0, 1, 2, … будут автоматически вставлены в этом порядке. Поскольку arg_name не заключено в кавычки, невозможно указать произвольные ключи словаря (например, строки '10'
или ':-]'
) в строке формата. За arg_name может следовать любое количество индексных или атрибутивных выражений. Выражение вида '.name'
выбирает именованный атрибут, используя getattr()
, в то время как выражение вида '[index]'
выполняет поиск по индексу, используя __getitem__()
.
Изменено в версии 3.1: Спецификаторы позиционного аргумента могут быть опущены для str.format()
, поэтому '{} {}'.format(a, b)
эквивалентно '{0} {1}'.format(a, b)
.
Изменено в версии 3.4: Спецификаторы позиционного аргумента могут быть опущены для Formatter
.
Несколько простых примеров строк форматирования:
"First, thou shalt count to {0}" # References first positional argument
"Bring me a {}" # Implicitly references the first positional argument
"From {} to {}" # Same as "From {0} to {1}"
"My quest is {name}" # References keyword argument 'name'
"Weight in tons {0.weight}" # 'weight' attribute of first positional arg
"Units destroyed: {players[0]}" # First element of keyword argument 'players'.
Поле conversion приводит к приведению типа перед форматированием. Обычно форматирование значения выполняется с помощью метода __format__()
самого значения. Однако в некоторых случаях желательно принудительно отформатировать тип как строку, переопределив его собственное определение форматирования. Преобразуя значение в строку перед вызовом __format__()
, можно обойти обычную логику форматирования.
В настоящее время поддерживаются три флага преобразования: '!s'
, который вызывает str()
для значения, '!r'
, который вызывает repr()
и '!a'
, который вызывает ascii()
.
Вот несколько примеров:
"Harold's a clever {0!s}" # Calls str() on the argument first
"Bring out the holy {name!r}" # Calls repr() on the argument first
"More {!a}" # Calls ascii() on the argument first
Поле format_spec содержит спецификацию того, как должно быть представлено значение, включая такие детали, как ширина поля, выравнивание, отступы, десятичная точность и так далее. Каждый тип значения может определять свой собственный «мини-язык форматирования» или интерпретацию format_spec.
Большинство встроенных типов поддерживают общий мини-язык форматирования, который описан в следующем разделе.
Поле format_spec также может содержать вложенные заменяющие поля. Эти вложенные заменяющие поля могут содержать название поля, флаг преобразования и спецификацию формата, но более глубокое вложение не допускается. Заменяющие поля в параметре format_spec заменяются перед интерпретацией строки format_spec. Это позволяет динамически задавать форматирование значения.
Некоторые примеры приведены в разделе Примеры форматирования.
Мини-язык спецификации формата¶
«Спецификации формата» используются в заменяющих полях, содержащихся в строке формата, для определения способа представления отдельных значений (см. Синтаксис форматной строки и f-струны). Они также могут быть переданы непосредственно во встроенную функцию format()
. Каждый форматируемый тип может определять, как следует интерпретировать спецификацию формата.
Большинство встроенных типов реализуют следующие параметры спецификаций формата, хотя некоторые из параметров форматирования поддерживаются только числовыми типами.
Общее правило заключается в том, что пустая спецификация формата приводит к тому же результату, что и при вызове str()
для значения. Непустая спецификация формата обычно изменяет результат.
Общая форма стандартного спецификатора формата такова:
format_spec ::= [[fill
]align
][sign
]["z"]["#"]["0"][width
][grouping_option
]["."precision
][type
] fill ::= <any character> align ::= "<" | ">" | "=" | "^" sign ::= "+" | "-" | " " width ::=digit
+ grouping_option ::= "_" | "," precision ::=digit
+ type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
Если указано допустимое значение align, перед ним может стоять символ fill, который может быть любым символом и по умолчанию равен пробелу, если он опущен. Невозможно использовать буквальную фигурную скобку (»{
» или «}
») в качестве символа заполнения в formatted string literal или при использовании метода str.format()
. Однако можно вставить фигурную скобку с вложенным полем замены. Это ограничение не влияет на функцию format()
.
Значение различных вариантов выравнивания заключается в следующем:
Вариант |
Значение |
---|---|
|
Принудительно выравнивает поле по левому краю в пределах доступного пространства (это значение используется по умолчанию для большинства объектов). |
|
Принудительно выравнивает поле по правому краю в пределах доступного пространства (это значение используется по умолчанию для чисел). |
|
Принудительно заполняет поле после знака (если он есть), но перед цифрами. Это используется для печати полей в форме «+000000120». Этот параметр выравнивания действителен только для числовых типов. Оно становится значением по умолчанию для чисел, когда «0» непосредственно предшествует ширине поля. |
|
Принудительно центрирует поле в пределах доступного пространства. |
Обратите внимание, что до тех пор, пока не будет определена минимальная ширина поля, ширина поля всегда будет соответствовать размеру данных для его заполнения, так что параметр выравнивания в этом случае не имеет смысла.
Параметр sign действителен только для типов чисел и может быть одним из следующих:
Вариант |
Значение |
---|---|
|
указывает, что знак следует использовать как для положительных, так и для отрицательных чисел. |
|
указывает, что знак следует использовать только для отрицательных чисел (это поведение по умолчанию). |
пространство |
указывает, что перед положительными числами следует использовать пробел, а перед отрицательными - знак минус. |
Параметр 'z'
преобразует значения с плавающей запятой с отрицательным значением нуля в положительный ноль после округления до точности формата. Этот параметр действителен только для типов представления с плавающей запятой.
Изменено в версии 3.11: Добавлена опция 'z'
(смотрите также PEP 682).
Параметр '#'
приводит к использованию «альтернативной формы» для преобразования. Альтернативная форма определяется по-разному для разных типов. Этот параметр действителен только для целых, плавающих и сложных типов. Для целых чисел, когда используется двоичный, восьмеричный или шестнадцатеричный вывод, этот параметр добавляет соответствующий префикс '0b'
, '0o'
, '0x'
, или '0X'
к выходному значению. Для float и complex альтернативная форма приводит к тому, что результат преобразования всегда содержит символ десятичной точки, даже если за ним не следуют цифры. Обычно символ десятичной точки появляется в результате этих преобразований только в том случае, если за ним следует цифра. Кроме того, для преобразований 'g'
и 'G'
конечные нули из результата не удаляются.
Параметр ','
указывает на использование запятой в качестве разделителя тысяч. Вместо разделителя, учитывающего языковой стандарт, используйте 'n'
целочисленный тип представления.
Изменено в версии 3.1: Добавлена опция ','
(смотрите также PEP 378).
Параметр '_'
указывает на использование символа подчеркивания в качестве разделителя тысяч для типов представления с плавающей запятой и для целочисленного типа представления 'd'
. Для целочисленных типов представления 'b'
, 'o'
, 'x'
, и 'X'
через каждые 4 цифры будут вставлены символы подчеркивания. Для других типов представления указание этого параметра приводит к ошибке.
Изменено в версии 3.6: Добавлена опция '_'
(смотрите также PEP 515).
ширина - это десятичное целое число, определяющее минимальную общую ширину поля, включая любые префиксы, разделители и другие символы форматирования. Если не указано, ширина поля будет определяться содержимым.
Когда явное выравнивание не задано, перед полем width ставится нулевой символ ('0'
), который включает заполнение нулем с учетом знака для числовых типов. Это эквивалентно символу заполнения '0'
с типом выравнивания '='
.
Изменено в версии 3.10: Значение '0'
, предшествующее полю width, больше не влияет на выравнивание строк по умолчанию.
Точность - это десятичное целое число, указывающее, сколько цифр должно отображаться после запятой для типов презентаций 'f'
и 'F'
, или до и после запятой для типов презентаций 'g'
или 'G'
. Для строковых типов представления поле указывает максимальный размер поля - другими словами, сколько символов будет использовано из содержимого поля. Для целочисленных типов представления точность не допускается.
Наконец, тип определяет, как должны быть представлены данные.
Доступны следующие типы представления строк:
Тип
Значение
's'
Формат строки. Этот тип используется по умолчанию для строк и может быть опущен.
Никто
То же, что и
's'
.
Доступны следующие типы целочисленных представлений:
Тип
Значение
'b'
Двоичный формат. Выводит число по основанию 2.
'c'
Персонаж. Преобразует целое число в соответствующий символ Юникода перед печатью.
'd'
Десятичное целое число. Выводит число по основанию 10.
'o'
Восьмеричный формат. Выводит число по основанию 8.
'x'
Шестнадцатеричный формат. Выводит число по основанию 16, используя строчные буквы для цифр выше 9.
'X'
Шестнадцатеричный формат. Выводит число по основанию 16, используя заглавные буквы для цифр выше 9. В случае, если указано значение
'#'
, префикс'0x'
также будет заменен заглавными буквами на'0X'
.
'n'
Номер. Это то же самое, что и
'd'
, за исключением того, что для вставки соответствующих символов-разделителей чисел используются текущие настройки языкового стандарта.Никто
То же, что и
'd'
.
В дополнение к вышеуказанным типам представления, целые числа могут быть отформатированы с использованием перечисленных ниже типов представления с плавающей запятой (кроме 'n'
и None
). При этом float()
используется для преобразования целого числа в число с плавающей запятой перед форматированием.
Доступны следующие типы представления для значений float
и Decimal
:
Тип
Значение
'e'
Научная запись. Для заданной точности
p
форматируйте число в научной записи с помощью буквы «e», отделяющей коэффициент от показателя степени. Коэффициент состоит из одной цифры до иp
цифр после запятой, что составляет в общей сложностиp + 1
значащих цифр. Без указания точности используется точность6
цифр после запятой дляfloat
и отображаются все цифры коэффициента дляDecimal
. Если после десятичной точки нет цифр, десятичная точка также удаляется, если не используется параметр#
.
'E'
Научная нотация. То же, что и
'e'
, за исключением того, что в качестве разделителя используется заглавная буква «E».
'f'
Запись с фиксированной запятой. Для заданной точности
p
форматируйте число как десятичное с точностью доp
цифр, следующих за десятичной точкой. Если точность не задана, используется точность6
цифр после запятой дляfloat
и используется точность, достаточная для отображения всех цифр коэффициента дляDecimal
. Если после десятичной точки нет цифр, десятичная точка также удаляется, если не используется параметр#
.
'F'
Запись с фиксированной запятой. Аналогично
'f'
, но преобразуетnan
вNAN
иinf
вINF
.
'g'
Общий формат. При заданной точности
p >= 1
число округляется доp
значащих цифр, а затем результат форматируется либо в формате с фиксированной запятой, либо в научной системе счисления, в зависимости от его величины. Точность0
считается эквивалентной точности1
.Точные правила таковы: предположим, что результат, отформатированный с типом представления
'e'
и точностьюp-1
, будет иметь показатель степениexp
. Затем, еслиm <= exp < p
, гдеm
равно -4 для чисел с плавающей запятой и -6 дляDecimals
, число форматируется с типом представления'f'
и точностьюp-1-exp
. В противном случае число форматируется с типом представления'e'
и точностьюp-1
. В обоих случаях из значащего числа удаляются несущественные конечные нули, а десятичная точка также удаляется, если после нее нет оставшихся цифр, если только не используется опция'#'
.Если точность не задана, используется точность
6
значащих цифр дляfloat
. ДляDecimal
коэффициент результата формируется из цифр коэффициента значения; для значений, меньших, чем1e-6
по абсолютной величине, и значений, где значение младшей значащей цифры больше 1, используется научная запись и фиксируется-в противном случае используется точечная запись.Положительная и отрицательная бесконечность, положительный и отрицательный ноль, а также nans форматируются как
inf
,-inf
,0
,-0
иnan
соответственно, независимо от точности .
'G'
Общий формат. То же, что и
'g'
, за исключением переключения на'E'
, если число становится слишком большим. Символы infinity и NaN также используются в верхнем регистре.
'n'
Номер. Это то же самое, что и
'g'
, за исключением того, что для вставки соответствующих символов-разделителей чисел используются текущие настройки языкового стандарта.
'%'
Процент. Умножает число на 100 и выводит в фиксированном формате (
'f'
), за которым следует знак процента.Никто
Для
float
это то же самое, что и для'g'
, за исключением того, что когда для форматирования результата используется запись с фиксированной запятой, она всегда включает по крайней мере одну цифру после десятичной точки. Используемая точность настолько велика, насколько это необходимо для достоверного представления заданного значения.Для
Decimal
это то же самое, что и для'g'
или'G'
в зависимости от значенияcontext.capitals
для текущего десятичного контекста.Общий эффект заключается в соответствии с выводом
str()
, измененным другими модификаторами формата.
Примеры форматирования¶
В этом разделе приведены примеры синтаксиса str.format()
и сравнение со старым форматированием %
.
В большинстве случаев синтаксис аналогичен старому форматированию %
, с добавлением {}
и использованием :
вместо %
. Например, '%03.2f'
может быть преобразовано в '{:03.2f}'
.
Новый синтаксис формата также поддерживает новые и отличающиеся друг от друга опции, показанные в следующих примерах.
Доступ к аргументам по позиции:
>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c') # 3.1+ only
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc') # unpacking argument sequence
'c, b, a'
>>> '{0}{1}{0}'.format('abra', 'cad') # arguments' indices can be repeated
'abracadabra'
Доступ к аргументам по имени:
>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'
Доступ к атрибутам аргументов:
>>> c = 3-5j
>>> ('The complex number {0} is formed from the real part {0.real} '
... 'and the imaginary part {0.imag}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
>>> class Point:
... def __init__(self, x, y):
... self.x, self.y = x, y
... def __str__(self):
... return 'Point({self.x}, {self.y})'.format(self=self)
...
>>> str(Point(4, 2))
'Point(4, 2)'
Доступ к элементам аргументов:
>>> coord = (3, 5)
>>> 'X: {0[0]}; Y: {0[1]}'.format(coord)
'X: 3; Y: 5'
Замена %s
и %r
:
>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"
Выравнивание текста и указание ширины:
>>> '{:<30}'.format('left aligned')
'left aligned '
>>> '{:>30}'.format('right aligned')
' right aligned'
>>> '{:^30}'.format('centered')
' centered '
>>> '{:*^30}'.format('centered') # use '*' as a fill char
'***********centered***********'
Заменяя %+f
, %-f
, и % f
и указывая знак:
>>> '{:+f}; {:+f}'.format(3.14, -3.14) # show it always
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14) # show a space for positive numbers
' 3.140000; -3.140000'
>>> '{:-f}; {:-f}'.format(3.14, -3.14) # show only the minus -- same as '{:f}; {:f}'
'3.140000; -3.140000'
Замена %x
и %o
и преобразование значения в разные базы:
>>> # format also supports binary numbers
>>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)
'int: 42; hex: 2a; oct: 52; bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)
'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'
Использование запятой в качестве разделителя тысяч:
>>> '{:,}'.format(1234567890)
'1,234,567,890'
Выражение в процентах:
>>> points = 19
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'
Использование форматирования, зависящего от типа текста:
>>> import datetime
>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'
Вложенные аргументы и более сложные примеры:
>>> for align, text in zip('<^>', ['left', 'center', 'right']):
... '{0:{fill}{align}16}'.format(text, fill=align, align=align)
...
'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>> octets = [192, 168, 0, 1]
>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)
'C0A80001'
>>> int(_, 16)
3232235521
>>>
>>> width = 5
>>> for num in range(5,12):
... for base in 'dXob':
... print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')
... print()
...
5 5 5 101
6 6 6 110
7 7 7 111
8 8 10 1000
9 9 11 1001
10 A 12 1010
11 B 13 1011
Строки шаблона¶
Строки шаблона обеспечивают более простую замену строк, как описано в PEP 292. Основной вариант использования строк шаблона - интернационализация (i18n), поскольку в этом контексте более простой синтаксис и функциональность упрощают перевод по сравнению с другими встроенными средствами форматирования строк в Python. В качестве примера библиотеки, построенной на основе строк шаблона для i18n, смотрите пакет flufl.i18n.
Строки шаблона поддерживают подстановки на основе $
, используя следующие правила:
$$
- это экранирующий символ; он заменяется одним$
.$identifier
задает имя замещающего заполнителя, соответствующего ключу отображения"identifier"
. По умолчанию значение"identifier"
ограничено любой буквенно-цифровой строкой ASCII без учета регистра (включая символы подчеркивания), которая начинается со знака подчеркивания или буквы ASCII. Первый символ, не являющийся идентификатором, после символа$
завершает эту спецификацию заполнителя.${identifier}
эквивалентно$identifier
. Это требуется, когда допустимые символы идентификатора следуют за символом-заполнителем, но не являются его частью, например,"${noun}ification"
.
Любое другое появление $
в строке приведет к появлению ValueError
.
Модуль string
предоставляет класс Template
, который реализует эти правила. Методами Template
являются:
- class string.Template(template)¶
Конструктор принимает единственный аргумент, который является строкой шаблона.
- substitute(mapping={}, /, **kwds)¶
Выполняет подстановку в шаблон, возвращая новую строку. mapping - это любой объект, подобный словарю, с ключами, которые соответствуют заполнителям в шаблоне. В качестве альтернативы вы можете указать аргументы с ключевыми словами, где ключевые слова являются заполнителями. Когда заданы как mapping, так и kwds и имеются дубликаты, заполнители из kwds имеют приоритет.
- safe_substitute(mapping={}, /, **kwds)¶
Аналогично
substitute()
, за исключением того, что если в mapping и kwds отсутствуют заполнители, вместо того, чтобы вызывать исключениеKeyError
, исходный заполнитель появится в результирующей строке без изменений. Кроме того, в отличие отsubstitute()
, любые другие появления$
просто вернут$
вместо того, чтобы вызыватьValueError
.Хотя другие исключения все еще могут возникать, этот метод называется «безопасным», потому что он всегда пытается вернуть полезную строку вместо того, чтобы вызывать исключение. С другой стороны,
safe_substitute()
может быть чем угодно, но только не безопасным, поскольку он будет автоматически игнорировать искаженные шаблоны, содержащие оборванные разделители, несогласованные фигурные скобки или заполнители, которые не являются допустимыми идентификаторами Python.
- is_valid()¶
Возвращает значение false, если в шаблоне есть недопустимые заполнители, которые приведут к
substitute()
и вызовутValueError
.Добавлено в версии 3.11.
- get_identifiers()¶
Возвращает список допустимых идентификаторов в шаблоне в том порядке, в котором они появляются первыми, игнорируя любые недопустимые идентификаторы.
Добавлено в версии 3.11.
Template
экземпляры также предоставляют один атрибут общедоступных данных:- template¶
Это объект, передаваемый в аргумент template конструктора. В общем, вы не должны изменять его, но доступ только для чтения не предусмотрен.
Вот пример того, как использовать шаблон:
>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
...
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'
Расширенное использование: вы можете создавать подклассы Template
для настройки синтаксиса заполнителя, символа-разделителя или всего регулярного выражения, используемого для анализа строк шаблона. Для этого вы можете переопределить эти атрибуты класса:
разделитель - Это строка-литерал, описывающая заполнитель, вводящий разделитель. Значение по умолчанию -
$
. Обратите внимание, что это не должно быть регулярным выражением, так как реализация будет вызыватьre.escape()
для этой строки по мере необходимости. Далее обратите внимание, что вы не можете изменить разделитель после создания класса (т.е. в пространстве имен класса подкласса должен быть установлен другой разделитель).idpattern - Это регулярное выражение, описывающее шаблон для заполнителей без скобок. Значением по умолчанию является регулярное выражение
(?a:[_a-z][_a-z0-9]*)
. Если это значение задано и braceidpattern равноNone
, этот шаблон также будет применяться к заполнителям со скобками.Примечание
Поскольку по умолчанию для flags используется значение
re.IGNORECASE
, шаблон[a-z]
может совпадать с некоторыми символами, отличными от ASCII. Вот почему мы используем здесь локальный флагa
.Изменено в версии 3.7: braceidpattern можно использовать для определения отдельных узоров, используемых внутри и снаружи фигурных скобок.
braceidpattern - Это похоже на idpattern, но описывает шаблон для связанных заполнителей. По умолчанию используется значение
None
, что означает возврат к idpattern (т.е. один и тот же шаблон используется как внутри, так и снаружи фигурных скобок). Если указано, это позволяет вам определять разные шаблоны для заполнителей со скобками и без них.Добавлено в версии 3.7.
флаги – Флаги регулярных выражений, которые будут применяться при компиляции регулярного выражения, используемого для распознавания подстановок. Значение по умолчанию -
re.IGNORECASE
. Обратите внимание, чтоre.VERBOSE
всегда будет добавляться к флагам, поэтому пользовательские idpatterns должны соответствовать соглашениям для подробных регулярных выражений.Добавлено в версии 3.2.
В качестве альтернативы, вы можете предоставить весь шаблон регулярного выражения, переопределив атрибут class pattern. Если вы сделаете это, значением должен быть объект регулярного выражения с четырьмя именованными группами захвата. Группы захвата соответствуют правилам, приведенным выше, а также правилу недопустимых заполнителей:
экранированный - Эта группа соответствует escape-последовательности, например
$$
, в шаблоне по умолчанию.named - Эта группа соответствует имени заполнителя без привязки; она не должна включать разделитель в группе захвата.
в скобках - Эта группа соответствует имени заполнителя, заключенного в фигурные скобки; в группу захвата не должны входить ни разделитель, ни фигурные скобки.
недопустимо - Эта группа соответствует любому другому шаблону разделителей (обычно это один разделитель), и она должна отображаться последней в регулярном выражении.
Методы этого класса вызовут ValueError
, если шаблон соответствует шаблону без совпадения одной из этих именованных групп.
Вспомогательные функции¶
- string.capwords(s, sep=None)¶
Разбейте аргумент на слова, используя
str.split()
, напишите каждое слово с заглавной буквы, используяstr.capitalize()
, и соедините слова с заглавной буквы, используяstr.join()
. Если необязательный второй аргумент sep отсутствует илиNone
, последовательности пробельных символов заменяются одним пробелом, а начальный и конечный пробелы удаляются, в противном случае sep используется для разделения и соединения слов.