【KNIME】ノード紹介:Regex Split 〜文字列を分割したい part 2〜
以前に"区切り文字(列)を指定して、文字列を分割するノード"であるcell splitterについて紹介しました。
【KNIME】ノード紹介:cell splitter 〜文字列を分割したい〜
今回は、これの第二弾です!。前回のColumn Rename (Regex)を紹介記事を書きながら、セットで紹介しようと思ったのがRegex Splitノードです。
Regex Split
正規表現を活用しながら、文字列を分割するノードです。
いつかの例を紹介してみます。
質問者Aさん:データをもらったんだけど、不等号や単位が同じセルに入ってて困るんだけど…。どうしたらいいでしょう?(質問者なんていません…。架空です…。)
回答例)
そうですね。cell splitterを使おうとしても「指定できる区切り文字(列)」がないですね。そんなときはRegex splitを使いましょう!
Patternとして
([<>]|)([0-9|.]*)(.*)
と書いてみました(他の書き方も可能だと思いますが、とりあえず)。このノードでは正規表現を記述した後、とってきたい部分を( )で括るという仕様になっています。ですので、私の書いた例には( )が3箇所ありますので、3分割されます。
[<>]|
< or >のどちらか1文字([ ]で括ると1文字。この中に選択肢を書けばいい)、もしくは何もない( | はorを示します。|の後ろに何も書いていないので、"もしくは何もない"を示します)部分
[0-9|.]*
0から9、もしくは少数点のうち1文字が可能な限り連続する部分
.*
前述の2つの部分に続くなんでもよい部分
という感じです。繰り返しですが、他の書き方もあると思います(私もそんなに詳しい訳ではないので)。さて、実行してみましょう!
不等号・数字・単位の3つにうまく分割できました。分割後の数字部分はString to Numberノードを通してD(Double, 小数)属性に変えておくと後の解析時などには役立つと思います。String to Numberの設定は、今回は割愛しますね。
質問者Bさん:特許番号の国コードと数字部分を分けたいんだけど。
回答例)
今回は
([aA-zZ]*)([0-9]*)
と書いてみます。くどいですが、他の書き方もあるはずです。
[aA-zZ]*
a-z, A-Zのうちのどれか1文字が(ランダムに)可能な限り連続する部分
[0-9]*
0-9のうちのどれか1文字が(ランダムに)可能な限り連続する部分
これで実行すると
余裕ですね!
質問者C:この中から、年・月・日の数字が欲しいだけど。
回答例)
なんだこれ?ですね。意味はないですが金融庁のページから持ってきました。とりあえずこんな感じにしてみました。
.*平成(.{1,2})年(.{1,2})月(.{1,2})日.*
.{1,2}
なんでも良い1文字が1~2文字続く
これが平成と年と月と日の間の3回指定してあります。
なんで[0-9]とかにしなかったかというと、【7月1日】の7と1は全角使ってやがるんですよ!こういうのが気を遣うとこなんですよね。元が汚いってのは本当に困る。大事な情報を捨ててしまわないためには、よーく注意しないとなんです。ちなみに、全角を半角数字に自動で直すノードはKNIMEにはありません(だって別物だし)。こういう部分に関しては、後で別途個別にデータの修正ですね。
データの前処理は地味だけど、とっても大事な作業です。
実行するとこんな感じです。
指定したパターンが入っていないrowについては、?(missing value, 欠損値)となります。
3つの例を通してregex splitを紹介しました。いかがでしたか?
splitterとしては区切り文字(列)が定義できるならばcell splitterを使った方がいいです。分かりやすいですし、outputの形式が指定できる。一方で、cell splitterには区切りの指定という縛りがあるので、regex split は困った時にとても役立ちます。
正規表現についてそんなに詳しくない私でも、そんなに苦にせず使用できています。是非活用してみてください。