Регулярное выражение для строки буквенно-цифровых кодов (МКБ-10) независимо от того, есть ли у нее точка в середине или нет

В настоящее время я работаю над сценарием, который создает блок/диапазон кода МКБ-10 на основе данного кода МКБ-10. Я добился некоторого прогресса для тех, у кого есть четыре или более символов, но если данный код ICD-10 является трехзначным кодом, мой код регулярного выражения не работает должным образом. Похоже, проблема связана с периодом между буквенно-цифровыми кодами. Вот мой текущий код:

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,   # if ICD-10 code is already a block code, use it as the ICD-10 range
    grepl('^([aA][0][0-9][.]*[0-9][0-9]*)+$', icd10_codes) ~ "A00-A09.9",
    grepl('^([aA][1][5-9][.]*[0-9][0-9]*)+$', icd10_codes) ~ "A15.0-A19.9",
    grepl('^([aA][2][7][.]*[0-9][0-9]*)+$', icd10_codes) ~ "A27.0-A27.9",
    grepl('^([aA][3-4][0-9][.]*[0-9][0-9]*)+$', icd10_codes) ~ "A30-A49.9",
    grepl('^([aA][8][0-9][.]*[0-9][0-9]*)+$', icd10_codes) ~ "A80-A89"
  ))

A01.1 следует назначить A00-A09.9 (в настоящее время это работает) A00 следует назначить A00-A09.9 (в настоящее время не работает)

Надеюсь, вы сможете помочь. Спасибо!


3
74
2

Ответы:

A01.1 следует назначить A00-A09.9 (в настоящее время это работает) A00 должен быть назначен A00-A09.9 (в настоящее время не работает)

Это утверждение будет исправлено следующим регулярным выражением. Хотя цель вашего бизнеса не совсем ясна, поэтому я оставил последний + в этом регулярном выражении, как вы и хотели.

^([aA][0][0-9]([.][0-9])?[0-9]?)+$

Демо

Объяснение:

  • ([.][0-9])? гарантирует, что если . существует, за ним следует 1 цифра. Финальный ? гарантирует, что .digit не является обязательным.
  • [0-9]? — гарантирует, что последняя цифра также является необязательной.
  • Я также заменил * на ?, потому что не совсем понятно, почему вам нужен ноль или больше, если вы хотите оставить это необязательным.

Решено

В первом случае вы можете использовать ^([a-zA-Z][0-9]{2}-[a-zA-Z][0-9]{2}).

Для остальных можно использовать ^[aA][0][0-9]([.][0-9])?$

  # Identify the ICD-10 Block Codes
  df %>% mutate(icdrange = case_when(
    # if ICD-10 code is already a block code, use it as the ICD-10 range
    grepl('^([a-zA-Z][0-9]{2}-[a-zA-Z][0-9]{2})', 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][2][7]([.][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"
  ))

  icd10_codes  icdrange
1   A00-A09.9 A00-A09.9
2       A00.1 A00-A09.9
3       A01.2 A00-A09.9
4   A00-A09.9 A00-A09.9
5       A04.4 A00-A09.9
6         A00 A00-A09.9
7         A05 A00-A09.9
8   A00-A09.9 A00-A09.9
9       A03.2 A00-A09.9