基于.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
相关产品推荐
相关产品推荐

