Очень 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
.)
С более ранними версиями 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)