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

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]$'有三个关键问题:

  1. [A-Za-z]+只能匹配连续纯字母,没法处理带空格、数字的描述(比如Paracetamol 500mg)
  2. $强制要求字符串必须以T/N/G/M结尾,实际数据里批号后面可能还有其他内容
  3. 没有用非贪婪匹配,容易把不该包含的内容也匹配进去

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:32:09