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
原代码问题分析
- 未定义
_RegExLib类:代码调用了不存在的_RegExLib,正则匹配方式完全错误,应直接使用re模块的search/findall方法。 - 正则变量误用:构建字典时直接赋值正则表达式字符串,而非匹配到的实际内容。
- 数据结构逻辑混乱:初始
data是列表,却用DataFrame的索引赋值操作,完全不符合逻辑。 - 循环读取逻辑错误:混用
email_content参数和file.readline(),参数应为完整文本内容,而非文件对象,循环流程完全错误。 - 正则适配性差:未处理产品行的换行截断问题,电话号码中的空格也无法匹配。
修正后的解析代码
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)
代码说明
- 块级匹配:用
block_pattern一次性匹配每个品牌对应的完整区块,re.DOTALL允许正则跨多行匹配,确保捕捉所有关联信息。 - 产品行解析:单独用
product_line_pattern提取产品核心信息,忽略末尾不完整的描述文本。 - 数据收集:先提取品牌、搜索方等公共信息,再逐个处理产品行,将每条产品数据整理为字典存入列表,最终转为DataFrame。
- 兼容文本特点:处理了空行、换行截断问题,支持带空格的电话号码提取。
内容的提问来源于stack exchange,提问作者Sanjeet Kumar
相关产品推荐
相关产品推荐

