在Stata中提取字符串数字左侧字符的方法:药物名称标准化需求
Stata药物名称标准化:提取剂量前的名称部分
针对你提到的两种提取需求,以下是具体的Stata实现方案:
需求1:提取到独立剂量数值(整数/百分比/范围)之前的名称
核心是区分名称中带数字的词(如12HR)和独立的剂量数值(如120、0.65%、50-25),只截断到独立剂量数值之前的内容。
实现代码
* 生成新变量存储提取结果 gen new_name = "" * 匹配带后续内容的剂量数值(如"3 COMBO PACK") replace new_name = regexs(1) if regexm(drug_name, "^(.+?)\s+(?:\d+(?:\.\d+)?(?:-\d+(?:\.\d+)?)*%?)\s") * 匹配位于字符串末尾的剂量数值(如无后续内容的情况) replace new_name = regexs(1) if regexm(drug_name, "^(.+?)\s+(?:\d+(?:\.\d+)?(?:-\d+(?:\.\d+)?)*%?)$") * 查看结果 list drug_name new_name
正则逻辑说明
^(.+?):非贪婪匹配从字符串开头到目标模式前的所有内容,确保只截取到第一个剂量数值之前的部分\s+:匹配剂量数值前的空格分隔符(?:\d+(?:\.\d+)?(?:-\d+(?:\.\d+)?)*%?):匹配各类剂量格式,包括整数、小数、数值范围、百分比(非捕获组,仅用于匹配)\s/$:匹配剂量数值后的空格或字符串结尾,确保是独立的剂量词
预期结果
| drug_name | new_name |
|---|---|
| SM MICONAZOLE 3 COMBO PACK | SM MICONAZOLE |
| SM SALINE 0.65% NASAL SPRAY | SM SALINE |
| SM SINUS 12HR 120 MG CAPLET | SM SINUS 12HR |
| SM MOTION SICKNESS 25 MG TAB | SM MOTION SICKNESS |
| ATENOLOL-CHLORTHAL 50-25 TB | ATENOLOL-CHLORTHAL |
| OXYMORPHONE HCL 10 MG TABLET | OXYMORPHONE HCL |
| D-AMPHETAMINE ER 10 MG CAPSULE | D-AMPHETAMINE ER |
| LISINOPRIL-HYDROCHLOROTHIAZIDE 20-25 MG TAB | LISINOPRIL-HYDROCHLOROTHIAZIDE |
| SOD SULFACE-SULF 9.8-4.8% CLSR | SOD SULFACE-SULF |
需求2:忽略名称中所有含数字的词,提取纯文字名称
如果需要完全剔除任何包含数字的词(如12HR),只保留纯文字组成的名称部分,可以用以下方法:
实现代码
* 直接替换掉第一个含数字的词及后续所有内容 gen new_name_no_num = regexr(drug_name, "\s+\w*\d\w*.*$", "") * 查看结果 list drug_name new_name_no_num
正则逻辑说明
\s+\w*\d\w*:匹配第一个包含数字的词(前面带空格分隔).*$:匹配该词之后的所有内容- 替换为空字符串后,即得到纯文字组成的前缀名称
预期结果
| drug_name | new_name |
|---|---|
| SM SINUS 12HR 120 MG CAPLET | SM SINUS |
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

