Python中的子类化string.Template的示例?
我还没有找到一个很好的例子,在Python中继承了string.Template的子类,尽管我在文档中看到了多个引用。Python中的子类化string.Template的示例?
在网上有没有这样的例子?
我想更改$为不同的字符,也许更改标识符的正则表达式。
蟒蛇docs:
高级应用:可以派生模板 子类来定制 占位符语法,分隔 字符,或用于分析模板 串整个正则表达式 。要做到这一点,您可以覆盖这些 类属性:
分隔符 - 这是描述一个占位符 引入分隔符的文本字符串。默认值 值$。请注意,这不应该是 的正则表达式,因为 实现将根据需要在此字符串上调用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。
或者,您可以通过覆盖类属性模式来提供整个正则表达式模式 。如果您这样做,则值 必须是具有四个命名捕获组的正则表达式对象。 的捕获组对应于上面给出的规则,与 沿无效占位符规则:
- 逃脱 - 该组中的转义序列,例如相匹配$$,采用默认模式。
- named - 此组匹配未占用的占位符名称;它不应该在捕获组中包含分隔符。
- braced - 此组匹配大括号括起来的占位符名称;它不应该包含捕获 组中的分隔符或大括号。
- 无效 - 该组匹配任何其他分隔符模式(通常是单个分隔符),它应该最后出现在常规 表达式中。
实施例:
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
的禁用它。
你知道这背景是怎么发生的吗?换句话说,如何将delimeter替换为'#'? – slopeofhope 2016-11-10 03:15:30
请注意,您不应该尝试在Cython中执行此操作。它不起作用。我不确定原因。 – 2009-08-27 00:50:10