import re
regex = re.compile(r"#{3}(?P<town>.*?)(@{3}\n.*?)(&{3}(?P<person>.*?)(\^{3}\n))+?", flags=re.MULTILINE | re.DOTALL)
test_str = ("STARTOFTEXT\n"
"&&&Aragorn^^^\n"
"###The Shire@@@\n"
"&&&Frodo^^^\n"
"&&&Bilbo^^^\n"
"&&&Pippin^^^\n"
"###Gondor@@@\n"
"&&&Faramir^^^\n"
"&&&Boramir^^^\n"
"ENDOFTEXT")
subst = "\\g<person> is from \\g<town>\\n"
result = regex.sub(subst, test_str)
if result:
print(result)
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