import re
test_str = ("%macro msg (name= some_macro) ;\n"
"%put Hello World, my name is &name ;\n"
" %mend ;\n\n"
"%macro msg (name= some_macro) ;\n"
"%put Hello World, my name is &name ;\n"
"%let something happen\n"
"%do something else\n"
"%mend ;")
pattern = re.compile(r"%macro.*\r?\n((?:(?!\s*%mend).*\r?\n)+)\s*%mend ;")
print(re.findall(pattern, test_str))
aW1wb3J0IHJlCgp0ZXN0X3N0ciA9ICgiJW1hY3JvIG1zZyAobmFtZT0gc29tZV9tYWNybykgO1xuIgoJIiVwdXQgSGVsbG8gV29ybGQsIG15IG5hbWUgaXMgJm5hbWUgO1xuIgoJIiAlbWVuZCA7XG5cbiIKCSIlbWFjcm8gbXNnIChuYW1lPSBzb21lX21hY3JvKSA7XG4iCgkiJXB1dCBIZWxsbyBXb3JsZCwgbXkgbmFtZSBpcyAmbmFtZSA7XG4iCgkiJWxldCBzb21ldGhpbmcgaGFwcGVuXG4iCgkiJWRvIHNvbWV0aGluZyBlbHNlXG4iCgkiJW1lbmQgOyIpCgpwYXR0ZXJuID0gcmUuY29tcGlsZShyIiVtYWNyby4qXHI/XG4oKD86KD8hXHMqJW1lbmQpLipccj9cbikrKVxzKiVtZW5kIDsiKQoKcHJpbnQocmUuZmluZGFsbChwYXR0ZXJuLCB0ZXN0X3N0cikp