Регулярное выражение для разделения документа

#python #regex

Вопрос:

Я хотел бы разделить отдельные PDF-документы из составного набора из файла. До сих пор это работает для структурированных файлов: %PDF- .... %%EOF ... %PDF- .... %%EOF с помощью следующего кода:

 REGEX_PDF = b'%PDF-. ?%%EOF'
pdfDocuments = re.findall( REGEX_PDF, fileContent, re.DOTALL )
 

Теперь мне нужно изменить программное обеспечение, чтобы также работать с PDF-файлами с расширениями. В результате получается файловая структура, подобная этой: %PDF- .... %%EOF ... %%EOF ... %%EOF ... %PDF- .... %%EOF . Поэтому мне нужно сопоставить подстроки из тега PDF до последнего тега %%EOF перед следующим тегом PDF. Мое лучшее предположение таково:

 REGEX_PDF = b'%PDF-. (?!%PDF-). %%EOF'
 

Но, похоже, это не работает. Вместо этого только 1 подстрока сопоставляется с 1-м тегом %PDF поверх самого последнего тега %%EOF. У кого-нибудь есть представление о том, где ошибка?

Заранее спасибо, Томас

Ответ №1:

Вы можете положиться на разделитель «начало» здесь и использовать

 re.split(rb'(?!A)(?=%PDF-)', fileContent)
re.findall(rb'%PDF-.*?(?=%PDF-|Z)', fileContent, re.S)
re.findall(rb'%PDF-[^%]*(?:%(?!PDF-)[^%]*)*', fileContent)
 

Смотрите демонстрацию регулярного выражения № 1, демонстрацию регулярного выражения № 2 и демонстрацию регулярного выражения № 3.

Регулярное (?!A)(?=%PDF-) выражение соответствует местоположению в начальной позиции, за которым немедленно следует %PDF- .

%PDF-.*?(?=%PDF-|Z) Шаблон совпадает %PDF- , затем любые нулевые или более символов как можно меньше до крайнего левого вхождения %PDF- или конца строки. %PDF-[^%]*(?:%(?!PDF-)[^%]*)* это почти то же самое, но он не проверяет, есть ли %PDF- на правой стороне (здесь (?=%PDF-|Z) проверка смотровой площадки встроена («замужем») в .*? шаблон).