我還沒有找到一個很好的例子,在Python中繼承了string.Template的子類,儘管我在文檔中看到了多個引用。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