我具有以下“示例”内容:

{% 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/

10-12 21:44
查看更多