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

基于.doc文档文本提取投标人分包商数据的正则实现需求

解决方案:按投标人ID拆分文本的实现思路

核心思路是抓住文本里投标人ID的固定起始标识,以此为分割点拆分整个文本,再逐一处理每个投标人的信息块。

步骤1:读取并预处理文档文本

先把docx里的文本提取出来,同时清理掉多余空行,避免后续拆分出无效内容:

from docx import Document
import re

# 读取目标docx文档
doc = Document("bidders.docx")
# 提取非空段落的文本并去除首尾空格
full_text = "\n".join([para.text.strip() for para in doc.paragraphs if para.text.strip()])

步骤2:按投标人ID拆分独立文本块

用正则匹配并拆分所有以投标人ID开头的内容块,确保每个块对应一个投标人的完整信息:

# 以"投标人ID: "作为拆分标识(如果是英文文本就换成"Bidder ID: ")
split_pattern = r"(投标人ID: )"
# 拆分时保留标识本身,方便后续重组
parts = re.split(split_pattern, full_text)

# 重组拆分后的内容,得到每个投标人的独立文本块
bidder_blocks = []
for i in range(1, len(parts), 2):
    bidder_id_prefix = parts[i]
    bidder_content = parts[i+1]
    full_bidder_text = f"{bidder_id_prefix}{bidder_content}"
    bidder_blocks.append(full_bidder_text)

步骤3:从拆分块提取目标数据

拿到每个投标人的文本块后,用正则提取对应字段,组装成目标数据集:

dataset = []
for block in bidder_blocks:
    # 提取bidder-id
    bidder_id_match = re.search(r"投标人ID: (\S+)", block)
    bidder_id = bidder_id_match.group(1) if bidder_id_match else None
    
    # 提取分包商数量
    sub_count_match = re.search(r"分包商数量: (\d+)", block)
    sub_count = int(sub_count_match.group(1)) if sub_count_match else 0
    
    # 提取项目编号列表
    items_match = re.search(r"项目编号: (.+)", block)
    items = [item.strip() for item in items_match.group(1).split(",")] if items_match else []
    
    dataset.append({
        "bidder-id": bidder_id,
        "number_subcontractors": sub_count,
        "items": items
    })

# 输出最终数据集
print(dataset)

注意事项

  • 如果文本里的标识和示例不同(比如分包商数量写成"分包商数: "),要同步调整正则里的匹配字符串
  • 若文本格式有特殊排版(比如投标人信息块之间有横线分隔),可以把分隔符加入拆分逻辑,进一步提升准确性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:22:07