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