非プログラマーのためのインフォマティクス入門。(仮)

非プログラマーがインフォマティクスについて勉強したことを記録します。主にKNIMEというソフトを使用しています。

【KNIME】ノード紹介:Regex Split 〜文字列を分割したい part 2〜

 以前に"区切り文字(列)を指定して、文字列を分割するノード"であるcell splitterについて紹介しました。

【KNIME】ノード紹介:cell splitter 〜文字列を分割したい〜

今回は、これの第二弾です!。前回のColumn Rename (Regex)を紹介記事を書きながら、セットで紹介しようと思ったのがRegex Splitノードです。

 

Regex Split

 正規表現を活用しながら、文字列を分割するノードです。

f:id:sumtat:20170804213009p:plain

 いつかの例を紹介してみます。

 

 

質問者Aさん:データをもらったんだけど、不等号や単位が同じセルに入ってて困るんだけど…。どうしたらいいでしょう?(質問者なんていません…。架空です…。)

f:id:sumtat:20170804213507p:plain

回答例)

そうですね。cell splitterを使おうとしても「指定できる区切り文字(列)」がないですね。そんなときはRegex splitを使いましょう!

f:id:sumtat:20170804214055p:plain

Patternとして

([<>]|)([0-9|.]*)(.*)

と書いてみました(他の書き方も可能だと思いますが、とりあえず)。このノードでは正規表現を記述した後、とってきたい部分を( )で括るという仕様になっています。ですので、私の書いた例には( )が3箇所ありますので、3分割されます。

 

[<>]| 

 < or >のどちらか1文字([ ]で括ると1文字。この中に選択肢を書けばいい)、もしくは何もない( | はorを示します。|の後ろに何も書いていないので、"もしくは何もない"を示します)部分

 

[0-9|.]*

 0から9もしくは少数点のうち1文字が可能な限り連続する部分

 

.*

 前述の2つの部分に続くなんでもよい部分

 

という感じです。繰り返しですが、他の書き方もあると思います(私もそんなに詳しい訳ではないので)。さて、実行してみましょう!

f:id:sumtat:20170804223137p:plain

 不等号・数字・単位の3つにうまく分割できました。分割後の数字部分はString to Numberノードを通してD(Double, 小数)属性に変えておくと後の解析時などには役立つと思います。String to Numberの設定は、今回は割愛しますね。

 

質問者Bさん:特許番号の国コードと数字部分を分けたいんだけど。

f:id:sumtat:20170804225345p:plain

回答例)

今回は

([aA-zZ]*)([0-9]*)

と書いてみます。くどいですが、他の書き方もあるはずです。

 

[aA-zZ]*

 a-z, A-Zのうちのどれか1文字が(ランダムに)可能な限り連続する部分

 

[0-9]*

 0-9のうちのどれか1文字(ランダムに)可能な限り連続する部分

 

これで実行すると

f:id:sumtat:20170804230148p:plain

余裕ですね!

 

質問者C:この中から、年・月・日の数字が欲しいだけど。

f:id:sumtat:20170804232000p:plain

回答例)

なんだこれ?ですね。意味はないですが金融庁のページから持ってきました。とりあえずこんな感じにしてみました。

.*平成(.{1,2})年(.{1,2})月(.{1,2})日.*

 

.{1,2}

 なんでも良い1文字1~2文字続く

これが平成と年と月と日の間の3回指定してあります。

なんで[0-9]とかにしなかったかというと、【7月1日】の7と1は全角使ってやがるんですよ!こういうのが気を遣うとこなんですよね。元が汚いってのは本当に困る。大事な情報を捨ててしまわないためには、よーく注意しないとなんです。ちなみに、全角を半角数字に自動で直すノードはKNIMEにはありません(だって別物だし)。こういう部分に関しては、後で別途個別にデータの修正ですね。

 

データの前処理は地味だけど、とっても大事な作業です。

 

実行するとこんな感じです。

f:id:sumtat:20170804233102p:plain

指定したパターンが入っていないrowについては、?(missing value, 欠損値)となります。

 

3つの例を通してregex splitを紹介しました。いかがでしたか?

  splitterとしては区切り文字(列)が定義できるならばcell splitterを使った方がいいです。分かりやすいですし、outputの形式が指定できる。一方で、cell splitterには区切りの指定という縛りがあるので、regex split は困った時にとても役立ちます。

 正規表現についてそんなに詳しくない私でも、そんなに苦にせず使用できています。是非活用してみてください。