如何在Jinja2中使用正则表达式?

Jas*_*son 26 regex jinja2

我是Jinja2的新手,到目前为止,我已经能够完成我想要的大部分工作.但是,我需要使用正则表达式,我似乎无法在文档或谷歌上找到任何东西.

我想在Javascript中创建一个模仿此行为的宏:

function myFunc(str) {
    return str.replace(/someregexhere/, '').replace(' ', '_');
}
Run Code Online (Sandbox Code Playgroud)

这将删除字符串中的字符,然后用下划线替换空格.我怎么能用Jinja2做到这一点?

Sea*_*ira 34

replace如果您实际上不需要正则表达式,则可以使用已经存在的过滤器.否则,您可以注册自定义过滤器:

{# Replace method #}
{{my_str|replace("some text", "")|replace(" ", "_")}}
Run Code Online (Sandbox Code Playgroud)

 

# Custom filter method
def regex_replace(s, find, replace):
    """A non-optimal implementation of a regex filter"""
    return re.sub(find, replace, s)

jinja_environment.filters['regex_replace'] = regex_replace
Run Code Online (Sandbox Code Playgroud)

  • 是的,不幸的是,这是我结束的方式.你不能在jinja2中使用正则表达式,这是愚蠢的 (9认同)
  • @SeanVieira(抱歉评论晚了)值得注意的是,Python 的 re 模块自动缓存编译的正则表达式,至少可以追溯到 1.5.2(并且缓存大小在 2.0 中提高到 100)。根据应用程序中有多少正则表达式,缓存的好处可能已经被涵盖。 (3认同)
  • @elias - 因为`find`是每次被`re.sub`使用时编译的,如果它被用作大循环中的过滤器,它可能*可能*成为瓶颈.如果是这种情况,您可以在过滤器(`cache`)中添加关键字arg,并在`cache`设置为`True`时编译并存储`find`args - 或者您可以编译并缓存所有`find`参数并选择最适合您的应用程序的弹出策略. (2认同)