Пример подкласса string.Template в Python? - PullRequest
14 голосов
/ 26 августа 2009

Мне не удалось найти хороший пример подкласса string. Шаблон в Python, хотя я видел несколько ссылок на это в документации.

Есть ли примеры этого в Интернете?

Я хочу изменить $ на другой символ и, возможно, изменить регулярное выражение для идентификаторов.

1 Ответ

23 голосов
/ 26 августа 2009

Из питона Документы :

Расширенное использование: вы можете получить подклассы шаблона для настройки синтаксис заполнителя, разделитель персонаж, или весь обычный выражение используется для разбора шаблона строки. Для этого вы можете переопределить эти атрибуты класса:

  • delimiter - это буквенная строка, описывающая заполнитель вводя разделитель. По умолчанию значение $. Обратите внимание, что это не должно быть регулярное выражение, как реализация вызовет re.escape () по мере необходимости.

  • idpattern - это регулярное выражение, описывающее шаблон для несвязанные заполнители (фигурные скобки будет добавлен автоматически как подходящее). Значением по умолчанию является регулярное выражение [_a-z] [_ a-z0-9] *.

Пример:

from string import Template

class MyTemplate(Template):
    delimiter = '#'
    idpattern = r'[a-z][_a-z0-9]*'

>>> s = MyTemplate('#who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes $what'

В питоне 3:

Новое в версии 3.2.

В качестве альтернативы, вы можете предоставить весь шаблон регулярного выражения переопределив шаблон атрибута класса. Если вы сделаете это, значение должен быть объектом регулярного выражения с четырьмя именованными группами захвата. Группы захвата соответствуют приведенным выше правилам вместе с недопустимое правило заполнителя:

  • escaped - эта группа соответствует escape-последовательности, например, $$, в шаблоне по умолчанию.
  • named - эта группа соответствует свободному имени заполнителя; он не должен включать разделитель в группу захвата.
  • в скобках - эта группа соответствует имени заполнителя в скобках; он не должен включать ни разделитель, ни фигурные скобки в захвате группа.
  • недействителен - эта группа соответствует любому другому шаблону разделителя (обычно один разделитель), и он должен появляться последним в регулярном выражение.
* * Пример 1 042:
from string import Template
import re

class TemplateClone(Template):
    delimiter = '$'
    pattern = r'''
    \$(?:
      (?P<escaped>\$) |   # Escape sequence of two delimiters
      (?P<named>[_a-z][_a-z0-9]*)      |   # delimiter and a Python identifier
      {(?P<braced>[_a-z][_a-z0-9]*)}   |   # delimiter and a braced identifier
      (?P<invalid>)              # Other ill-formed delimiter exprs
    )
    '''

class TemplateAlternative(Template):
    delimiter = '[-'
    pattern = r'''
    \[-(?:
       (?P<escaped>-) |            # Expression [-- will become [-
       (?P<named>[^\[\]\n-]+)-\] | # -, [, ], and \n can't be used in names
       \b\B(?P<braced>) |          # Braced names disabled
       (?P<invalid>)               #
    )
    '''

>>> t = TemplateClone("$hi sir")
>>> t.substitute({"hi": "hello"})
'hello sir'

>>> ta = TemplateAlternative("[-hi-] sir")
>>> ta.substitute({"hi": "have a nice day"})
'have a nice day sir'
>>> ta = TemplateAlternative("[--[-hi-]-]")
>>> ta.substitute({"hi": "have a nice day"})
'[-have a nice day-]'

По-видимому, также можно просто опустить любую из групп регулярных выражений escaped, named, braced или invalid, чтобы отключить ее.

...