我一直无法在 Python 中找到一个很好的子类化 string.Template 示例,尽管我在文档中看到了多个这样做的参考。
网络上有没有这样的例子?
我想将 $ 更改为不同的字符,并可能更改标识符的正则表达式。
我一直无法在 Python 中找到一个很好的子类化 string.Template 示例,尽管我在文档中看到了多个这样做的参考。
网络上有没有这样的例子?
我想将 $ 更改为不同的字符,并可能更改标识符的正则表达式。
来自 python文档:
高级用法:您可以派生 Template 的子类来自定义用于解析模板字符串的占位符语法、分隔符或整个正则表达式。为此,您可以覆盖这些类属性:
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 版中的新功能。
或者,您可以通过覆盖类属性模式来提供整个正则表达式模式。如果您这样做,该值必须是具有四个命名捕获组的正则表达式对象。捕获组对应于上面给出的规则,以及无效的占位符规则:
- 转义 - 此组匹配默认模式中的转义序列,例如 $$。
- 命名 - 该组匹配无括号的占位符名称;它不应在捕获组中包含分隔符。
- 大括号 - 该组匹配大括号括起来的占位符名称;它不应在捕获组中包含分隔符或大括号。
- 无效 – 此组匹配任何其他分隔符模式(通常是单个分隔符),并且它应该出现在正则表达式的最后。
例子:
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