DPCデータの分析とかやるブログ

DPCデータの分析なんかをテキトーにやってます。

ICD10を正規表現でパースする

またもやお久しぶりとなってしまいました… さて、今回のお題はICD10のパースです。以前、「I20$のような、I200~209を指定するケースはどうしよう?」という問題を記事にしました。その時は、ゴリ押しでI200~I209までを連番生成して済ませてます。
が、今回(実際にあった話ですが)、「I20$もしくは、I50$もしくは、I1$のどれかに当てはまる疾患を探してね!」という案件が参りました。うーん、どうしたもんでしょうか。

正規表現を使わざるを得ないとき

問題に直面したとき、ある人々はこう考える……「そうか、正規表現を使うんだ!」そして問題が2つに増える

インターネットには賢者の箴言がありますが、そうも言っていられません。
上記のような問題に出くわしたとき、正規表現ではI20[0-9]|I50[0-9]|I1[0-9]のように表記します。 |はor条件を意味しており、[0-9]は0から9の数字に当てはまるもの、という意味です。 上記ですと、正に「I20$もしくは、I50$もしくは、I1$のどれか」という分けですね。 まあ、実際にはI500だけではなく、I5000にも当てはまっちゃうので、本当にそれでいいのかと言われるとアレですが…(この辺は、ICDのコード体系におんぶに抱っこしてます)

例としてPythonで書くとこんな感じですね。

import re
pattern = r"I20[0-9]|I50[0-9]|I1[0-9]"
re.findall(pattern,"I209,I11,I300")

out: ['I209,'I11']

実務でICD10の抽出をするときは、患者単位であることが殆どです。
その場合、患者別にICDのリストを作るのか(例:['I209','I11','I300'])、複数のICDを連結して文字列にしてしまうか(例:"I209,I11,I300")は、ケースバイケースでしょう。
私が関わった案件では単純に連結してしまいましたが、リストのほうが扱いやすいケースもある筈です。