Как разбить большой документ на маленькие документы на основе шаблона с помощью Regex?

Очень very грубо, вы можете просто удалить любые игнорируемые ключи и сравнить эти словари:

def equal_dicts(d1, d2, ignore_keys=()):
    d1_, d2_ = d1.copy(), d2.copy()
    for k in ignore_keys:
        try:
            del d1_[k]
        except KeyError: 
            pass
        try:
            del d2_[k]
        except KeyError: 
            pass

    return d1_ == d2_

(Заметим, что здесь нам не нужна глубокая копия, мы просто нужно избегать модификации d1 и d2.)

2
задан Victor Wang 17 March 2019 в 21:09
поделиться

1 ответ

С более ранними версиями 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 demo

Подробности

  • (?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)'
[ 1139] См. regex demo .

Подробности

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

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

re.split(r'(?!\A)(?=^\d{1,4} of \d{1,4} DOCUMENTS)', text, flags=re.M)
0
ответ дан Wiktor Stribiżew 17 March 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: