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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:33:24