import re
def re_rsplit(pattern, text, maxsplit):
if maxsplit == 0 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 maxsplit > 0 and cnt >= maxsplit: # Break out of for loop if maxsplit is greater than 0 and...
break # ...match count is more or 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']
aW1wb3J0IHJlCgpkZWYgcmVfcnNwbGl0KHBhdHRlcm4sIHRleHQsIG1heHNwbGl0KToKICAgIGlmIG1heHNwbGl0ID09IDAgb3Igbm90IHBhdHRlcm4uc2VhcmNoKHRleHQpOiAjIElmIHNwbGl0IGlzIDAgb3IgbGVzcywgb3IgdXBvbiBubyBtYXRjaAogICAgICAgIHJldHVybiBbdGV4dF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSZXR1cm4gdGhlIHN0cmluZyBpdHNlbGYgYXMgYSBvbmUtaXRlbSBsaXN0CiAgICBwcmV2ID0gbGVuKHRleHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFByZXZpb3VzIG1hdGNoIHZhbHVlIHN0YXJ0IHBvc2l0aW9uCiAgICBjbnQgPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEEgbWF0Y2ggY291bnRlcgogICAgcmVzdWx0ID0gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBPdXRwdXQgbGlzdAogICAgZm9yIG0gaW4gcmV2ZXJzZWQobGlzdChwYXR0ZXJuLmZpbmRpdGVyKHRleHQpKSk6CiAgICAgICAgcmVzdWx0LmFwcGVuZCh0ZXh0W20uZW5kKCk6cHJldl0pICAgICAgICAjIEFwcGVuZCBhIG1hdGNoIHRvIHJlc3VsdGluZyBsaXN0CiAgICAgICAgcHJldiA9IG0uc3RhcnQoKSAgICAgICAgICAgICAgICAgICAgICAgICAjIFNldCBwcmV2aW91cyBtYXRjaCBzdGFydCBwb3NpdGlvbgogICAgICAgIGNudCArPSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZW1lbnQgY291bnRlcgogICAgICAgIGlmIG1heHNwbGl0ID4gMCBhbmQgY250ID49IG1heHNwbGl0OiAgICAgIyBCcmVhayBvdXQgb2YgZm9yIGxvb3AgaWYgbWF4c3BsaXQgaXMgZ3JlYXRlciB0aGFuIDAgYW5kLi4uCiAgICAgICAgICAgIGJyZWFrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4uLm1hdGNoIGNvdW50IGlzIG1vcmUgb3IgZXF1YWxzIG1heCBzcGxpdCB2YWx1ZQogICAgcmVzdWx0LmFwcGVuZCh0ZXh0WzpwcmV2XSkgICAgICAgICAgICAgICAgICAgIyBBcHBlbmQgdGhlIHRleHQgY2h1bmsgZnJvbSBzdGFydAogICAgcmV0dXJuIHJldmVyc2VkKHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgIyBSZXR1cm4gcmV2ZXJzZWQgbGlzdAogICAgCnNwbGl0bWUgPSAiYSFiP2MhZCIKcGF0dGVybiA9IHJlLmNvbXBpbGUocidbIT9dJykKcHJpbnQobGlzdChyZV9yc3BsaXQocGF0dGVybiwgc3BsaXRtZSwgLTEpKSkgIyA9PiBbJ2EnLCAnYicsICdjJywgJ2QnXQpwcmludChsaXN0KHJlX3JzcGxpdChwYXR0ZXJuLCBzcGxpdG1lLCAwKSkpICAjID0+IFsnYSFiP2MhZCddCnByaW50KGxpc3QocmVfcnNwbGl0KHBhdHRlcm4sIHNwbGl0bWUsIDEpKSkgICMgPT4gWydhIWI/YycsICdkJ10KcHJpbnQobGlzdChyZV9yc3BsaXQocGF0dGVybiwgc3BsaXRtZSwgMikpKSAgIyA9PiBbJ2EhYicsICdjJywgJ2QnXQpwcmludChsaXN0KHJlX3JzcGxpdChwYXR0ZXJuLCBzcGxpdG1lLCAzKSkpICAjID0+IFsnYScsICdiJywgJ2MnLCAnZCddCnByaW50KGxpc3QocmVfcnNwbGl0KHBhdHRlcm4sIHNwbGl0bWUsIDUwKSkpICMgPT4gWydhJywgJ2InLCAnYycsICdkJ10=
['a', 'b', 'c', 'd']
['a!b?c!d']
['a!b?c', 'd']
['a!b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']