Рубрики
Без рубрики

строка – текстовые константы и шаблоны

Автор оригинала: Doug Hellmann.

Цель:

Содержит константы и классы для работы с текстом.

Модуль string относится к самым ранним версиям Python. Многие функции, ранее реализованные в этом модуле, были перемещены в методы объектов str . Модуль string сохраняет несколько полезных констант и классов для работы с объектами str . Это обсуждение сконцентрируется на них.

Функции

Функция capwords () делает все слова в строке заглавными.

string_capwords.py

import string

s  'The quick brown fox jumped over the lazy dog.'

print(s)
print(string.capwords(s))

Результаты такие же, как и при вызове split () , использовании заглавных букв в словах в итоговом списке и последующем вызове join () для объединения результатов.

$ python3 string_capwords.py

The quick brown fox jumped over the lazy dog.
The Quick Brown Fox Jumped Over The Lazy Dog.

Шаблоны

Строковые шаблоны были добавлены как часть PEP 292 и предназначены в качестве альтернативы к встроенному синтаксису интерполяции. При интерполяции string.Template переменные идентифицируются путем добавления к имени префикса $ (например, $ var ). В качестве альтернативы, если необходимо выделить их из окружающего текста, их также можно заключить в фигурные скобки (например, $ {var} ).

В этом примере сравнивается простой шаблон с аналогичной интерполяцией строк с использованием оператора % и синтаксисом строки нового формата с использованием str.format () .

string_template.py

import string

values  {'var': 'foo'}

t  string.Template("""
Variable        : $var
Escape          : $$
Variable in text: ${var}iable
""")

print('TEMPLATE:', t.substitute(values))

s  """
Variable        : %(var)s
Escape          : %%
Variable in text: %(var)siable
"""

print('INTERPOLATION:', s % values)

s  """
Variable        : {var}
Escape          : {{}}
Variable in text: {var}iable
"""

print('FORMAT:', s.format(**values))

В первых двух случаях символ триггера ( $ или % ) экранируется путем повторения его дважды. Для синтаксиса формата и {, и } необходимо экранировать, повторяя их.

$ python3 string_template.py

TEMPLATE:
Variable        : foo
Escape          : $
Variable in text: fooiable

INTERPOLATION:
Variable        : foo
Escape          : %
Variable in text: fooiable

FORMAT:
Variable        : foo
Escape          : {}
Variable in text: fooiable

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

Однако преимущество состоит в том, что использование метода safe_substitute () позволяет избежать исключений, если не все значения, необходимые для шаблона, предоставляются в качестве аргументов.

string_template_missing.py

import string

values  {'var': 'foo'}

t  string.Template("$var is here but $missing is not provided")

try:
    print('substitute()     :', t.substitute(values))
except KeyError as err:
    print('ERROR:', str(err))

print('safe_substitute():', t.safe_substitute(values))

Поскольку в словаре значений нет значения для missing , substitute () вызывает KeyError . Вместо того, чтобы вызывать ошибку, safe_substitute () перехватывает ее и оставляет выражение переменной в тексте отдельно.

$ python3 string_template_missing.py

ERROR: 'missing'
safe_substitute(): foo is here but $missing is not provided

Расширенные шаблоны

Синтаксис по умолчанию для string.Template можно изменить, настроив шаблоны регулярных выражений, которые он использует для поиска имен переменных в теле шаблона. Простой способ сделать это – изменить атрибуты класса delimiter и idpattern .

string_template_advanced.py

import string


class MyTemplate(string.Template):
    delimiter  '%'
    idpattern  '[a-z]+_[a-z]+'


template_text  '''
  Delimiter : %%
  Replaced  : %with_underscore
  Ignored   : %notunderscored
'''

d  {
    'with_underscore': 'replaced',
    'notunderscored': 'not replaced',
}

t  MyTemplate(template_text)
print('Modified ID pattern:')
print(t.safe_substitute(d))

В этом примере правила подстановки изменены так, что разделителем является % вместо $ , а имена переменных должны включать подчеркивание где-то посередине. Шаблон % notunderscored ничем не заменяется, потому что он не содержит символа подчеркивания.

$ python3 string_template_advanced.py

Modified ID pattern:

  Delimiter : %
  Replaced  : replaced
  Ignored   : %notunderscored

Для еще более сложных изменений можно переопределить атрибут pattern и определить совершенно новое регулярное выражение. Предоставленный шаблон должен содержать четыре именованные группы для захвата экранированного разделителя, именованную переменную, версию имени переменной в фигурных скобках и недопустимые шаблоны разделителей.

string_template_defaultpattern.py

import string

t  string.Template('$var')
print(t.pattern.pattern)

Значение t.pattern – это скомпилированное регулярное выражение, но исходная строка доступна через его атрибут pattern .

\$(?:
  (?P\$) |                # two delimiters
  (?P[_a-z][_a-z0-9]*)    | # identifier
  {(?P[_a-z][_a-z0-9]*)} | # braced identifier
  (?P)                    # ill-formed delimiter exprs
)

В этом примере определяется новый шаблон для создания нового типа шаблона с использованием {{var}} в качестве синтаксиса переменной.

string_template_newsyntax.py

import re
import string


class MyTemplate(string.Template):
    delimiter  '{{'
    pattern  r'''
    \{\{(?:
    (?P\{\{)|
    (?P[_a-z][_a-z0-9]*)\}\}|
    (?P[_a-z][_a-z0-9]*)\}\}|
    (?P)
    )
    '''


t  MyTemplate('''
{{{{
{{var}}
''')

print('MATCHES:', t.pattern.findall(t.template))
print('SUBSTITUTED:', t.safe_substitute(var'replacement'))

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

$ python3 string_template_newsyntax.py

MATCHES: [('{{', '', '', ''), ('', 'var', '', '')]
SUBSTITUTED:
{{
replacement

Форматировщик

Класс Formatter реализует тот же язык спецификации макета, что и метод format () для str . Его функции включают приведение типов, выравнивание, ссылки на атрибуты и поля, именованные и позиционные аргументы шаблона и параметры форматирования для конкретных типов. В большинстве случаев метод format () является более удобным интерфейсом для этих функций, но Formatter предоставляется как способ создания подклассов для случаев, когда требуются варианты.

Константы

Модуль string включает ряд констант, связанных с ASCII и наборами числовых символов.

string_constants.py

import inspect
import string


def is_str(value):
    return isinstance(value, str)


for name, value in inspect.getmembers(string, is_str):
    if name.startswith('_'):
        continue
    print('%s%r\n' % (name, value))

Эти константы полезны при работе с данными ASCII, но, поскольку все чаще встречаются тексты, отличные от ASCII, в той или иной форме Unicode, их применение ограничено.

$ python3 string_constants.py

XYZ'

Смотрите также