Как разбить большой документ на маленькие документы на основе шаблона с помощью Regex? - PullRequest
2 голосов
/ 18 марта 2019

Большой документ состоит из небольшого документа, разделенного шаблоном типа «1 из 1435 ДОКУМЕНТОВ». Я хочу разбить его на 1435 небольших документов.

 re_1 =  r"\d{1,4} of \d{1,4} DOCUMENTS.+?"

 re_2 =  r"\d{1,4} of \d{1,4} DOCUMENTS.+"

re_1 дает мне только «1 из 1435 ДОКУМЕНТОВ» и т. Д. re_2 дает мне весь документ.

Если есть способ использовать re.findall с правильным регулярным выражением? или я должен сделать re.split (который оказывается самым легким для этого случая) или альтернативно зацикливается на каждой строке и проверяет шаблон? Спасибо!

1 of 1435 DOCUMENTS
blabla (multiple lines)

2 of 1435 DOCUMENTS
blabla(multiple lines)
3 of 1435 DOCUMENTS
blabla(multiple lines)
4 of 1435 DOCUMENTS
blabla(multiple lines)

5 of 1435 DOCUMENTS
....

1 Ответ

1 голос
/ 18 марта 2019

В более ранних версиях Python до 3.7 вы можете использовать re.findall с

r'(?sm)^\d{1,4} of \d{1,4} DOCUMENTS.*?(?=^\d{1,4} of \d{1,4} DOCUMENTS|\Z)'

См. Демонстрацию regex

Подробнее

  • (?sm) - re.M и re.S опции для
  • ^ - начало строки
  • \d{1,4} of \d{1,4} DOCUMENTS - от 1 до 4 цифр, пробел, of, пробел, от 1 до 4 цифр, пробел и DOCUMENTS подстрока
  • .*? - любые 0 или более символов, как можно меньше, вплоть до ближайшего
  • (?=^\d{1,4} of \d{1,4} DOCUMENTS|\Z) - ^\d{1,4} of \d{1,4} DOCUMENTS шаблон или (|) конец строки (\Z).

См. Демонстрационную версию Python :

import re
s = "TEXT_HERE"
print(re.findall(r'^\d{1,4} of \d{1,4} DOCUMENTS.*?(?=\d{1,4} of \d{1,4} DOCUMENTS|\Z)', s, re.M | re.S))
# => ['1 of 1435 DOCUMENTS\nblabla (multiple lines)\n\n', '2 of 1435 DOCUMENTS\nblabla(multiple lines)\n', '3 of 1435 DOCUMENTS\nblabla(multiple lines)\n', '4 of 1435 DOCUMENTS\nblabla(multiple lines)\n\n', '5 of 1435 DOCUMENTS\n....']

В Python 3.7, где re.split может делиться на совпадения нулевой длины, вы можете использовать

r'(?m)(?!\A)(?=^\d{1,4} of \d{1,4} DOCUMENTS)'

См. Демонстрационную версию regex .

Подробности

  • (?m) - re.M опция включена
  • (?!\A) - не в начале строки - (?=^\d{1,4} of \d{1,4} DOCUMENTS) - сразу направо,должно быть начало строки, от 1 до 4 цифр, пробел, of, пробел, от 1 до 4 цифр, пробел и DOCUMENTS подстрока

Использование:

re.split(r'(?!\A)(?=^\d{1,4} of \d{1,4} DOCUMENTS)', text, flags=re.M)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...