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)消耗了迭代器元素,若下一行本身是目标行,就会被跳过。
修改思路:
- 调用
next(my_list)后,先判断下一行是否为目标行,若是则将其放回迭代器,再处理当前行。 - 若非目标行,则执行合并操作。
- 优化正则匹配调用,避免重复
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
相关产品推荐
相关产品推荐

