如何从Django模板字符串中提取{{}}包裹的上下文变量列表
解决方案
你可以通过两种方式实现需求,分别是正则快速实现和Django内置模板解析实现:
方案1:正则表达式实现
适合简单场景,代码轻量无需依赖Django内部逻辑:
import re def my_func(my_str): # 匹配{{ }}包裹的变量,自动忽略变量前后的空格 pattern = r'\{\{\s*(\w+)\s*\}\}' # 去重同时保留变量首次出现的顺序 return list(dict.fromkeys(re.findall(pattern, my_str))) my_str = "Hello, {{ name }}. I will arrive at {{ time }}" print(my_func(my_str)) # 输出 ["name", "time"]
如果不需要保留出现顺序,也可以直接用list(set(re.findall(pattern, my_str)))实现去重。
方案2:Django内置模板解析实现
适合复杂Django模板场景,完全遵循Django模板语法规则,不会出现正则匹配的边界错误(比如转义字符、模板注释、带过滤器的变量等情况都能正确识别):
from django.template import Template from django.template.base import VariableNode def my_func(my_str): variables = set() # 用Django原生模板解析器解析字符串 template = Template(my_str) # 遍历所有节点提取变量 for node in template.nodelist: if isinstance(node, VariableNode): variables.add(node.filter_expression.var.var) return list(variables) my_str = "Hello, {{ name }}. I will arrive at {{ time }}" print(my_func(my_str)) # 输出 ["name", "time"]
内容的提问来源于stack exchange,提问作者Edgar Navasardyan
相关产品推荐
相关产品推荐

