用于模板扩展的Python(3.4+;)正则表达式
我有以下“样本”内容: 我试图用正则表达式来查找这两个块,首先是名称,然后是部分,但我只收到“findall”操作的第一个返回: **假设变量“contents”是顶部的字符串 因此,我需要两次搜索,或者如果可能的话,组合搜索,返回相似的结果:用于模板扩展的Python(3.4+;)正则表达式,python,regex,python-3.x,Python,Regex,Python 3.x,我有以下“样本”内容: 我试图用正则表达式来查找这两个块,首先是名称,然后是部分,但我只收到“findall”操作的第一个返回: **假设变量“contents”是顶部的字符串 因此,我需要两次搜索,或者如果可能的话,组合搜索,返回相似的结果: list[ ['some_name', 'another_name'], ['{% block some_name %}Some Text{% endblock %}', '{% block another_name %}Some Oth
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*)?%})'
看
详细信息
-开始外部捕获组#1(以便将所有匹配项放入(
)返回的元组列表中):re.findall
- `{%
-0+空格\s*
-一个块
子串块
-1+空格\s+
-1+个字符,而不是换行符字符(替换为(.+?)
,以便也匹配换行符),尽可能少,捕获到组2中[\s\s]
-0+空格\s*
-%}
子字符串%
-任何0+字符都尽可能少[\s\s]*?
-a\{%
子字符串{%
-0+空格\s*
-文字子字符串endblock
-0+空格\s*
-第2组值和后面0+空格的可选序列(?:\2\s*)?
-a%}
子字符串%}
-外部捕获组结束#1)
也许像这样的事情就可以了?你能接受口述吗?谢谢你的回答,口述总是可以的!答案已经给出,因此无需响应如果这是为了解析django/jinja模板,您可能应该确保endblock标记也可以有一个名称<代码>{%endblock some_name%}有效。在
{%}
中可以有任意的空格(包括换行符)。我很感激,虽然我也在这些空格中工作,但这不是它,但仍然非常有用!谢谢
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*)?%})'
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']]