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

