import re
regex = re.compile(r"(\s*\{(?:\s*\"Modulus\"\s*:\s*\"[a-zA-Z\d\+\/]+={0,2}\"\s*(?(3)(?(4)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*\"Exponent\"\s*:\s*\"[a-zA-Z\d\+\/]+={0,2}\"\s*(?(2)(?(4)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*\"P\"\s*:\s*\"[a-zA-Z\d\+\/]+={0,2}\"\s*(?(2)(?(3)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*\"Q\"\s*:\s*\"[a-zA-Z\d\+\/]+={0,2}\"\s*(?(2)(?(3)(?(4)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*\"DP\"\s*:\s*\"[a-zA-Z\d\+\/]+={0,2}\"\s*(?(2)(?(3)(?(4)(?(5)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*\"DQ\"\s*:\s*\"[a-zA-Z\d\+\/]+={0,2}\"\s*(?(2)(?(3)(?(4)(?(5)(?(6)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*\"InverseQ\"\s*:\s*\"[a-zA-Z\d\+\/]+={0,2}\"\s*(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*\"D\"\s*:\s*\"[a-zA-Z\d\+\/]+={0,2}\"\s*(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)(?(8)|,)|,)|,)|,)|,)|,)|,)()){8}\s*\}\s*\2\3\4\5\6\7\8\9)|(\s*\{(?:\s*\"Modulus\"\s*:\s*\"[a-zA-Z\d\+\/]+={0,2}\"\s*(?(12)|,)()|\s*\"Exponent\"\s*:\s*\"[a-zA-Z\d\+\/]+={0,2}\"\s*(?(11)|,)()){2}\s*\}\s*\11\12)", flags=re.MULTILINE)
test_str = ("\n"
" {\n"
" \"Modulus\": \"AQAB\", \n"
"\"Exponent\": \"AQAB\",\n"
"\"P\": \"AQAB\", \n"
"\"Q\": \"AQAB\",\n\n"
"\"DP\": \"AQAB\",\n\n\n"
"\"DQ\": \"AQAB\",\n"
"\"InverseQ\": \"AQAB\",\n"
"\"D\": \"AQAB\" \n\n"
"} \n\n\n\n"
" {\n"
" \"Modulus\": \"AQAB\", \n"
"\"Exponent\": \"AQAB\" \n\n"
"} \n"
"(?(1)(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)|,)|,)|,)|,)|,)|,)|,)\n"
"2-3-4-5-6-7-8-9\n"
"(?(3)(?(4)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)\n"
"(?(2)(?(4)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)\n"
"(?(2)(?(3)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)\n"
"(?(2)(?(3)(?(4)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)\n"
"(?(2)(?(3)(?(4)(?(5)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)\n"
"(?(2)(?(3)(?(4)(?(5)(?(6)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)\n"
"(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)(?(9)|,)|,)|,)|,)|,)|,)|,)\n"
"(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)(?(8)|,)|,)|,)|,)|,)|,)|,)\n\n"
"(?(DEFINE)(?P<b64>[a-zA-Z\\d\\+\\/]+={0,2})(?P<Q1>\\s*\")(?P<C1>(?(22)(?(23)(?(24)(?(25)(?(26)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C2>(?(21)(?(23)(?(24)(?(25)(?(26)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C3>(?(21)(?(22)(?(24)(?(25)(?(26)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C4>(?(21)(?(22)(?(23)(?(25)(?(26)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C5>(?(21)(?(22)(?(23)(?(24)(?(26)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C6>(?(21)(?(22)(?(23)(?(24)(?(25)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C7>(?(21)(?(22)(?(23)(?(24)(?(25)(?(26)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C8>(?(21)(?(22)(?(23)(?(24)(?(25)(?(26)(?(27)|,)|,)|,)|,)|,)|,)|,))(?P<Q2>\"\\s*:\\s*\"(?P>b64)\"\\s*)(?P<Modulus>(?P>Q1)Modulus(?P>Q2))(?P<Exponent>(?P>Q1)Exponent(?P>Q2))(?P<P>(?P>Q1)P(?P>Q2))(?P<Q>(?P>Q1)Q(?P>Q2))(?P<DP>(?P>Q1)DP(?P>Q2))(?P<DQ>(?P>Q1)DQ(?P>Q2))(?P<InverseQ>(?P>Q1)InverseQ(?P>Q2))(?P<D>(?P>Q1)D(?P>Q2)))(\\s*{\\s*)(?:(?P>Modulus)(?P>C1)()|(?P>Exponent)(?P>C2)()|(?P>P)(?P>C3)()|(?P>Q)(?P>C4)()|(?P>DP)(?P>C5)()|(?P>DQ)(?P>C6)()|(?P>InverseQ)(?P>C7)()|(?P>D)(?P>C8)()){8}\\s*}")
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