Python正则表达式提取药品信息描述字段的技术求助
正则表达式解决方案
核心匹配逻辑
要实现从7位数字后提取描述,直到T/N/G/M前的空格,这里提供两种实用方案:
方案1:仅提取描述内容
这个正则用正向预查精准定位终止位置,支持描述里包含空格、数字等任意字符:
description_re = re.compile(r'\d{7}\s+(.*?)\s+(?=[TNGM])')
\d{7}:锁定7位数字开头的位置\s+:匹配数字后的任意空格(避免单个空格的限制)(.*?):非贪婪模式捕获描述内容,不会过度匹配到后面的批号(?=[TNGM]):正向预查,确保捕获截止到T/N/G/M前的空格,不会把批号字符包含进来
方案2:同时提取描述和批号(可选保留批号)
如果需要把批号也一起提取,用分组捕获即可:
info_re = re.compile(r'\d{7}\s+(.*?)\s+([TNGM].*)')
- 第一个分组
(.*?)是你要的描述内容 - 第二个分组
([TNGM].*)是从T/N/G/M开始的完整批号信息
示例代码(转成DataFrame)
假设你的药品列表是这种格式:
import re import pandas as pd drug_list = [ "1234567 Paracetamol 500mg T12345", "9876542 Ibuprofen 200mg N67890", "4567891 Aspirin 100mg G01234" ] # 仅提取描述 descriptions = [] for item in drug_list: match = description_re.search(item) if match: descriptions.append(match.group(1)) df_desc = pd.DataFrame({"药品描述": descriptions}) # 同时提取描述和批号 drug_data = [] for item in drug_list: match = info_re.search(item) if match: drug_data.append({ "药品描述": match.group(1), "批号": match.group(2) }) df_full = pd.DataFrame(drug_data)
你的原正则失效原因
你写的r'\d{7}\s[A-Za-z]+\s[TNGM]$'有三个关键问题:
[A-Za-z]+只能匹配连续纯字母,没法处理带空格、数字的描述(比如Paracetamol 500mg)$强制要求字符串必须以T/N/G/M结尾,实际数据里批号后面可能还有其他内容- 没有用非贪婪匹配,容易把不该包含的内容也匹配进去
内容的提问来源于stack exchange,提问作者foliveir
相关产品推荐
相关产品推荐

