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

Python正则提取doc分包商数据:捕获非ITEMS开头内容需求

改进非ITEMS开头工作内容的提取方案

一、先明确文本结构规律

先把导入的doc文本拆成行,观察STRIPING (PARTIAL)这类非ITEMS开头的工作内容的上下文:比如它们是不是和ITEMS条目处于同一区块?有没有固定的位置(比如紧跟bidder-id之后、分包商数量之前)?有没有统一的格式(比如全大写、带括号、前面可能有编号)?搞清楚这些能让后续提取更精准。

二、文本拆分+多规则匹配的方案

1. 文本预处理拆分

先把整个文本按换行符\n拆成行列表,过滤掉空行和无关的页眉页脚、备注行:

# 假设text是读取到的doc文本内容
lines = [line.strip() for line in text.split('\n') if line.strip()]

2. 双轨匹配逻辑

保留原有匹配ITEMS开头条目的正则,同时新增针对非ITEMS开头内容的匹配规则:

  • 如果目标内容都是全大写+可选括号的格式,用这个正则:^[A-Z\s\(\)]+$
  • 如果内容带编号(比如1. STRIPING (PARTIAL)),用增强版正则:^(?:\d+\.\s)?[A-Z]+(?:\s[A-Z\(\)])*$

3. 按位置范围提取(如果有固定位置关联)

如果非ITEMS内容和bidder-id、分包商数量有固定的位置关系(比如在两者之间),直接通过行索引范围提取:

import re
import pandas as pd

# 定位bidder-id所在行的索引
bidder_idx = next(i for i, line in enumerate(lines) if re.search(r'bidder-id:\s*\d+', line))
# 定位number_subcontractors所在行的索引
subcon_idx = next(i for i, line in enumerate(lines) if re.search(r'number_subcontractors:\s*\d+', line))

# 提取两者之间的所有行作为候选
items_candidates = lines[bidder_idx+1 : subcon_idx]
# 用双规则过滤出有效工作内容
items = []
for line in items_candidates:
    if line.startswith('ITEMS') or re.match(r'^[A-Z\s\(\)]+$', line):
        items.append(line)

三、整合到Pandas数据集

把捕获到的所有内容合并,构建目标数据集:

# 提取bidder-id和number_subcontractors的值
bidder_id = re.search(r'bidder-id:\s*(\d+)', text).group(1)
subcon_num = re.search(r'number_subcontractors:\s*(\d+)', text).group(1)

# 构建DataFrame
df = pd.DataFrame({
    'bidder-id': [bidder_id],
    'number_subcontractors': [subcon_num],
    'items': [items]
})

四、后续优化建议

  • 可以根据实际文本的格式调整正则,比如如果工作内容里有小写单词,就把正则里的[A-Z]改成[A-Za-z]
  • 如果有重复内容,记得加items = list(dict.fromkeys(items))去重(保留原始顺序)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:25:23