如何用正则表达式按空行拆分投标信息字符串?
按空行拆分投标字符串及生成数据集方案
一、仅按空行拆分字符串的正确写法
你之前用的[\n]+会匹配任意数量的换行(包括单个换行),所以会把每一行都拆开。要精准匹配空行(即至少两个连续换行,中间可能包含空格/制表符),可以用以下正则表达式:
import re txt = "你的投标字符串内容..." # 先去除字符串首尾空白,再按空行拆分(空行允许包含空格/制表符) bid_records = re.split(r'\n\s*\n', txt.strip())
拆分后bid_records列表里就是3条独立的投标记录,每条对应一个投标者的完整信息。
二、高效生成结构化数据集的方法
拆分后可以用正则提取每条记录的字段,直接转为Pandas DataFrame:
完整代码示例
import re import pandas as pd txt = " 1 1,486,399.87 5 ORTIZ ASPHALT PAVING INC 909 386-1200 SB PREF CLAIMED 00814766 P O BOX 883 FAX 909 386-1288 COLTON CA 92324 2 1,534,243.00 3 EXCEL PAVING COMPANY 562 599-5841 SB PREF CLAIMED 00688659 2230 LEMON AVENUE FAX 562 591-7485 LONG BEACH CA 90806 3 1,593,549.40 2 SECURITY PAVING COMPANY INC 818 767-8418 CC PREF CLAIMED 00116307 P O BOX 1489 FAX 818 767-3169 SUN VALLEY CA 91353-1489" # 1. 按空行拆分记录 bid_records = re.split(r'\n\s*\n', txt.strip()) # 2. 定义正则匹配单条记录的所有字段(VERBOSE模式方便维护) record_pattern = re.compile(r""" ^\s*(\d+)\s+ # 投标编号 ([\d,]+.\d{2})\s+ # 投标金额(带千分位) (\d+)\s+ # 排名 ([A-Z\s&]+?)\s+ # 公司名称(非贪婪匹配避免过度截取) (\d{3}\s\d{3}-\d{4})\s+ # 联系电话 ([A-Z\s]+)\n # 偏好类型(如SB PREF CLAIMED) \s*(\d{8})\n # BIDDER ID(8位数字) \s*([A-Z0-9\s.]+?)\s+ # 地址第一部分 FAX\s+(\d{3}\s\d{3}-\d{4})\n # 传真号码 \s*([A-Z\s]+)\s+([A-Z]{2})\s+(\d{5}(?:-\d{4})?) # 城市、州、邮编 """, re.VERBOSE) # 3. 提取所有记录的字段并整理成字典列表 dataset = [] for record in bid_records: match_result = record_pattern.match(record) if match_result: dataset.append({ "投标编号": match_result.group(1), "投标金额": float(match_result.group(2).replace(',', '')), # 转为数值型 "排名": int(match_result.group(3)), "公司名称": match_result.group(4).strip(), "联系电话": match_result.group(5), "偏好类型": match_result.group(6).strip(), "BIDDER ID": match_result.group(7), "完整地址": f"{match_result.group(8).strip()}, {match_result.group(10).strip()}, {match_result.group(11)} {match_result.group(12)}", "传真": match_result.group(9), "州": match_result.group(11), "邮编": match_result.group(12) }) # 4. 转为Pandas DataFrame bid_df = pd.DataFrame(dataset) print(bid_df)
代码说明
- 用
re.VERBOSE模式编写正则,添加注释增强可读性,方便后续调整字段规则; - 提取时直接转换字段类型(如金额转float、排名转int),避免后续数据清洗;
- 拼接完整地址,同时保留拆分的州、邮编字段,满足不同分析需求。
内容的提问来源于stack exchange,提问作者Pepa
相关产品推荐
相关产品推荐

