Как лучше всего разбить строку, содержащую списки чисел, римские цифры и маркеры? - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь разбить строку с несколькими списками внутри них с различным форматированием.Каков наилучший способ сделать это?

string = "something here: 1) A i) great ii) awesome 2) B"

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"

В идеале, я хотел бы иметь возможность разбить любую возможную нумерацию или список маркеров.

Желаемый вывод для строки:

something here: 1) A 
i) great 
ii) awesome 
2) B

Требуемый вывод для другой строки:

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

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете использовать 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
...