Разделение строки по шаблону split + re Python
У меня есть сплошной текст(Уголовный кодекс) Необходимо разбить его на статьи. Я разбиваю его так:
content = list("Статья "+ e for e in states.split("Статья "))
Но иногда статьи повторяются вот так:
'Статья 3. Разъяснение некоторы'
'Статья 3 дополнена пунктом'
Крайне необходимо в split добавить любая цифра и точка: типо этого -
content = list("Статья "+ e for e in states.split("Статья [\d+]."))
Пробую вот так:
content = list("Статья "+ e for e in re.split(r"Статья [\d+].", states))
Не то. Цифры пропадают
Вот строка для тренировок:
states='Статья 3. Разъяснение некоторы\nСтатья 3 дополнена пунктом\nСтатья 4. Разъяснение некоторы\nСтатья 4 дополнена пунктом'
Должен получиться список из двух строк
Вот так клево делит, но цифры пропадают:
content = list("Статья "+ e for e in re.split("Статья \d+\.", states))
Смастерил я полукостыли:
content = list(f"Статья {i}.{e}" for i, e in enumerate(re.split("Статья \d+\.", states)))
Ответы (2 шт):
У меня получилось сделать это через предобработку:
- Разделение текста по строкам (через
\n) - Вытаскивание номера статьи из строки
- Группирование строк по номеру статьи в словаре, где ключом будет номер статьи, а значением список строк
Пример:
import re
states = 'Статья 3. Разъяснение некоторы\nСтатья 3 дополнена пунктом\nСтатья 4. Разъяснение некоторы\nСтатья 4 дополнена пунктом'
chapter_by_text = dict()
for line in states.splitlines():
m = re.search(r'^Статья (\d+)', line)
number = m.group(1)
if number not in chapter_by_text:
chapter_by_text[number] = []
chapter_by_text[number].append(line)
print(chapter_by_text)
# {'3': ['Статья 3. Разъяснение некоторы', 'Статья 3 дополнена пунктом'], '4': ['Статья 4. Разъяснение некоторы', 'Статья 4 дополнена пунктом']}
items = [
'\n'.join(v)
for v in chapter_by_text.values()
]
print(items)
# ['Статья 3. Разъяснение некоторы\nСтатья 3 дополнена пунктом', 'Статья 4. Разъяснение некоторы\nСтатья 4 дополнена пунктом']
Ваш способ верен, только нужно использовать re.split (не str.split) и число нужно не захватывать, а лишь проверять на наличие с помощью блока предварительного просмотра вперёд:
import re
content = list("Статья "+ e for e in re.split(r"Статья(?= \d+\.)", states))
Это регулярное выражение находит
Статья- строкуСтатья...(?= \d+\.)- сразу после которой есть пробел, одна и более цифр, а затем символ точки.