fork(1) download
  1. import re
  2.  
  3. def re_rsplit(pattern, text, maxsplit):
  4. if maxsplit < 1 or not pattern.search(text): # If split is 0 or less, or upon no match
  5. return [text] # Return the string itself as a one-item list
  6. prev = len(text) # Previous match value start position
  7. cnt = 0 # A match counter
  8. result = [] # Output list
  9. for m in reversed(list(pattern.finditer(text))):
  10. result.append(text[m.end():prev]) # Append a match to resulting list
  11. prev = m.start() # Set previous match start position
  12. cnt += 1 # Increment counter
  13. if cnt == maxsplit: # Break out of for loop if...
  14. break # ...match count equals max split value
  15. result.append(text[:prev]) # Append the text chunk from start
  16. return reversed(result) # Return reversed list
  17.  
  18. splitme = "a!b?c!d"
  19. pattern = re.compile(r'[!?]')
  20. print(list(re_rsplit(pattern, splitme, -1))) # => ['a!b?c!d']
  21. print(list(re_rsplit(pattern, splitme, 0))) # => ['a!b?c!d']
  22. print(list(re_rsplit(pattern, splitme, 1))) # => ['a!b?c', 'd']
  23. print(list(re_rsplit(pattern, splitme, 2))) # => ['a!b', 'c', 'd']
  24. print(list(re_rsplit(pattern, splitme, 3))) # => ['a', 'b', 'c', 'd']
  25. print(list(re_rsplit(pattern, splitme, 50))) # => ['a', 'b', 'c', 'd']
Success #stdin #stdout 0.03s 9384KB
stdin
Standard input is empty
stdout
['a!b?c!d']
['a!b?c!d']
['a!b?c', 'd']
['a!b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']