Python中基于条件构建列表迭代逻辑实现PDF章节数据提取
整体实现逻辑设计
先点出你现有框架的核心问题
你现在写的for循环套if判断再内嵌while的结构,最容易卡的点是:匹配到目标章节标题后,要是直接把后续行的遍历控制权交给while循环,必须手动维护遍历的位置游标,不然十有八九会出现重复处理当前行、漏读内容、跳不过下一章节的问题。结合你明确知道的「章节正文是9pt字、下一章节标题是18pt字」的条件,有两种实际跑通的写法,按需选就行。
第一种:状态标记法(最省事,基本不会出bug)
这种方法完全不用手动算列表索引,靠个布尔值标记当前是不是在要提取的章节区间里,新手用最不容易踩坑。
- 先定义两个和当前页同生命周期的变量:
is_in_target_section = False:默认标记现在不在目标章节的提取范围内
- 逐行遍历page列表的时候按这个逻辑判断:
- 碰到你已经写好正则能匹配到的目标章节标题,直接把
is_in_target_section改成True,跳过这行(毕竟标题本身不是要抓的姓名和日期),直接处理下一行 - 如果当前状态是
is_in_target_section = True:- 先看当前行的字体属性:要是检测到是18pt的字体,说明已经走到下一个章节的标题了,立刻把
is_in_target_section改回False,跳过这行的提取 - 要是当前行是9pt的字体,直接拿你已经熟的正则从行文本里抠姓名、日期,扔到结果列表里就行
- 先看当前行的字体属性:要是检测到是18pt的字体,说明已经走到下一个章节的标题了,立刻把
- 碰到你已经写好正则能匹配到的目标章节标题,直接把
这种写法的好处是:哪怕目标章节中间夹了排版带来的空行、分割线、零散的备注小字,只要没碰到18pt的章节标题,就一直保持提取状态,不会漏抓内容,也不用费劲算列表的位置索引。
第二种:游标遍历法(适合需要精细控制遍历流程的场景)
如果你不想反复写章节匹配的正则,想直接靠字体大小来判断章节边界,可以直接维护一个行索引游标,全程用while循环控制遍历节奏:
# 初始化存结果的列表、记录当前读到第几行的游标 extracted_records = [] current_line_index = 0 # 预编译好你要匹配的目标章节正则 target_section_pattern = re.compile(r"^Some Section Name", re.IGNORECASE) # 用游标从头遍历整页的行 while current_line_index < len(page): current_line = page[current_line_index] # 匹配到目标章节的开头 if target_section_pattern.match(current_line.text): # 游标往后挪一行,跳过章节标题本身 current_line_index += 1 # 进入提取循环:只要没读到页尾、没碰到18pt的下章节标题,就一直处理 while current_line_index < len(page): sub_line = page[current_line_index] # 碰到18pt的行,直接跳出提取循环 if sub_line.font_size > 17: # 数值加容错,避免不同解析库的精度误差 break # 用你自己的正则提取姓名、日期,匹配不上就跳过 match_result = your_regex.search(sub_line.text.strip()) if match_result: name, date = match_result.groups() extracted_records.append((name, date)) current_line_index += 1 current_line_index += 1
实际跑的时候要注意的坑
- 别把字体大小的判断写死成绝对相等:不管用的是PyPDF2还是pdfplumber,解析出来的字体大小都会有零点几的偏差,比如实际是9pt的字,可能解析出来是8.98、9.03,判断的时候一定要加范围,比如把
font_size == 9改成8.8 < font_size < 9.2算正文,font_size > 17算章节标题,不然很容易因为精度问题抓不全内容 - 正则匹配前一定要先清洗文本:把行首尾的空格去掉,把连续的制表符、好几个连在一起的空格换成单个空格,不然PDF排版带来的字符间隔很容易让正则匹配失败
- 提取的时候加个兜底判断:如果某一行是9pt字但正则没抓到有效的姓名和日期(比如是章节里的备注、脚注),直接跳过就行,别硬存到结果列表里留脏数据
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

