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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:05:42