如何编写正则表达式拆分含多段%%EOF的复合PDF文件
原正则错误原因
- 贪婪匹配逻辑优先级问题:你编写的
REGEX_PDF = b'%PDF\-.+(?!%PDF\-).+%%EOF'中,.+为贪婪匹配模式,会优先吞噬尽可能多的字符直到字符串末尾,再执行后面的负向先行断言(?!%PDF\-),此时字符串末尾不存在%PDF-标记,断言必然成立,最终只会匹配到整个文件最后一个%%EOF,无法拆分出多个独立PDF。 - 断言位置逻辑错误:负向先行断言需要在每一步匹配前校验是否出现下一个PDF的起始标记,而不是在吞噬完所有内容后再校验,原有写法的断言完全没有起到区间截断的作用。
正确适配方案
使用回火贪婪令牌限制匹配区间,保证匹配范围不会越过下一个%PDF-起始标记,同时自动匹配区间内最后一个%%EOF结束标记,代码如下:
REGEX_PDF = b'%PDF\-(?:(?!%PDF\-).)*%%EOF' pdfDocuments = re.findall(REGEX_PDF, fileContent, re.DOTALL)
正则逻辑说明
%PDF\-:匹配单个PDF的起始标记(?:(?!%PDF\-).)*:非捕获组,每匹配一个字符前都会校验下一个位置是否为%PDF-起始标记,若出现则立刻停止匹配,严格将匹配范围限制在当前PDF的起始标记到下一个PDF的起始标记之间%%EOF:匹配PDF结束标记,因为匹配区间已被限制,贪婪模式会自动取区间内最后一个%%EOF,完美适配带扩展的多EOF PDF结构。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

