所以我在我的Flask應用程序中有以下功能。使用re.sub和jinja2.Markup在Python 3.6中轉義?
def markup_abbreviations(txt, match_map, match_regex):
html = Markup.escape(txt)
sub_template = Markup('<abbr title="%s">%s</abbr>')
def replace_callback(m):
return sub_template % (match_map[m.group(0)], m.group(0))
return match_regex.sub(replace_callback, html)
實例參數:
txt = 'blah blah blah etc., blah blah'
match_map = {
'etc.': 'et cetera',
'usu.': 'usually',
}
match_regex = re.compile(
'|'.join(r'\b' + re.escape(k) for k in match_map)
)
這是工作非常好,在我的本地的Python 3.3的機器轉動"etc."
到"<abbr title=\"et cetera\">etc.</abbr>"
等。
然後我想我要部署到Heroku,它說它只支持最新的python,它是Python 3.6.1。這與我在當地獲得的不同,但是,呃,無論如何。它工作...大多數。
除了我上面的函數現在給我"<abbr title="et cetera">etc.</abbr>"
。
我假設Python 3.3和Python 3.6之間的re.sub
實現必須以某種方式更改,現在不再使用傳遞的字符串方法來創建輸出。所以不使用Markup
的自動轉義方法。而是從零開始構建新的str
。這就是爲什麼re.sub
現在只返回str
,而不是Markup
了。
如何在Python 3.6中使用re.sub
和jinja2.Markup
並使我的函數再次工作?
噢!你是對的.'replace_callback'正在返回'Markup',它只是're.sub',它返回爲'str'謝謝! – OdraEncoded