2009-08-26 75 views
14

我還沒有找到一個很好的例子,在Python中繼承了string.Template的子類,儘管我在文檔中看到了多個引用。Python中的子類化string.Template的示例?

在網上有沒有這樣的例子?

我想更改$爲不同的字符,也許更改標識符的正則表達式。

+0

請注意,您不應該嘗試在Cython中執行此操作。它不起作用。我不確定原因。 – 2009-08-27 00:50:10

回答

22

蟒蛇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-]' 

顯然,它也可以只省略任何正則表達式組escapednamedbracedinvalid的禁用它。

+0

你知道這背景是怎麼發生的嗎?換句話說,如何將delimeter替換爲'#'? – slopeofhope 2016-11-10 03:15:30