Вы можете использовать re.split
со следующим регулярным выражением (с регулярным выражением римской цифры, заимствованным из paxdiablo ), чтобы разбить входную строку, а затем объединить их с помощью итератора:
import re
def split(s):
i = iter(re.split(r'(\(?\d+(?:\.\d+)+\)?|\(?\d+\)|\(?\b(?=M|(?:CM|CD|D?C)|(?:XC|XL|L?X)|(?:IX|IV|V?I))M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})[.)])', s, flags=re.IGNORECASE))
return next(i) + '\n'.join(map(''.join, zip(i, i)))
, чтобы с вашими примерами ввода:
split(string)
вернулось бы:
something here: 1) A
i) great
ii) awesome
2) B
и:
split(another_string)
вернуло бы:
But sometimes it is different (1) yep
(2) not the same
i. or this
ii. another bullet
(3.1) getting difficult huh?
3.1.1 okay i'm done