import re
regex = re.compile(r"(struct\s*\w+.*?(?=fn))(fn.*?(?=\),)\)).*?(?=fn)(fn.*?\))(?=\R\))", flags=re.DOTALL)
test_str = ("struct mbuh\n"
"(\n\n"
"lineshg = 0,\n"
"tres = \"text\",\n\n"
" fn track all:#() = \n"
" (\n"
" local c -- clone\n"
" local lpoint = [0,0,0] -- previous point created\n"
" local ccoll = #() -- array for created objects\n"
" local prev = [0,0] -- var for alt distance changing\n"
" ),\n\n"
" fn listzfun trs:123 x:#() = \n"
" (\n"
" obj = snapshotasmesh a\n"
" min_vz = max_vz = in coordsys world (getvert obj 1).z\n"
" min_vx = max_vx = in coordsys world (getvert obj 1).x\n"
" min_vy = max_vy = in coordsys world (getvert obj 1).y\n"
" )\n"
")\n\n"
"struct mbuh\n"
"(\n\n"
"lineshg = 0,\n"
"tres = \"text\",\n\n"
" fn track all:#() = \n"
" (\n"
" local c -- clone\n"
" local lpoint = [0,0,0] -- previous point created\n"
" local ccoll = #() -- array for created objects\n"
" local prev = [0,0] -- var for alt distance changing\n"
" ),\n\n"
" fn listzfun trs:123 x:#() = \n"
" (\n"
" obj = snapshotasmesh a\n"
" min_vz = max_vz = in coordsys world (getvert obj 1).z\n"
" min_vx = max_vx = in coordsys world (getvert obj 1).x\n"
" min_vy = max_vy = in coordsys world (getvert obj 1).y\n"
" )\n"
")\n\n"
"fn brung man: =\n"
"(\n\n"
")")
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