Từ trăn docs:
sử dụng nâng cao: bạn có thể lấy được lớp con của Mẫu để tùy chỉnh cú pháp giữ chỗ, delimiter nhân vật, hoặc toàn bộ đều đặn biểu hiện sử dụng để phân tích mẫu chuỗi. Để làm điều này, bạn có thể ghi đè lên những lớp thuộc tính:
delimiter - Đây là chuỗi chữ mô tả một placeholder giới thiệu delimiter. Giá trị mặc định $. Lưu ý rằng đây không nên là cụm từ thông dụng, vì triển khai sẽ gọi re.escape() trên chuỗi này nếu cần.
idpattern - Đây là biểu hiện thường xuyên mô tả mô hình cho placeholders không chuẩn bị tinh thần (các niềng răng sẽ được tự động thêm vào như thích hợp). Giá trị mặc định là cụm từ thông dụng [_a-z] [_ a-z0-9] *.
Ví dụ:
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'
Trong python 3:
mới trong phiên bản 3.2.
Hoặc, bạn có thể cung cấp toàn bộ mẫu biểu thức chính quy bằng cách ghi đè mẫu thuộc tính lớp. Nếu bạn làm điều này, giá trị phải là đối tượng cụm từ thông dụng với bốn nhóm chụp được đặt tên. Các nhóm chụp tương ứng với các quy tắc nêu trên, cùng với quy tắc giữ chỗ không hợp lệ:
- thoát - Nhóm này phù hợp với dãy thoát, ví dụ $$, trong mẫu mặc định.
- có tên - Nhóm này khớp với tên trình giữ chỗ không có chỗ đứng; nó không nên bao gồm dấu phân cách trong nhóm chụp.
- giằng co - Nhóm này khớp với tên trình giữ chỗ có ngoặc nhọn; nó không nên bao gồm dấu phân cách hoặc dấu ngoặc ôm trong nhóm chụp .
- không hợp lệ - Nhóm này khớp với bất kỳ mẫu dấu phân tách nào khác (thường là dấu phân cách đơn) và sẽ xuất hiện cuối cùng trong biểu thức thông thường.
Ví dụ:
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-]'
Rõ ràng nó cũng có thể chỉ cần bỏ qua bất kỳ nhóm regex escaped
, named
, braced
hoặc invalid
để vô hiệu hóa nó.
Nguồn
2009-08-26 19:07:40
Một lưu ý là bạn không nên cố gắng thực hiện việc này trong Cython. Nó không hoạt động. Tôi không chắc lý do. –