I think the question you are asking here is why does it return this:
>>> re.findall(r'(ab)+', "ababababab")
['ab']
The answer is that if you have one or more groups in the pattern then findall will return a list with all the matched groups. However your regex has one group that is matched multiple times within the regex, so it takes the last value of the match.
I think what you want is either this:
>>> re.findall(r'(ab)', "ababababab")
['ab', 'ab', 'ab', 'ab', 'ab']
or the version you posted:
>>> re.findall(r'(?:ab)+', "ababababab")
['ababababab']