如何从表格XML列中提取所有被<form_id>包裹的SAP开头字符串?
提取XML列中<form_id>标签内的SAP开头字符串并生成逗号分隔列
以下针对不同常用场景提供解决方案:
一、SQL数据库场景
1. MySQL 8.0+ 实现
利用递归CTE遍历所有匹配项,再通过聚合函数拼接结果:
WITH RECURSIVE extract_form_ids AS ( SELECT id, -- 替换为你的表格主键字段 xml_column, REGEXP_SUBSTR(xml_column, '<form_id>(SAP-[A-Z0-9-]+)</form_id>', 1, 1, 'c', 1) AS form_id, 1 AS match_num FROM your_table -- 替换为你的表名 UNION ALL SELECT id, xml_column, REGEXP_SUBSTR(xml_column, '<form_id>(SAP-[A-Z0-9-]+)</form_id>', 1, match_num + 1, 'c', 1) AS form_id, match_num + 1 FROM extract_form_ids WHERE form_id IS NOT NULL ) SELECT id, GROUP_CONCAT(form_id SEPARATOR ', ') AS extracted_form_ids FROM extract_form_ids WHERE form_id IS NOT NULL GROUP BY id;
2. PostgreSQL 实现
借助全局匹配正则函数提取所有结果,再拼接成字符串:
SELECT id, -- 替换为你的表格主键字段 string_agg(match[1], ', ') AS extracted_form_ids FROM your_table, -- 替换为你的表名 regexp_matches(xml_column, '<form_id>(SAP-[A-Z0-9-]+)</form_id>', 'g') AS match GROUP BY id;
二、Python Pandas 场景
针对DataFrame格式的表格数据,用字符串提取和分组聚合实现:
import pandas as pd # 假设你的数据框为df,存储XML的列名为xml_column df['extracted_form_ids'] = df['xml_column'].str.extractall(r'<form_id>(SAP-[A-Z0-9-]+)</form_id>') \ .groupby(level=0)[0].apply(lambda x: ', '.join(x)) # 查看处理后的结果 print(df[['xml_column', 'extracted_form_ids']])
正则表达式说明
核心匹配规则 <form_id>(SAP-[A-Z0-9-]+)</form_id>:
<form_id>/</form_id>:精准匹配目标字符串的包裹标签(SAP-[A-Z0-9-]+):捕获以大写SAP开头,后续由大写字母、数字、连字符组成的完整字符串,括号用于提取有效内容分组
内容的提问来源于stack exchange,提问作者Alphin Joshua
相关产品推荐
相关产品推荐

