【问题标题】:Regex to match django block templatetag正则表达式匹配 django 块模板标签
【发布时间】:2014-01-04 14:00:36
【问题描述】:

我目前正在编写一个快速的 Python 脚本,以使我所有的旧模板适应新的基本模板。 为此,我需要将 {% block body %} 内的代码移动到其他地方。

我已经得到了这个来匹配我所有的 {% load smth %}

r"\{% load [^\{%]+? %\}"

我要匹配的是 {% block body %} 和 {% endblock %} 之间的代码 示例:

{% block body %}
    <div class="row">
        <div class="span12">
            [...]
        </div>
    </div>
{% endblock %}

【问题讨论】:

  • 除非你没有嵌套块,否则你不能用正则表达式来做到这一点。

标签: python regex django


【解决方案1】:

不幸的是,这里没有办法使用正则表达式,除非你使用符号 {% endblock body %},或者你不使用嵌套块。这是一个失败的例子:

{% block body %}
    <div class="row">
        <div class="span12">
            {% block foo %}
            [...]
            {% endblock %}
        </div>
    </div>
{% endblock %}

正则表达式会将嵌套的 {% endblock %} 作为正文块的结尾

【讨论】:

  • 是的,我知道。但我想要一个快速的解决方案,它最终将适用于所有情况的 95%。虽然我愿意提供一个解决方案(在 Python 中),它涉及嵌套块。
  • 好吧,我错了。使用贪婪表达式嵌套块不是问题,假设 body 的 endblock 是 tempate 中的最后一个
  • 例如re.search('{%\sblock\scontainer\s%}(.*){%\sendblock\s%}', template, re.M+re.S) 适合我
【解决方案2】:

撇开嵌套块的明显问题不谈,这将是匹配所有非嵌套块的正则表达式:

\{% block [^\{%]+? %\}[\s\S]*\{% endblock %\}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多