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.
Jedna uwaga jest taka, że nie powinieneś próbować tego robić w Cython. To nie działa. Nie jestem pewien powodu. –