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"
)は、ケースバイケースでしょう。
私が関わった案件では単純に連結してしまいましたが、リストのほうが扱いやすいケースもある筈です。