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

如何解析非结构化COMMENTS字段提取SERIAL_NO与EXP_DATE并结构化?

解析非结构化COMMENTS字段并合并为结构化表格的方案

核心思路

  1. 精准匹配提取:利用正则表达式定位COMMENTS中符合1个字母+6位数字格式的SERIAL_NO,以及对应的EXP_DATE(需根据实际日期格式调整正则)
  2. 拆分多行:将单条原记录中提取出的多组SERIAL_NO+EXP_DATE拆分为独立行
  3. 合并整合:将原表的基础字段(OPER_KEY、TIME_STAMP)与提取出的结构化数据合并,同时保留原表自身的SERIAL_NO和EXP_DATE行

方案1:Python Pandas 实现

适合数据量中等、需要灵活处理的场景,代码示例:

import pandas as pd
import re

# 加载原表数据(示例数据)
df = pd.DataFrame({
    "OPER_KEY": ["OP001", "OP002"],
    "TIME_STAMP": ["2024-05-20 10:00:00", "2024-05-21 14:30:00"],
    "SERIAL_NO": ["A123456", "B654321"],
    "EXP_DATE": ["2025-05-20", "2025-05-21"],
    "COMMENTS": ["额外序列号:X789012,有效期2026-06-01;还有Y112233(2027-07-01)", "备注:Z445566 到期日2028-08-01"]
})

# 定义正则:匹配序列号(1字母+6数字)和对应日期(YYYY-MM-DD格式,可按需修改)
pattern = r'([A-Za-z]\d{6}).*?(\d{4}-\d{2}-\d{2})'

# 提取所有匹配组并转为结构化数据
extracted = df['COMMENTS'].str.extractall(pattern).reset_index()
extracted.columns = ['原记录索引', '匹配序号', 'SERIAL_NO', 'EXP_DATE']

# 合并原表基础字段
extracted_merged = pd.merge(
    extracted,
    df[['OPER_KEY', 'TIME_STAMP']],
    left_on='原记录索引',
    right_index=True
)[['OPER_KEY', 'TIME_STAMP', 'SERIAL_NO', 'EXP_DATE']]

# 合并原表自身数据与提取数据,生成最终表
final_df = pd.concat([
    df[['OPER_KEY', 'TIME_STAMP', 'SERIAL_NO', 'EXP_DATE']],
    extracted_merged
]).reset_index(drop=True)

print(final_df)

注:如果日期格式是MM/DD/YYYY或中文格式(如2026年6月1日),需修改正则的日期匹配部分,比如中文日期可用(\d{4}年\d{1,2}月\d{1,2}日),之后可通过pd.to_datetime转成标准日期格式。


方案2:SQL 实现(以PostgreSQL为例)

适合直接在数据库中处理大表的场景,SQL示例:

-- 假设原表名为original_table
WITH extracted_data AS (
    SELECT
        oper_key,
        time_stamp,
        -- 全局匹配所有符合格式的序列号和日期,返回数组集合
        regexp_matches(comments, '([A-Za-z]\d{6}).*?(\d{4}-\d{2}-\d{2})', 'g') AS match_groups
    FROM original_table
),
unnested_data AS (
    SELECT
        oper_key,
        time_stamp,
        -- 拆分数组中的序列号和日期
        match_group[1] AS serial_no,
        match_group[2] AS exp_date
    FROM extracted_data, unnest(match_groups) AS match_group
)
-- 合并原表数据与提取数据
SELECT oper_key, time_stamp, serial_no, exp_date FROM original_table
UNION ALL
SELECT oper_key, time_stamp, serial_no, exp_date FROM unnested_data;

注:不同SQL方言的正则函数不同:

  • MySQL需用REGEXP_SUBSTR结合递归CTE实现多组提取
  • Oracle可通过REGEXP_REPLACE配合CONNECT BY拆分多组匹配结果

关键注意事项

  • 正则适配:必须根据COMMENTS的实际文本特征调整正则,比如序列号字母大小写固定、日期格式多样等,避免漏提或错提
  • 数据校验:提取后筛选出匹配失败的记录(如COMMENTS为空或无符合格式的数据),进行人工补全
  • 性能优化:数据量较大时,先过滤掉无有效信息的COMMENTS记录,再执行正则提取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:40:35