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

Python文本解析求助:提取结构化文本指定字段遇问题

文本数据解析问题排查与修正

问题描述

我有一批结构化文本数据,需要解析提取以下字段:Brand(品牌)、MPN(制造商零件编号)、Condition(状态)、Qty(数量)、Price(价格)、Search by(搜索方)、Customer name(客户名称)及电话号码。

文本数据格式示例:

---ABB INSTALLATION PRODUCT---

54905BE06, NEW, qty 1687, $1.05, ABB INSTALLATION PRODUCT, *#6 1 hole
5490 Searched by: Gracile IT LLC
    Oliver Wilson P:123 456 7890
 
---ARUBA NETWORKS---

R1C72A, NEW, qty 21, $155.00, ARUBA NETWORKS, *AP mount bracketAruba
R1C72A Searched by: Synergy Associates, LLC
    N/A P:123 456 7890
 
---ATC CENTRAL SOURCING---

3X5HZYLBACKCOX, NEW, qty 353, $8.24, ATC CENTRAL SOURCING, The ATC Ce
3X Searched by: Golden Gate Communications
    Mike Sweiss P:123 456 7890
 
3X5HZYLPWRCOX, NEW, qty 353, $8.24, ATC CENTRAL SOURCING, The ATC Cen
3X Searched by: Golden Gate Communications
    Mike Sweiss P:123 456 7890
 
---CAMBIUM NETWORKS---

SFP-10G-LR, NEW, qty 360, $52.95, CAMBIUM NETWORKS, Cambium Networks
SFP-10G-LR Searched by: Diversity IT LLC
    Jeremy Place P:123 456 7890

我尝试用Python结合正则表达式提取数据,但无法完整提取目标字段,以下是我的实现代码:

import pandas as pd
import os
import re
def parse_email_content(email_content):

    # Regular expression patterns

    brand_pattern = r"---(.*?)---"

    product_pattern = r"(.*?), (.*?), qty (.*?), \$(.*?), (.*?), (.+)"

    contact_pattern = r"Searched by: (.+?)\n\s+(.+) P: (\S+)"

    data = []
    while email_content:
      reg_match = _RegExLib(email_content)

      if reg_match.brand_pattern:
        Brand = reg_match.brand_pattern.group(1)

      if reg_match.product_pattern:
        Product = reg_match.product_pattern.group(1)
        data['Product'] = data['Product'].str.split(',').str[0]

      if reg_match.contact_pattern:
        Contact_Person = reg_match.contact_pattern.group(1)

        dict_of_data = {
                        'Brand': brand_pattern,
                        'Product': product_pattern,
                        'Contact_Person': contact_pattern,
                        value_type: value
                    }
        data.append(dict_of_data)
        email_content = file.readline()

      email_content = file.readline()
    data = pd.DataFrame(data)
    data.set_index(['Brand', 'Product', 'Contact_Person'], inplace=True)
    return data

原代码问题分析

  1. 未定义_RegExLib类:代码调用了不存在的_RegExLib,正则匹配方式完全错误,应直接使用re模块的search/findall方法。
  2. 正则变量误用:构建字典时直接赋值正则表达式字符串,而非匹配到的实际内容。
  3. 数据结构逻辑混乱:初始data是列表,却用DataFrame的索引赋值操作,完全不符合逻辑。
  4. 循环读取逻辑错误:混用email_content参数和file.readline(),参数应为完整文本内容,而非文件对象,循环流程完全错误。
  5. 正则适配性差:未处理产品行的换行截断问题,电话号码中的空格也无法匹配。

修正后的解析代码

import pandas as pd
import re

def parse_email_content(email_content):
    # 匹配完整品牌区块:品牌+产品行+联系信息
    block_pattern = r"---(.*?)---\s*\n(.*?)\n(.*?)\s*Searched by: (.*?)\n\s*(.*?) P: (.*?)\s*(?=\n---|\Z)"
    # 匹配单条产品信息
    product_line_pattern = r"(.*?), (.*?), qty (\d+), \$(\d+\.\d+), .*, .+"
    
    data = []
    # 提取所有品牌区块
    brand_blocks = re.findall(block_pattern, email_content, re.DOTALL)
    
    for block in brand_blocks:
        brand = block[0].strip()
        product_lines = block[1].strip().split('\n')
        search_by = block[3].strip()
        customer_name = block[4].strip()
        phone = block[5].strip()
        
        # 处理每个产品行
        for line in product_lines:
            line = line.strip()
            if not line:
                continue
            product_match = re.match(product_line_pattern, line)
            if product_match:
                mpn = product_match.group(1).strip()
                condition = product_match.group(2).strip()
                qty = int(product_match.group(3))
                price = float(product_match.group(4))
                
                data.append({
                    'Brand': brand,
                    'MPN': mpn,
                    'Condition': condition,
                    'Qty': qty,
                    'Price': price,
                    'Search by': search_by,
                    'Customer name': customer_name,
                    'Phone': phone
                })
    
    df = pd.DataFrame(data)
    return df

# 测试示例
if __name__ == "__main__":
    with open("your_text_file.txt", "r") as f:
        content = f.read()
    result_df = parse_email_content(content)
    print(result_df)

代码说明

  1. 块级匹配:用block_pattern一次性匹配每个品牌对应的完整区块,re.DOTALL允许正则跨多行匹配,确保捕捉所有关联信息。
  2. 产品行解析:单独用product_line_pattern提取产品核心信息,忽略末尾不完整的描述文本。
  3. 数据收集:先提取品牌、搜索方等公共信息,再逐个处理产品行,将每条产品数据整理为字典存入列表,最终转为DataFrame。
  4. 兼容文本特点:处理了空行、换行截断问题,支持带空格的电话号码提取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:50:56