import re
regex = re.compile(r"""
(?(DEFINE)
# Note that everything is atomic, JSON does not need backtracking if it's valid
# and this prevents catastrophic backtracking
(?<json>(?>\s*(?&object)\s*|\s*(?&array)\s*))
(?<object>(?>\{\s*(?>(?&pair)(?>\s*,\s*(?&pair))*)?\s*\}))
(?<pair>(?>(?&STRING)\s*:\s*(?&value)))
(?<array>(?>\[\s*(?>(?&value)(?>\s*,\s*(?&value))*)?\s*\]))
(?<value>(?>true|false|null|(?&STRING)|(?&NUMBER)|(?&object)|(?&array)))
(?<STRING>(?>"(?>\\(?>["\\\/bfnrt]|u[a-fA-F0-9]{4})|[^"\\\0-\x1F\x7F]+)*"))
(?<NUMBER>(?>-?(?>0|[1-9][0-9]*)(?>\.[0-9]+)?(?>[eE][+-]?[0-9]+)?))
)
\A(?&json)\z
""", flags=re.VERBOSE)
test_str = ("[\n"
" \"JSON Test Pattern pass1\",\n"
" {\"object with 1 member\":[\"array with 1 element\"]},\n"
" {},\n"
" [],\n"
" -42,\n"
" true,\n"
" false,\n"
" null,\n"
" {\n"
" \"integer\": 1234567890,\n"
" \"real\": -9876.543210,\n"
" \"e\": 0.123456789e-12,\n"
" \"E\": 1.234567890E+34,\n"
" \"\": 23456789012E66,\n"
" \"zero\": 0,\n"
" \"one\": 1,\n"
" \"space\": \" \",\n"
" \"quote\": \"\\\"\",\n"
" \"backslash\": \"\\\\\",\n"
" \"controls\": \"\\b\\f\\n\\r\\t\",\n"
" \"slash\": \"/ & \\/\",\n"
" \"alpha\": \"abcdefghijklmnopqrstuvwyz\",\n"
" \"ALPHA\": \"ABCDEFGHIJKLMNOPQRSTUVWYZ\",\n"
" \"digit\": \"0123456789\",\n"
" \"0123456789\": \"digit\",\n"
" \"special\": \"`1~!@#$%^&*()_+-={':[,]}|;.</>?\",\n"
" \"hex\": \"\\u0123\\u4567\\u89AB\\uCDEF\\uabcd\\uef4A\",\n"
" \"true\": true,\n"
" \"false\": false,\n"
" \"null\": null,\n"
" \"array\":[ ],\n"
" \"object\":{ },\n"
" \"address\": \"50 St. James Street\",\n"
" \"url\": \"http://www.JSON.org/\",\n"
" \"comment\": \"// /* <!-- --\",\n"
" \"# -- --> */\": \" \",\n"
" \" s p a c e d \" :[1,2 , 3\n\n"
",\n\n"
"4 , 5 , 6 ,7 ],\"compact\":[1,2,3,4,5,6,7],\n"
" \"jsontext\": \"{\\\"object with 1 member\\\":[\\\"array with 1 element\\\"]}\",\n"
" \"quotes\": \"" \\u0022 %22 0x22 034 "\",\n"
" \"\\/\\\\\\\"\\uCAFE\\uBABE\\uAB98\\uFCDE\\ubcda\\uef4A\\b\\f\\n\\r\\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?\"\n"
": \"A key can be any string\"\n"
" },\n"
" 0.5 ,98.6\n"
",\n"
"99.44\n"
",\n\n"
"1066,\n"
"1e1,\n"
"0.1e1,\n"
"1e-1,\n"
"1e00,2e+00,2e-00\n"
",\"rosebud\"]")
match = regex.search(test_str)
if match:
print(f"Match 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