# http://stackoverflow.com/q/33600768/5290909
# Match last statement in Python while loop
import re
while_loop = re.compile(r'''
#while statement (group 1 captures the indentation)
^([ \t]*) while\b .* $
#code
(?:
#comments with any indentation
(?:
\s*?
\n [ \t]* [#].*
)*
#Optional else lines
(?:
\s*?
\n\1 else [ \t]* .* $
)?
#following lines with more indentation
\s*?
\n\1 [ \t]+ (?P<last_statement>.*)
)*
\n?
''', re.MULTILINE | re.VERBOSE)
test_str = r'''
while something:
do something;
do somethingelse;
do thelastthing;
continue with other statements..
'''
# Loop matches
m = 0
for match in while_loop.finditer(test_str):
m += 1
print( 'Match #%s [%s:%s]\nLast statement [%s:%s]:\t"%s"'
%(m, match.start(), match.end(), match.start("last_statement"),
match.end("last_statement"), match.group("last_statement")))
if m == 0:
print("NO MATCH")
IyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8zMzYwMDc2OC81MjkwOTA5CiMgTWF0Y2ggbGFzdCBzdGF0ZW1lbnQgaW4gUHl0aG9uIHdoaWxlIGxvb3AKaW1wb3J0IHJlCiAKd2hpbGVfbG9vcCA9IHJlLmNvbXBpbGUocicnJwoJCQkjd2hpbGUgc3RhdGVtZW50IChncm91cCAxIGNhcHR1cmVzIHRoZSBpbmRlbnRhdGlvbikKCQkJXihbIFx0XSopICB3aGlsZVxiICAuKiAgJAoJCQkKCQkJI2NvZGUKCQkJKD86CgkJCSAgICAjY29tbWVudHMgd2l0aCBhbnkgaW5kZW50YXRpb24KCQkJICAgICg/OgoJCQkgICAgICAgIFxzKj8KCQkJICAgICAgICBcbiAgWyBcdF0qICBbI10uKiAKCQkJICAgICkqCgkJCQoJCQkgICAgI09wdGlvbmFsIGVsc2UgbGluZXMKCQkJICAgICg/OgoJCQkgICAgICAgIFxzKj8KCQkJICAgICAgICBcblwxICBlbHNlICBbIFx0XSogIC4qICAkCgkJCSAgICApPwoJCQkKCQkJICAgICNmb2xsb3dpbmcgbGluZXMgd2l0aCBtb3JlIGluZGVudGF0aW9uCgkJCSAgICBccyo/CgkJCSAgICBcblwxICBbIFx0XSsgICg/UDxsYXN0X3N0YXRlbWVudD4uKikKCQkJKSoKCQkJCgkJCVxuPwonJycsIHJlLk1VTFRJTElORSB8IHJlLlZFUkJPU0UpCgoKdGVzdF9zdHIgPSByJycnCgkJCXdoaWxlIHNvbWV0aGluZzoKCQkJICAgIGRvIHNvbWV0aGluZzsKCQkJICAgIGRvIHNvbWV0aGluZ2Vsc2U7CgkJCSAgICBkbyB0aGVsYXN0dGhpbmc7CgkJCWNvbnRpbnVlIHdpdGggb3RoZXIgc3RhdGVtZW50cy4uCicnJwogCiAKIyBMb29wIG1hdGNoZXMKbSA9IDAKZm9yIG1hdGNoIGluIHdoaWxlX2xvb3AuZmluZGl0ZXIodGVzdF9zdHIpOgoJbSArPSAxCglwcmludCggJ01hdGNoICMlcyBbJXM6JXNdXG5MYXN0IHN0YXRlbWVudCBbJXM6JXNdOlx0IiVzIicgCgkJJShtLCBtYXRjaC5zdGFydCgpLCBtYXRjaC5lbmQoKSwgbWF0Y2guc3RhcnQoImxhc3Rfc3RhdGVtZW50IiksCgkJbWF0Y2guZW5kKCJsYXN0X3N0YXRlbWVudCIpLCBtYXRjaC5ncm91cCgibGFzdF9zdGF0ZW1lbnQiKSkpCgkKaWYgbSA9PSAwOgoJcHJpbnQoIk5PIE1BVENIIik=