import re
regex = re.compile(r"^((a{1,4}|a?b|ba){1,3}|(a{1,3}|b){1,4}|((a{2,3}|b){2}|aaba|abaa){2})$", flags=re.MULTILINE)
test_str = ("Allowed:\n"
"aaaaaaaaaaaa\n"
"aaaaaaaaaaa\n"
"abaaaaab\n"
"baaaaaba\n"
"abaaaaba\n"
"bbbb\n"
"bababa\n"
"ababab\n"
"aabaabaa\n"
"abaabaaa\n"
"baaaaaab\n"
"baaaaab\n\n"
"baaaaaaaaa\n"
"abaaaaaaaa\n"
"aabaaaaaaa\n"
"aaabaaaaaa\n"
"aaaabaaaaa\n"
"aaaaabaaaa\n"
"aaaaaabaaa\n"
"aaaaaaabaa\n"
"aaaaaaaaba\n"
"aaaaaaaaab\n\n"
"baaaaaba\n"
"abaaaaab\n"
"babaaaaa\n"
"ababaaaa\n"
"aababaaa\n"
"aaaababa\n"
"aaaaabab\n\n"
"baaaabaa\n"
"abaaaaba\n"
"aabaaaab\n"
"baabaaaa\n"
"abaabaaa\n"
"aabaabaa\n"
"aaabaaba\n\n"
"baaaaba\n"
"abaaaab\n"
"babaaaa\n"
"ababaaa\n"
"aababaa\n"
"aaababa\n\n"
"abba\n"
"abbb\n"
"bababa\n"
"bbaab\n"
"abbab\n"
"abaabb\n"
"baaabaa\n"
"abaaaba\n"
"aabaaab\n"
"baabaaa\n"
"abaabaa\n"
"abaabaa\n"
"aabaaba\n\n"
"Disallowed:\n"
"aaaaaaaaaaaaa\n"
"aabaabaaa\n"
"aababab\n"
"bbbba\n"
"bbabb\n"
"baaaaaaab")
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