4

Всем привет! Только начал разбираться в разработке на python и попалась интересная и в то же время сложная задача для меня, которую я не могу решить.

Вот сама задача: имеется текстовый документ, который состоит из пунктов, которые могут содержать сколько угодно подпунктов (пример - 1.1. абв; 1.2. вба; 2.4. жзи). Из этого документа могут удаляться любые пункты. Пример:

1.1. Пункт первый, текст.
1.2. Пункт второй, который будет полностью удален.
1.3. Пункт третий, текст.

При таком наивном удалении нумерация нарушится:

1.1. Пункт первый, текст.
1.3. Пункт третий, текст.

и пункт 1.3 будет следовать за пунктом 1.1. А нужно, чтобы она не нарушалась. Т.е. после удаления пункта 1.2 пункт 1.3 должен переименоваться в '1.2. Пункт третий, текст' и текст должен выглядеть так

1.1. Пункт первый, текст.
1.2. Пункт третий, текст.

Используется Python 3.6

User
  • 41
  • нужно более чётко формат файла обозначить: пункты у вас все ровно одну строчку занимают? То есть номера пунктов всегда подряд идут и в самом начале строк находятся? Является пример в вопросе представительным? Или ввод другой формат имеет? Какой? – jfs Apr 01 '18 at 13:41
  • пример в вопросе самый представительный, как я его вижу). Другие варианты не рассматриваются. Сами пункты идут друг под другом (не в одну строчку в файле). Нумерация пунктов последовательная и находятся в самом начале строки всегда. – User Apr 01 '18 at 13:46

1 Answers1

2

Можно с помощью регулярных выражений исправить нумерацию:

import re

def make_replace(index):
    def replace(m):
        nonlocal index
        s = m.group(1) + str(index)
        index += 1
        return s
    return replace

replace = make_replace(index=2)    
for line in file:
    print(re.sub(r'(^1\.)\d+', replace, line), end='')

Полный пример. См. Как заменить строчку в .txt файле через python 3?

Можно упростить replace() функцию, используя itertools.count():

replace = lambda m, i=itertools.count(index): m.group(1)+str(next(i))

Пример.

jfs
  • 52,361
  • Спасибо больше за инфу и знания! – User Apr 01 '18 at 14:24
  • Ох, если не сложно, можно комменты к коду написать. Самому пока сложно в написанном разобраться. Понял, что объвляется функция make_replace, но что в ней происходит не до конца усвоил. – User Apr 01 '18 at 15:40
  • @User: что у вас сложности вызывает? Работали с regex или closure или ни с тем ни с другим не знакомы? – jfs Apr 01 '18 at 16:10
  • С регулярными выражениями знаком. Я по поводу самой функции make_replace. Но перечитывая код и используя гугл, ответы находятся). – User Apr 01 '18 at 16:21
  • @User ссылка со словом closure должна прояснить как make_replace работает. Если есть вопросы, спрашивайте (к примеру, как отдельный Stack Overflow вопрос, если не ясно как make_counter работает). – jfs Apr 01 '18 at 16:28