我具有以下“示例”内容:
{% block some_name %}Some Text{% endblock %}
Something Else
{% block another_name %}Some Other Content{% endblock %}
我试图通过正则表达式来查找这两个块,首先是名称,然后是各节,但仅从我的“ findall”操作中收到第一个返回:
re.findall(r"\{% block ([^\{%]+?) %\}[\s\S]*\{% endblock %\}", contents)
**假设变量“ contents”是顶部的字符串。
因此,我需要两次搜索,或者如果可能的话,将它们组合起来,使我得到类似的结果:
list[
['some_name', 'another_name'],
['{% block some_name %}Some Text{% endblock %}', '{% block another_name %}Some Other Content{% endblock %}']
]
最佳答案
您可以使用
r'(\{%\s*block\s+(.+?)\s*%}[\s\S]*?\{%\s*endblock\s*(?:\2\s*)?%})'
请参见regex demo。
细节
(
-外部捕获组#1的开始(以便将所有匹配项放入re.findall
返回的元组列表中):`{%
\s*
-0+空格block
-一个block
子字符串\s+
-1+空格(.+?)
-除换行符以外的1+个字符(用[\s\S]
替换以匹配换行符),尽可能少地捕获到组2中\s*
-0+空格%}
-%
子字符串[\s\S]*?
-尽可能少的0个字符\{%
-一个{%
子字符串\s*
-0+空格endblock
-文字子字符串\s*
-0+空格(?:\2\s*)?
-组2值和后面的0+空格的可选序列%}
-一个%}
子字符串)
-外部捕获组#1的末尾。请参见Python demo:
import re
rx = r'(\{%\s*block\s+(.+?)\s*%}[\s\S]*?\{%\s*endblock\s*(?:\2\s*)?%})'
s = '{% block some_name %}Some Text{% endblock %} \nSomething Else\n{% block another_name %}Some Other Content{% endblock %}'
print(list(map(list, zip(*re.findall(rx, s))))) # Extracting and transposing the list
# => [['{% block some_name %}Some Text{% endblock %}', '{% block another_name %}Some Other Content{% endblock %}'], ['some_name', 'another_name']]
关于python - 适用于模板扩展的Python(3.4+)正则表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51457500/