19

ドキュメントでstring.Templateをサブクラス化することへの複数の参照を見てきましたが、Pythonでstring.Templateをサブクラス化する良い例を見つけることができませんでした。

ウェブ上にこれの例はありますか?

$を別の文字に変更し、識別子の正規表現を変更したいと思います。

4

1 に答える 1

30

python docsから:

高度な使用法: 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 の新機能。

または、クラス属性パターンをオーバーライドして、正規表現パターン全体を提供することもできます。これを行う場合、値は 4 つの名前付きキャプチャ グループを持つ正規表現オブジェクトである必要があります。キャプチャ グループは、無効なプレースホルダー ルールと共に、上記のルールに対応します。

  • escaped – このグループは、デフォルト パターンの $$ などのエスケープ シーケンスに一致します。
  • named – このグループは括弧なしのプレースホルダー名と一致します。キャプチャ グループに区切り文字を含めないでください。
  • ブレース – このグループは、ブレースで囲まれたプレースホルダー名と一致します。キャプチャ グループに区切り記号または中括弧を含めないでください。
  • 無効 - このグループは他の区切り文字パターン (通常は単一の区切り文字) と一致し、正規表現の最後に表示される必要があります。

例:

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たりすることも可能です。bracedinvalid

于 2009-08-26T19:07:40.350 に答える