Пример подклассификации string.Template в Python?

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

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

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

Ответы

Ответ 1

Из python docs:

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

  • 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'

В python 3:

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

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

  • escaped - эта группа соответствует escape-последовательности, например. $$, в шаблоне по умолчанию.
  • named - эта группа соответствует объявлению без привязки; он не должен включать разделитель в группу захвата.
  • braced - эта группа соответствует имени заполнителя, заключенному в скобку; он не должен включать либо разделитель, либо фигурные скобки в захвате группа.
  • invalid - эта группа соответствует любому другому шаблону разделителя (обычно это один разделитель), и он должен появляться последним в регулярном выражение.

Пример:

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, чтобы отключить ее.