尽管我在文档中看到了多次这样做的参考,但我还没有找到在 Python 中子类化 string.Template 的好例子。
网上有这方面的例子吗?
我想将 $ 更改为不同的字符,并且可能更改标识符的正则表达式。
来自蟒蛇docs http://docs.python.org/library/string.html:
高级用法:可以推导
要自定义的 Template 子类
占位符语法、分隔符
字符,或整个常规
用于解析模板的表达式
字符串。为此,您可以覆盖
这些类属性:
Example:
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 – 该组与转义序列匹配,例如$$,采用默认模式。
- 命名 – 该组与无花括号的占位符名称匹配;它不应包含捕获组中的分隔符。
- 花括号 – 该组与花括号括起来的占位符名称匹配;它不应在捕获中包含分隔符或大括号
团体。
- 无效 – 该组与任何其他分隔符模式(通常是单个分隔符)匹配,并且它应该出现在常规中的最后
表达。
Example:
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
or invalid
禁用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)