正则表达式排除*前缀6位大写字母模式,提取抗菌药物数据问题
修正R语言正则提取抗菌药物数据的问题
问题根源
原正则(?<!\\*)[A-Z]{3}无法排除*ESCCOL中的SCC,因为SCC的前一个字符是E而非*,负向回溯仅检查紧邻的前一个字符,而非整个字符串是否以*开头。我们需要精准匹配后跟药敏标识(R/S/I等)的3位抗菌药物编码,同时排除菌株编码里的无关字母组合。
修正后的代码
library(tidyverse) df <- tibble( sample_date_time = as_datetime("2021-01-01 03:00:00"), sample_no = "BC11001", result_text = "[<*ESCCOL/2/I /AMPR/>=32/AUGR/16/>]" ) df %>% separate_longer_delim(result_text, delim = "/") %>% mutate( # 提取*开头的6位菌株编码 org = str_extract(result_text, "(?<=\\*)[A-Z]{6}"), # 仅提取后跟药敏标识的3位抗菌药物编码 antimicrobial = str_extract(result_text, "[A-Z]{3}(?=[RSIPNrsipn])"), # 提取对应的药敏结果并统一转为大写 sens = str_extract(result_text, "(?<=[A-Z]{3})[RSIPNrsipn]") %>% str_to_upper() )
关键调整说明
- 菌株编码提取:使用
(?<=\\*)[A-Z]{6}正向回溯断言,精准匹配*之后的6位大写字母,无需分组提取。 - 抗菌药物编码提取:用
[A-Z]{3}(?=[RSIPNrsipn])正向先行断言,仅匹配后面紧跟药敏标识的3位大写字母,彻底排除菌株编码中的无关字母组合。 - 药敏结果提取:用
(?<=[A-Z]{3})[RSIPNrsipn]正向回溯断言提取3位药物编码后的药敏标识,再通过str_to_upper()统一格式。
修正后输出示例
| sample_date_time | sample_no | result_text | org | antimicrobial | sens |
|---|---|---|---|---|---|
| 2021-01-01 03:00:00 | BC11001 | [<*ESCCOL | ESCCOL | NA | NA |
| 2021-01-01 03:00:00 | BC11001 | 2 | NA | NA | NA |
| 2021-01-01 03:00:00 | BC11001 | I | NA | NA | NA |
| 2021-01-01 03:00:00 | BC11001 | AMPR | NA | AMP | R |
| 2021-01-01 03:00:00 | BC11001 | >=32 | NA | NA | NA |
| 2021-01-01 03:00:00 | BC11001 | AUGR | NA | AUG | R |
| 2021-01-01 03:00:00 | BC11001 | 16 | NA | NA | NA |
| 2021-01-01 03:00:00 | BC11001 | >] | NA | NA | NA |
内容的提问来源于stack exchange,提问作者Ollie
相关产品推荐
相关产品推荐

