Jos*_*son 15 python stringtemplate
我没能找到一个在Python中继承string.Template的好例子,尽管我在文档中看到过多次引用.
网上有这方面的例子吗?
我想将$更改为不同的字符,并可能更改标识符的正则表达式.
Nad*_*mli 25
从python 文档:
高级用法:您可以派生模板的子类来自定义占位符语法,分隔符或用于解析模板字符串的整个正则表达式.为此,您可以覆盖这些类属性:
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 - 此组与默认模式中的转义序列(例如$$)匹配.
- 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将其禁用.