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

如何用正则表达式按空行拆分投标信息字符串?

按空行拆分投标字符串及生成数据集方案

一、仅按空行拆分字符串的正确写法

你之前用的[\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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:45:29