#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)
проверка смотровой площадки встроена («замужем») в .*?
шаблон).