2009-08-26 15 views
14

Nie udało mi się znaleźć dobrego przykładu klasy podklasy.Template w Pythonie, mimo że widziałem wiele odniesień do tego w dokumentacji.Przykładowy łańcuch podklasy. Szablon w języku Python?

Czy są tego przykłady w Internecie?

Chcę zmienić znak $ na inną i może zmienić wyrażenie regularne dla identyfikatorów.

+0

Jedna uwaga jest taka, że ​​nie powinieneś próbować tego robić w Cython. To nie działa. Nie jestem pewien powodu. –

Odpowiedz

22

Od pytona docs:

zaawansowane wykorzystanie: można czerpać podklasy Szablon dostosować składnię zastępczy, ogranicznik charakteru, lub całego regularnego ekspresji służy do analizowania szablon sznurki. Aby to zrobić, można zastąpić nich klasa atrybutów:

  • separator - To jest ciągiem znaków opisujący zastępczy wprowadzającą separatora. Domyślna wartość to . Zauważ, że nie powinno to być wyrażeniem regularnym, ponieważ implementacja wywoła w razie potrzeby ponownie re.escape() na tym łańcuchu.

  • idpattern - to jest regularny opisującego deseń nie usztywnione wypełniaczy (szelki będą dodawane automatycznie właściwe). Wartością domyślną jest wyrażenie regularne [_a-z] [_ a-z0-9] *.

przykład:

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' 

W pyton 3:

nowego w wersji 3.2.

Alternatywnie można podać cały wzór wyrażenia regularnego , zastępując wzorzec atrybutu klasy. Jeśli to zrobisz, wartość musi być obiektem wyrażenia regularnego z czterema nazwanymi grupami przechwytywania. Grupy przechwytywania zgodne z zasadami podanymi powyżej, wraz z nieprawidłowej reguły zastępczy:

  • zbiegłego - Ta grupa odpowiada sekwencji wyjściowej, na przykład $$, w domyślnym wzorze.
  • named - Ta grupa pasuje do niezarejestrowanej nazwy zastępczej; nie powinien zawierać ogranicznika w grupie przechwytywania.
  • stężony - ta grupa pasuje do nazwy zastepowanej ramki zastępczej; nie powinien zawierać ogranicznika ani nawiasu klamrowego w przechwytywanej grupie .
  • niepoprawne - ta grupa pasuje do dowolnego innego wzorca ogranicznika (zwykle jednego separatora) i powinna wyglądać na ostatnią w regularnym wyrażeniu .

przykład:

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

Wydaje się, że jest również możliwe, aby po prostu pominąć żadnej z grup regex escaped, named, braced lub invalid jest wyłączone.

+0

czy wiesz, jak to się dzieje w tle? innymi słowy, w jaki sposób delimetr jest zastępowany przez "#"? – slopeofhope