import re
regex = re.compile(r"\[\@if(not)?:([a-zA-Z0-9]+)(?:=(.*?))?\].*?\[\@endif:\2\]", flags=re.DOTALL)
test_str = ("<!-- <h1>[!WLANSettings]</h1> -->\n"
"[@if:examplevar=notgiven]this text won't show[@endif:examplevar]\n"
"[@if:wlanena]\n"
"[@if:wlanauto]\n"
"<table id=\"wlanavail\" class=\"colorrows inputtable\">\n"
" <tr id=\"firstrow\">\n"
" <th width=\"30px\"></th>\n"
" <th width=\"240px\">[!Name] (SSID)</th>\n"
" <th width=\"110px\">[!Encryption]</th>\n"
" <th width=\"150px\">[!SignalStrength]</th>\n"
" <th width=\"200px\">[!MAC]</th>\n"
" </tr>\n\n"
" <tr id=\"loadingrow\">\n"
" <td colspan=5 class=\"centertext\"><img src=\"resources/loading.gif\"\n"
" id=\"loadingWlanScan\"></td>\n"
" </tr>\n"
" <tr>\n"
" <td></td>\n"
" <td colspan=4><input type=\"button\" id=\"rescan\"\n"
" value=\"[!Refresh]\" style=\"width: 200px\"></td>\n"
" </tr>\n"
"</table>\n"
"<p></p>\n"
"[@endif:wlanauto]\n"
"<table id=\"wlansettings\" class=\"inputTable\">\n"
" <tr id=\"wlannamerow\" [@if:wlanauto]style=\"display: none;\"[@endif:wlanauto]>\n"
" <td>[!WLANName]</td>\n"
" <td><input type=\"text\" name=\"wlanname\" id=\"wlanname\"\n"
" [@if:wlanauto]value=\"[@wlanname]\"[@endif:wlanauto] style=\"width: 309px;\"></td>\n"
" </tr>\n"
" <tr>\n"
" <td>[!Password]:</td>\n"
" <td><input type=\"text\" name=\"wlanpass\" id=\"wlanpass\"\n"
" style=\"width: 309px;\"></td>\n"
" </tr>\n"
" <tr>\n"
" <td colspan=\"2\" >\n"
" <input type=\"button\" \n"
" [@if:wlanauto]id=\"manualcfg\" name=\"manualcfg\" value=\"[!ManualConfig]\"[@endif:wlanauto]\n"
" [@ifnot:wlanauto]id=\"autocfg\" name=\"autocfg\" value=\"[!AutomaticConfig]\"[@endif:wlanauto]\n"
" onclick=\"handleMultiform(event, this);\" style=\"width: 180px;\">\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td>\n"
" <input type=\"hidden\" name=\"encinput\" id=\"encinput\" value=\"\"></td>\n"
" <td id=\"wlaninfo\"></td>\n"
" </tr>\n"
"</table>\n"
"[@ipsettings]\n\n"
"[@endif:wlanena]\n"
"[@ifnot:wlanena]\n"
"[!NoWLANDevicePluggedIn]\n"
"<p>\n"
" <input type=\"button\" name=\"back\" onclick=\"handleMultiform(event, this);\" value=\"[!Back]\" />\n"
"</p>\n"
"[@endif:wlanena]\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