import re
def re_rsplit(pattern, text, maxsplit):
if maxsplit < 1 or not pattern.search(text): # If split is 0 or less, or upon no match
return [text] # Return the string itself as a one-item list
prev = len(text) # Previous match value start position
cnt = 0 # A match counter
result = [] # Output list
for m in reversed(list(pattern.finditer(text))):
result.append(text[m.end():prev]) # Append a match to resulting list
prev = m.start() # Set previous match start position
cnt += 1 # Increment counter
if cnt == maxsplit: # Break out of for loop if...
break # ...match count equals max split value
result.append(text[:prev]) # Append the text chunk from start
return reversed(result) # Return reversed list
splitme = "a!b?c!d"
pattern = re.compile(r'[!?]')
print(list(re_rsplit(pattern, splitme, -1))) # => ['a!b?c!d']
print(list(re_rsplit(pattern, splitme, 0))) # => ['a!b?c!d']
print(list(re_rsplit(pattern, splitme, 1))) # => ['a!b?c', 'd']
print(list(re_rsplit(pattern, splitme, 2))) # => ['a!b', 'c', 'd']
print(list(re_rsplit(pattern, splitme, 3))) # => ['a', 'b', 'c', 'd']
print(list(re_rsplit(pattern, splitme, 50))) # => ['a', 'b', 'c', 'd']
aW1wb3J0IHJlCgpkZWYgcmVfcnNwbGl0KHBhdHRlcm4sIHRleHQsIG1heHNwbGl0KToKICAgIGlmIG1heHNwbGl0IDwgMSBvciBub3QgcGF0dGVybi5zZWFyY2godGV4dCk6ICMgSWYgc3BsaXQgaXMgMCBvciBsZXNzLCBvciB1cG9uIG5vIG1hdGNoCiAgICAgICAgcmV0dXJuIFt0ZXh0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJldHVybiB0aGUgc3RyaW5nIGl0c2VsZiBhcyBhIG9uZS1pdGVtIGxpc3QKICAgIHByZXYgPSBsZW4odGV4dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUHJldmlvdXMgbWF0Y2ggdmFsdWUgc3RhcnQgcG9zaXRpb24KICAgIGNudCA9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQSBtYXRjaCBjb3VudGVyCiAgICByZXN1bHQgPSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE91dHB1dCBsaXN0CiAgICBmb3IgbSBpbiByZXZlcnNlZChsaXN0KHBhdHRlcm4uZmluZGl0ZXIodGV4dCkpKToKICAgICAgICByZXN1bHQuYXBwZW5kKHRleHRbbS5lbmQoKTpwcmV2XSkgICAgICAgICMgQXBwZW5kIGEgbWF0Y2ggdG8gcmVzdWx0aW5nIGxpc3QKICAgICAgICBwcmV2ID0gbS5zdGFydCgpICAgICAgICAgICAgICAgICAgICAgICAgICMgU2V0IHByZXZpb3VzIG1hdGNoIHN0YXJ0IHBvc2l0aW9uCiAgICAgICAgY250ICs9IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlbWVudCBjb3VudGVyCiAgICAgICAgaWYgY250ID09IG1heHNwbGl0OiAgICAgICAgICAgICAgICAgICAgICAjIEJyZWFrIG91dCBvZiBmb3IgbG9vcCBpZi4uLgogICAgICAgICAgICBicmVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAuLi5tYXRjaCBjb3VudCBlcXVhbHMgbWF4IHNwbGl0IHZhbHVlCiAgICByZXN1bHQuYXBwZW5kKHRleHRbOnByZXZdKSAgICAgICAgICAgICAgICAgICAjIEFwcGVuZCB0aGUgdGV4dCBjaHVuayBmcm9tIHN0YXJ0CiAgICByZXR1cm4gcmV2ZXJzZWQocmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAjIFJldHVybiByZXZlcnNlZCBsaXN0CiAgICAKc3BsaXRtZSA9ICJhIWI/YyFkIgpwYXR0ZXJuID0gcmUuY29tcGlsZShyJ1shP10nKQpwcmludChsaXN0KHJlX3JzcGxpdChwYXR0ZXJuLCBzcGxpdG1lLCAtMSkpKSAjID0+IFsnYSFiP2MhZCddCnByaW50KGxpc3QocmVfcnNwbGl0KHBhdHRlcm4sIHNwbGl0bWUsIDApKSkgICMgPT4gWydhIWI/YyFkJ10KcHJpbnQobGlzdChyZV9yc3BsaXQocGF0dGVybiwgc3BsaXRtZSwgMSkpKSAgIyA9PiBbJ2EhYj9jJywgJ2QnXQpwcmludChsaXN0KHJlX3JzcGxpdChwYXR0ZXJuLCBzcGxpdG1lLCAyKSkpICAjID0+IFsnYSFiJywgJ2MnLCAnZCddCnByaW50KGxpc3QocmVfcnNwbGl0KHBhdHRlcm4sIHNwbGl0bWUsIDMpKSkgICMgPT4gWydhJywgJ2InLCAnYycsICdkJ10KcHJpbnQobGlzdChyZV9yc3BsaXQocGF0dGVybiwgc3BsaXRtZSwgNTApKSkgIyA9PiBbJ2EnLCAnYicsICdjJywgJ2QnXQ==
['a!b?c!d']
['a!b?c!d']
['a!b?c', 'd']
['a!b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']