【问题标题】:How do I use regular expressions in Jinja2?如何在 Jinja2 中使用正则表达式?
【发布时间】:2012-10-09 00:17:45
【问题描述】:

我是 Jinja2 的新手,到目前为止,我已经能够做大部分我想做的事情。但是,我需要使用正则表达式,我似乎无法在 the documentation 或谷歌的任何地方找到任何东西。

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

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

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

【问题讨论】:

标签: regex jinja2


【解决方案1】:

如果您实际上不需要正则表达式,则可以使用一个名为 replace 的现有过滤器。否则,您可以注册一个custom filter

{# 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

【讨论】:

  • 是的,这就是我最终要走的路,不幸的是。你不能在 jinja2 中使用正则表达式,这很愚蠢
  • 嘿,伙计!你说这是一个非最优的实现,你能详细说明什么看起来像最优的吗?
  • @elias - 因为find 每次被re.sub 使用时都会编译它,如果将其用作大型循环中的过滤器,它可能可能成为瓶颈.如果是这种情况,您可以将关键字 arg 添加到过滤器 (cache) 并在 cache 设置为 True 时编译并存储 find args - 或者您可以编译并缓存所有 find参数并选择最适合您的应用程序的弹出策略。
  • @SeanVieira(对不起,迟到的评论)值得注意的是,Python 的 re 模块自动缓存已编译的正则表达式,至少可以追溯到 1.5.2(并且缓存大小在 2.0 中提高到 100) .根据应用程序中使用的正则表达式的数量,可能已经涵盖了缓存的好处。
猜你喜欢
  • 2016-12-12
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多