You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中基于条件构建列表迭代逻辑实现PDF章节数据提取

整体实现逻辑设计

先点出你现有框架的核心问题

你现在写的for循环套if判断再内嵌while的结构,最容易卡的点是:匹配到目标章节标题后,要是直接把后续行的遍历控制权交给while循环,必须手动维护遍历的位置游标,不然十有八九会出现重复处理当前行、漏读内容、跳不过下一章节的问题。结合你明确知道的「章节正文是9pt字、下一章节标题是18pt字」的条件,有两种实际跑通的写法,按需选就行。

第一种:状态标记法(最省事,基本不会出bug)

这种方法完全不用手动算列表索引,靠个布尔值标记当前是不是在要提取的章节区间里,新手用最不容易踩坑。

  • 先定义两个和当前页同生命周期的变量:
    • is_in_target_section = False:默认标记现在不在目标章节的提取范围内
  • 逐行遍历page列表的时候按这个逻辑判断:
    1. 碰到你已经写好正则能匹配到的目标章节标题,直接把is_in_target_section改成True,跳过这行(毕竟标题本身不是要抓的姓名和日期),直接处理下一行
    2. 如果当前状态是is_in_target_section = True:
      • 先看当前行的字体属性:要是检测到是18pt的字体,说明已经走到下一个章节的标题了,立刻把is_in_target_section改回False,跳过这行的提取
      • 要是当前行是9pt的字体,直接拿你已经熟的正则从行文本里抠姓名、日期,扔到结果列表里就行

这种写法的好处是:哪怕目标章节中间夹了排版带来的空行、分割线、零散的备注小字,只要没碰到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 02:54:05