You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则匹配Django模板标签 解决负向断言排除include/extends失效问题

原有正则失效原因

你写的正则存在两个核心问题:

  1. 标签边界混淆:用{[{#%]和[}#%]}匹配标签首尾,没法区分三类标签的闭合规则,容易出现跨标签误匹配
  2. 负向断言位置错误:.*?是非贪婪匹配,遇到{% include这类内容时,会自动跳过include的首字符位置,在后续字符处满足负向断言条件,根本不会校验{%后紧跟的第一个关键词是不是要排除的include/extends,最终导致排除规则完全失效。
正确正则写法

Python环境下可以用如下正则实现需求,支持标签内换行的Django原生语法场景:

import re

# 编译正则,VERBOSE模式方便阅读,DOTALL模式支持标签内部换行
django_tag_pattern = re.compile(
    r"""
    {#.*?#}                  # 匹配所有{# #}格式的模板注释,无例外规则
    |
    {{.*?}}                  # 匹配所有{{ }}格式的变量输出标签,无例外规则
    |
    \{%\s*(?!include\b|extends\b).*?%\}  # 匹配{% %}块标签,排除首个词为include/extends的情况
    """,
    re.DOTALL | re.VERBOSE
)

# 替换时直接调用sub方法即可,匹配到的内容全部替换为空
# cleaned_content = django_tag_pattern.sub('', raw_template_content)
规则说明
  • 三个匹配分支分别对应三类Django标签,从根源避免首尾标记混淆的问题
  • 块标签分支的负向断言直接放在{%和后续空白之后,精准校验标签后的第一个关键词,加\b单词边界是为了避免误排除名称带include/extends前缀的其他自定义标签
  • 非贪婪匹配.*?保证每个匹配只覆盖单个标签,不会跨标签匹配内容
测试验证

用你提供的测试文本执行替换后,输出结果如下,完全符合预期:

asdf
 asdf  asdf 
{% include 'not this' %}
{% extends 'not this' %}
asdf

所有需要匹配的注释、变量、普通块标签都被清空,include和extends标签完整保留。

内容的提问来源于stack exchange,提问作者run_the_race

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:01:06