Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于模板扩展的Python(3.4+;)正则表达式_Python_Regex_Python 3.x - Fatal编程技术网

用于模板扩展的Python(3.4+;)正则表达式

用于模板扩展的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

我有以下“样本”内容:

我试图用正则表达式来查找这两个块,首先是名称,然后是部分,但我只收到“findall”操作的第一个返回:

**假设变量“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*)?%})'

详细信息

  • -开始外部捕获组#1(以便将所有匹配项放入
    re.findall
    )返回的元组列表中):
    • `{%
    • \s*
      -0+空格
    • -一个
      子串
    • \s+
      -1+空格
    • (.+?)
      -1+个字符,而不是换行符字符(替换为
      [\s\s]
      ,以便也匹配换行符),尽可能少,捕获到组2中
    • \s*
      -0+空格
    • %}
      -
      %
      子字符串
    • [\s\s]*?
      -任何0+字符都尽可能少
    • \{%
      -a
      {%
      子字符串
    • \s*
      -0+空格
    • endblock
      -文字子字符串
    • \s*
      -0+空格
    • (?:\2\s*)?
      -第2组值和后面0+空格的可选序列
    • %}
      -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']]