我还没有找到一个在python中对string.template进行子类化的好例子,尽管我在文档中看到过多次这样做的引用。
在网上有这样的例子吗?
我想将$更改为不同的字符,并可能更改标识符的regex。
最佳答案
来自pythondocs:
高级用法:可以派生
要自定义的模板子类
占位符语法,分隔符
字符或整个规则
用于分析模板的表达式
串。要执行此操作,可以重写
这些类属性:
分隔符–这是描述占位符的文本字符串
引入分隔符。违约
价值美元。注意这不应该是
正则表达式,如
实现将调用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版新增。
或者,您可以提供整个正则表达式模式
通过重写类属性模式。如果你这样做,价值
必须是具有四个命名捕获组的正则表达式对象。
捕获组与上面给出的规则以及
无效的占位符规则:
转义–此组与默认模式中的转义序列(如$$)匹配。
命名–此组与无标记的占位符名称匹配;它不应在捕获组中包含分隔符。
BRACKED–此组与大括号内的占位符名称匹配;它不应在捕获中包含分隔符或大括号。
组。
无效–此组与任何其他分隔符模式(通常为单个分隔符)匹配,并且应在常规中最后出现
表达式。
例子:
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-]'
显然,也可以省略任何regex组来禁用它。
关于python - 在Python中继承string.Template的示例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1336786/