ICD-10代码正则匹配问题:3字符代码无法正确分配代码范围
解决ICD-10 3字符代码的正则匹配问题
你的问题出在正则表达式强制要求小数点后必须有数字,导致3字符的ICD-10代码(比如A00)无法匹配。下面是修改后的方案:
问题分析
以匹配A00-A09.9范围的正则为例,原表达式^([aA][0][0-9][.]*[0-9][0-9]*)+$中,[.]*[0-9][0-9]*这部分要求小数点后至少有一个数字,而A00这类3字符代码没有后续数字,自然匹配失败。
修改后的代码
把每个正则里的小数点+数字部分改成可选结构,即允许代码只有3字符,或者3字符加小数点+任意长度数字:
library(dplyr) icd10 <- data.frame( stringsAsFactors = FALSE, check.names = FALSE, `icd10_codes` = c("A00-A09.9","A00.1","A01.2","A00-A09.9","A04.4", "A00","A05","A00-A09.9","A03.2")) %>% # Identify the ICD-10 Block Codes mutate(icdrange = case_when( grepl('^[a-zA-Z0-9]+-[a-zA-Z0-9.]+$', icd10_codes) ~ icd10_codes, # 匹配已有的范围代码 grepl('^[aA]0[0-9](\\.[0-9]+)?$', icd10_codes) ~ "A00-A09.9", grepl('^[aA]1[5-9](\\.[0-9]+)?$', icd10_codes) ~ "A15.0-A19.9", grepl('^[aA]27(\\.[0-9]+)?$', icd10_codes) ~ "A27.0-A27.9", grepl('^[aA][3-4][0-9](\\.[0-9]+)?$', icd10_codes) ~ "A30-A49.9", grepl('^[aA]8[0-9](\\.[0-9]+)?$', icd10_codes) ~ "A80-A89" ))
关键修改点
- 每个匹配单个ICD代码的正则都添加了
(\\.[0-9]+)?:\\.匹配小数点[0-9]+匹配至少一个数字?让整个小数点+数字部分变成可选(可以有,也可以没有)
- 同时优化了第一个匹配范围代码的正则,改成
^[a-zA-Z0-9]+-[a-zA-Z0-9.]+$,更准确匹配带小数点的范围(比如A00-A09.9)
测试后,你的数据里A00、A05都会正确分配到A00-A09.9范围,其他4字符及以上代码的匹配逻辑保持不变。
内容的提问来源于stack exchange,提问作者maikelsabido
相关产品推荐
相关产品推荐

