import re
regex = re.compile(r"{\s*{\s*#\s*(?<operator>endcase|endswitch|endfor|endif|if|elif|else|for|switch|case|default)\s*(?<args>[^}]*)\s*}\s*}\s*(?<body>[^{]*(?:\s*{\s*{\s*#\s*(?!(?&operator))\s*[^}]*\s*}\s*}\s*[^{]*)*)", flags=re.UNICODE | re.IGNORECASE)
test_str = ("<div>\n"
"{{#if arg1.arg2}}\n"
"<span>{{#var arg3 static}}</span>\n"
"blablabla{{#for k, v in arg4}}\n"
"<p>{{#var k}}<span>{{#var v.arg5}}</span></p>\n"
"{{#if (k == \"test\" or v != 0) and k == 0}}\n"
"<span></span>\n"
"{{#elif k == 0}}\n"
"<p></p>\n"
"{{#else}}\n"
"<div></div>\n"
"{{#endif}}\n"
"{{#endfor}}\n"
"{{#endif}}\n\n"
"{{#switch arg6}}\n"
"{{#case 5}}\n"
"case 5\n"
"{{#case 6, 7, 8}}\n"
"case 6, 7, 8\n"
"{{#endcase}}\n"
"{{#default}}\n"
"def\n"
"{{#endcase}}\n"
"{{#endswitch}}\n\n"
"{{#for i as 0, 5}}\n"
"test i\n"
"{{#endfor}}")
matches = regex.finditer(test_str)
for match_num, match in enumerate(matches, start=1):
print(f"Match {match_num} was found at {match.start()}-{match.end()}: {match.group()}")
for group_num, group in enumerate(match.groups(), start=1):
print(f"Group {group_num} found at {match.start(group_num)}-{match.end(group_num)}: {group}")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Python, please visit: https://docs.python.org/3/library/re.html