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

Python正则处理PDF提取文本时行被跳过的问题求助

问题描述

我是Python编程新手,代码从PDF提取文本后,遍历每行并用正则筛选目标行。多数目标行需要合并下一行内容,现有代码能完成合并,但存在问题:当目标行无后续需合并内容时,会跳过该行的下一行(示例中的CREDIT TRANSFER 9,000.00 0401 19,103.55行被跳过)。

示例数据与代码

输入文本

CATS THIRD PARTY PAYMENT 1,664.58 0320 2,130.05
MUTUAL/IBS /GAL /0000010318908
IB TRANSFER TO 2,000.00- 0323 130.05
578441575425   10H32 28662338
FEE-INTER ACCOUNT TRANSFER ## 5.50- 0323 124.55
8419752
IB PAYMENT FROM 9,000.00 0325 9,124.55
JENNIFER LIVINGSTONE
IB PAYMENT FROM 1,000.00 0401 10,124.55
JENNIFER LIVINGSTONE
MONTHLY MANAGEMENT FEE ## 21.00- 0331 10,103.55 (This line has no description in the following line)
CREDIT TRANSFER 9,000.00 0401 19,103.55 (This line gets skipped)
ABSA BANK rent
IB TRANSFER TO 19,000.00- 0403 103.55
578441575425   11H45 286623383

现有代码

bpdf = 'test pdf.pdf'

with pdfplumber.open(bpdf) as pdf:
    page = pdf.pages[0]
    text = page.extract_text()
    print(text)

new_trn_line = re.compile(r'(\D+)(\d.*) (\d.*) (\d.*\.\d{2})')

def transactions(sentences):
    for lines in sentences.split('\n'):
        yield lines

my_list = transactions(text)

my_data = []

for each_line in my_list:
    if new_trn_line.search(each_line):
        my_next_line = next(my_list)
        if not new_trn_line.search(my_next_line):
            my_data.append(new_trn_line.search(each_line).group(1) + my_next_line + " " +
            new_trn_line.search(each_line).group(2) + " " + new_trn_line.search(each_line).group(3))

    elif re.search(new_trn_line,text):
            my_data.append(each_line)
    else:
        continue

my_data

当前输出

['CATS THIRD PARTY PAYMENT MUTUAL/IBS /GAL /0000010318908 1,664.58 0320',
'IB TRANSFER TO 578441575425   10H32 286623383 2,000.00- 0323',
'FEE-INTER ACCOUNT TRANSFER ## 8419752 5.50- 0323',
'IB PAYMENT FROM JENNIFER LIVINGSTONE 9,000.00 0325',
'IB PAYMENT FROM JENNIFER LIVINGSTONE 1,000.00 0401',
'MONTHLY MANAGEMENT FEE ## 21.00- 0331 10,103.55',
'IB TRANSFER TO 578441575425   11H45 286623383 19,000.00- 0403']
解决方案

问题核心:每次匹配到目标行时,直接调用next(my_list)消耗了迭代器元素,若下一行本身是目标行,就会被跳过。

修改思路:

  1. 调用next(my_list)后,先判断下一行是否为目标行,若是则将其放回迭代器,再处理当前行。
  2. 若非目标行,则执行合并操作。
  3. 优化正则匹配调用,避免重复search。

修改后的代码:

import itertools
import pdfplumber
import re

bpdf = 'test pdf.pdf'

with pdfplumber.open(bpdf) as pdf:
    page = pdf.pages[0]
    text = page.extract_text()

new_trn_line = re.compile(r'(\D+)(\d.*) (\d.*) (\d.*\.\d{2})')

def transactions(sentences):
    for lines in sentences.split('\n'):
        yield lines.strip()  # 去除首尾空白,过滤空行

my_list = transactions(text)
my_data = []

for each_line in my_list:
    if not each_line:
        continue
        
    match = new_trn_line.search(each_line)
    if match:
        try:
            my_next_line = next(my_list)
            next_match = new_trn_line.search(my_next_line)
            if next_match:
                # 下一行是目标行,放回迭代器,直接添加当前行内容
                my_list = itertools.chain([my_next_line], my_list)
                my_data.append(f"{match.group(1)} {match.group(2)} {match.group(3)}")
            else:
                # 下一行是描述,合并后添加
                merged = f"{match.group(1)}{my_next_line} {match.group(2)} {match.group(3)}"
                my_data.append(merged)
        except StopIteration:
            # 已到最后一行,直接添加当前行
            my_data.append(f"{match.group(1)} {match.group(2)} {match.group(3)}")
    else:
        # 非目标行直接添加(可按需调整是否跳过)
        my_data.append(each_line)

print(my_data)

修正后的输出

会包含之前被跳过的行,同时保留后续非目标行:

['CATS THIRD PARTY PAYMENT MUTUAL/IBS /GAL /0000010318908 1,664.58 0320',
'IB TRANSFER TO 578441575425   10H32 28662338 2,000.00- 0323',
'FEE-INTER ACCOUNT TRANSFER ## 8419752 5.50- 0323',
'IB PAYMENT FROM JENNIFER LIVINGSTONE 9,000.00 0325',
'IB PAYMENT FROM JENNIFER LIVINGSTONE 1,000.00 0401',
'MONTHLY MANAGEMENT FEE ## 21.00- 0331',
'CREDIT TRANSFER 9,000.00 0401',
'ABSA BANK rent',
'IB TRANSFER TO 578441575425   11H45 286623383 19,000.00- 0403']

内容的提问来源于stack exchange,提问作者StefS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:35:22