如何匹配数字与点组成的序列?正则提取PDF内容匹配错误如何解决
问题原因
- 正则语法错误:
.在正则中是通配符,可匹配任意非换行字符,你没有对需要匹配的字面量小数点做转义,写的.{0,1}会匹配任意单个字符,而非你预期的可选小数点。 - 变量名大小写不匹配:你定义存储提取文本的变量为
textPage,但re.search中调用的是小写的textpage,Python大小写敏感,这里存在明显的语法错误。 - 匹配逻辑不符合需求:
re.search默认返回全文中第一个符合规则的匹配结果,你提取的PDF文本开头就是93,刚好适配你当前的错误正则,所以优先返回了93而非你想要的1.5.4。 - 规则不严谨:你需要匹配的是多段用小数点连接的数字序列,现有规则没有限定小数点必须出现在数字之间,也没有排除单独数字的匹配场景。
解决方法
首先修正正则表达式,要匹配x.y.z这类多级数字编号,可使用规则\d{1,2}(?:\.\d{1,2})+:其中\d{1,2}匹配1-2位开头数字,(?:\.\d{1,2})+是非捕获组,匹配一个或多个「小数点+1-2位数字」的组合,既符合你要的编号格式,也不会误匹配单独的页码数字。
同时修正变量名大小写问题,添加匹配结果判空逻辑避免报错,修正后代码如下:
import PyPDF2 import re import sys if __name__ == '__main__': pdf_file = open('RH5-94.pdf','rb') read_pdf = PyPDF2.PdfFileReader(pdf_file) number_of_pages = read_pdf.getNumPages() # 修正后的正则,匹配至少有一级分隔的多级数字编号 IdCis = r"\d{1,2}(?:\.\d{1,2})+" Description = "(?<=Description:)(.*)(?=Rationale)" Rationale = "(?<=Rationale:)(.*)(?=Audit)" textPage = read_pdf.getPage(0).extractText() match_res = re.search(IdCis, textPage) if match_res: print(match_res.group(0))
内容的提问来源于stack exchange,提问作者Hasunohana
相关产品推荐
相关产品推荐

