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

38

我是Jinja2的新手,目前我已经能够实现我想要的大部分功能。然而,我需要使用正则表达式,但在文档或谷歌上似乎找不到任何相关内容。

我想创建一个类似于Javascript中以下行为的宏:

function myFunc(str) {
    return str.replace(/someregexhere/, '').replace(' ', '_');
}

如何在Jinja2中删除字符串中的字符并将空格替换为下划线?


1
正则表达式过滤器已于2017年添加。请参见https://docs.saltstack.com/en/develop/topics/jinja/index.html#regex-replace - Kevin Deng
1
那个链接现在是404。 - reinierpost
1个回答

50

如果你不需要正则表达式,那么可以使用一个名为replace的现有过滤器。否则,你可以注册一个自定义过滤器

{# Replace method #}
{{my_str|replace("some text", "")|replace(" ", "_")}}

 

# 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

14
是的,不幸的是这就是我最终走的路。在jinja2中不能使用正则表达式真是太蠢了。 - Jason
1
嘿,伙计!你说这是一个非最优的实现,你能详细说明一下最优实现会是什么样吗? - Elias Dorneles
2
@elias - 由于 find 在每次被 re.sub 使用时都会被编译,如果它在一个大循环中被用作过滤器,那么它可能会成为一个瓶颈。 如果情况是这样的,您可以向过滤器添加一个关键字参数(cache),并在设置 True 的时候编译和存储 find 参数 - 或者您可以编译并缓存所有 find 参数,并选择最适合您的应用程序的弹出策略。 - Sean Vieira
3
值得注意的是,Python的re模块自至少1.5.2版本以来就会自动缓存编译后的正则表达式(regex),且在2.0版本中将缓存大小提高到了100。根据应用程序中使用的正则表达式数量而定,缓存的好处可能已经覆盖了。 - mikenerone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接