如何从文本列中提取符合格式规则的CVE编号
文本列CVE编号提取实现方案
匹配规则说明
需要提取的CVE编号特征如下:
- 标准主体结构为
CVE-yyyy-xxxxx,其中yyyy为4位年份,后续数字段长度为1-6位不等 - 常见干扰形式:CVE整体被半角括号
()包裹、CVE编号末尾紧跟半角冒号:,提取时需自动过滤这类无关字符 - 特殊输出要求:样例中第三条输出将CVE与年份之间的横杠替换为空格,可在提取主体后通过简单字符串替换实现
核心实现逻辑
所有场景的核心都是通过正则表达式定位CVE主体,通用匹配正则为:
CVE-\d{4}-\d{1,6}
说明:该正则直接匹配CVE固定结构的主体内容,前后的括号、尾随冒号均不在匹配范围内,无需额外写规则过滤,即可覆盖所有给出的样例场景
常用场景落地代码
1. Python Pandas 表格处理场景
适用于CSV/Excel等结构化表格数据的批量处理,代码如下:
import pandas as pd import re def extract_cve(text): if pd.isna(text): return "" match_res = re.search(r"CVE-\d{4}-\d{1,6}", str(text)) if not match_res: return "" cve_str = match_res.group() # 若需要对齐样例中的空格格式(CVE yyyy-xxxxx),打开下一行注释即可 # cve_str = cve_str.replace("CVE-", "CVE ", 1) return cve_str # 假设原始文本列名为raw_text,生成新列cve_id df["cve_id"] = df["raw_text"].apply(extract_cve)
针对给出的样例数据,运行后输出完全匹配预期:
- 输入
the vulnerability name (CVE-2019-0215)→ 输出CVE-2019-0215 - 输入
the vulnerability name (CVE-2019-0290) extra words→ 输出CVE-2019-0290 - 输入
the vulnerability name CVE-2018-23314: blah blah→ 开启替换注释后输出CVE 2018-23314
2. MySQL 数据库字段提取场景
直接使用内置正则函数提取即可:
-- 输出标准CVE格式 SELECT raw_text, REGEXP_SUBSTR(raw_text, 'CVE-[0-9]{4}-[0-9]{1,6}') AS cve_id FROM vuln_info_table; -- 输出CVE与年份间带空格的格式 SELECT raw_text, REPLACE(REGEXP_SUBSTR(raw_text, 'CVE-[0-9]{4}-[0-9]{1,6}'), 'CVE-', 'CVE ', 1) AS cve_id FROM vuln_info_table;
3. Excel/WPS 表格处理场景
支持正则函数的版本(365/2021及以上、WPS 2021及以上)可直接使用单元格函数:
// 标准格式输出 =REGEXEXTRACT(A2,"CVE-\d{4}-\d{1,6}") // 空格格式输出 =REPLACE(REGEXEXTRACT(A2,"CVE-\d{4}-\d{1,6}"),4,1," ")
扩展适配说明
- 如果单条文本包含多个CVE编号,将正则单次匹配逻辑改为全局匹配,遍历所有匹配结果即可
- 如果文本中存在全角括号(
())、全角冒号(:),现有正则依然可以正常匹配,不需要调整规则 - 提取结果默认符合MITRE官方CVE编号格式规范,空格格式为定制化需求,按需开启替换即可
内容的提问来源于stack exchange,提问作者Udit Krishna
相关产品推荐
相关产品推荐

