使用Python正则表达式提取Word文档表格数据的问题求助
表格数据提取可行方案
针对你遇到的.doc转文本后描述换行、带(F)标记的表格提取问题,以下是几个实操性强的解决思路:
1. 预处理文本+正则分组优化
先做文本清洗,再调整正则逻辑精准捕获字段:
- 预处理步骤:
- 合并描述内部换行:识别哪些换行属于同一条目(换行后无
item_number/item_code的开头特征),将这类换行替换为空格。 - 统一处理(F)标记:先标记所有带(F)的行,后续分组时将其作为可选字段,或单独提取为标识列。
- 合并描述内部换行:识别哪些换行属于同一条目(换行后无
- 正则优化示例:
假设文本结构如下:
用多行模式正则匹配,捕获条目直到下一个条目开头或文本结束:1 ABC123 这是一段描述 内容被拆分成了两行(F) 2 DEF456 正常的描述行import re pattern = re.compile(r'(\d+)\s+([A-Z0-9]+)\s+(.*?)(?=\n\d+\s+[A-Z0-9]+|\Z)', re.DOTALL) matches = pattern.findall(processed_text) # 后续可对每个match中的description做(F)标记的清洗或保留re.DOTALL让.匹配换行符,(?=\n\d+\s+[A-Z0-9]+|\Z)是正向预查,用来界定单个条目的结束位置。
2. 预处理文本修复pandas read_fwf的数据遗漏问题
read_fwf遗漏数据多是换行导致的字段错位,先合并错位行再读取:
import pandas as pd # 读取原始文本行 with open('table.txt', 'r', encoding='utf-8') as f: lines = f.read().splitlines() processed_lines = [] current_line = '' for line in lines: # 假设item_number以数字开头,判断是否为新条目行 if line.strip().startswith(tuple(str(i) for i in range(10))): if current_line: processed_lines.append(current_line) current_line = line.strip() else: # 将换行的描述内容合并到当前条目 current_line += ' ' + line.strip() # 加入最后一条条目 if current_line: processed_lines.append(current_line) # 用read_fwf读取处理后的文本,colspecs根据实际字段宽度调整 df = pd.read_fwf(pd.compat.StringIO('\n'.join(processed_lines)), colspecs=[(0,5), (6,15), (16, None)], names=['item_number', 'item_code', 'description']) # 处理(F)标记 df['has_F_flag'] = df['description'].str.contains(r'\(F\)') df['description'] = df['description'].str.replace(r'\(F\)', '', regex=True).str.strip()
3. 直接从.doc文件提取表格(最推荐)
绕开文本转换环节,直接读取.doc内的原始表格结构:
from docx import Document doc = Document('your_table.docx') table = doc.tables[0] # 假设目标表格是文档中第一个表格 # 提取表头和行数据 headers = [cell.text.strip() for cell in table.rows[0].cells] data = [] for row in table.rows[1:]: row_data = [cell.text.strip() for cell in row.cells] data.append(row_data) df = pd.DataFrame(data, columns=headers)
这种方法完全避免了文本转换带来的换行拆分、标记错位问题,能直接获取完整的表格结构。
内容的提问来源于stack exchange,提问作者Pepa
相关产品推荐
相关产品推荐

