連載「タコにもわかる正規表現」第2回目です。
第1回目では正規表現の基本的な考え方や書き方を紹介しました。
記事最後に出題した「おさらいクイズ」の解答は後ほどするとして、今回もタコの雑学からスタートします。
タコとイカどちらも墨を吐きますが、その違いはご存知でしょうか?
タコ墨は水に溶けやすいため、周りの海水を濁らせて敵の視界をさえぎる効果があると考えられています。対してイカ墨は水に溶けにくいため、形を保ったまま漂って敵を引き付ける効果があると考えられています。
タコは煙幕の術、イカは分身の術。どちらも忍者みたいですね。
そんな似て非なる墨ですが、人間が食べるのはイカ墨ばかりで、タコ墨パスタなんて見たことがありません。
その理由はきっとタコ墨がマズイからだろうと思っていましたが、探してみるとこんな結果が見つかりました。
<墨100gに含まれる主なアミノ酸の含有量(日本調理科学会のデータから引用)>
イイダコ | マダコ | スルメイカ | ヤリイカ | |
グルタミン酸 | 74mg | 72mg | 24mg | 6mg |
アスパラギン酸 | 42mg | 26mg | 9mg | 2mg |
プロリン | 39mg | 34mg | 50mg | 4mg |
アラニン | 52mg | 64mg | 24mg | 9mg |
グリシン | 31mg | 25mg | 15mg | 3mg |
タウリン | 122mg | 451mg | 374mg | 143mg |
実際に食べたことはないので断言はできませんが、もしかするとタコ墨の方が旨味成分が多くておいしいのかもしれません。
それでもタコ墨が流通しないのは「墨袋が取り出しにくい」「少量しか取れない」といった理由があるようです。要はコスパが悪いってことですね。
第1回のおさらいクイズの解答です。
「大技」「小技」という言葉がなんどか出てきましたが、「技」じゃない漢字を使っている箇所があります。
正規表現を使って、「大技」「小技」の「技」の漢字が違う箇所を一発で見つけてみてください。
まずは、「大技」「小技」の「大」「小」どちらにもヒットするように、一文字単位のOR検索ができる[ ]を使って、【[大小]】と書きます。
次に、「技」じゃない漢字にヒットするように、[ ]の中を否定する[^]を使って、【[^技]】と書きます。(Wordの場合は【[!技]】)
この2つをつなげて【[大小][^技]】で検索すると、以下の個所にヒットします。
プログラムやSQLコマンドを自分で書ける人は大技の使い手、でもそれがメインの仕事じゃない人にとっては正規表現という小伎を覚えておくだけで、普段の仕事の精度やスピードがアップするということです。
みなさん自力で解けましたでしょうか?
前回はWordを使ってみましたが、今回はExcelを使ってみましょう。
Excelには正規表現検索機能はありませんが、「Excel用正規表現検索ダイアログアドイン」というフリーウェアを使用すれば正規表現検索ができるようになります。
このフリーウェアはとても多くの機能を搭載していて、正規表現ではできないはずのこともできるのですが、本ブログではアドイン独自機能を除く通常の正規表現でできることに絞って話を進めていきます。
アドインをインストールしたあとは、準備として冒頭の表をExcelに貼り付けておいてください。
前回【[0123456789]ページ】や【[0-9]ページ】といった書き方を紹介しましたが、実はもっと短く書くことができます。
【[0123456789]】や【[0-9]】の代わりに【¥d】を使っても、すべての数字にヒットします。つまり、【[0123456789]ページ】や【[0-9]ページ】は、【¥dページ】になります。
実際にやってみましょう。
冒頭の表は単位がmgなので、アドインのダイアログに【¥dmg】と入力して「すべてマーク」をクリックすると、含有量のセルすべてに色が付きます。(画像あり)
ここで気をつけて欲しいことが2つあります。
1つ目は、【¥d】は一文字だけを表しているということです。つまり左上のセルは「74mg」にヒットしたのではなく「4mg」にヒットしたので色が付いたということです。
2つ目は、【¥d】には小数点は含まれていないということです。例えば、「74.4」も数字ですが、【¥d】を使っても「.」にヒットさせることはできません。
説明が複雑になることを避けるため、冒頭の表は引用元から小数点以下を四捨五入しています
もしも単位に「ページ」と「mg」が混ざっていたら、一文字単位のOR検索[ ]ではヒットさせることができません。
そのような場合には、【|】を使って【ページ|mg】と書きます。
では、この【|】を使って、冒頭の表をもっと正確に検索してみましょう。
「3桁の数字のあとにmg」「2桁の数字のあとにmg」「1桁の数字のあとにmg」の3パターンの状態が混ざっていることがわかるので、それぞれを正規表現で書くと【¥d¥d¥dmg】【¥d¥dmg】【¥dmg】となります。
あとは【|】でつないで、【¥d¥d¥dmg|¥d¥dmg|¥dmg】とすれば完成です。
でも、ちょっと見づらいですね。実は正規表現では数学のように共通項でくくることができます。上の例では単位の「mg」が共通なので【(¥d¥d¥d|¥d¥d|¥d)mg】と書くことができます。
文章で書くと「3桁の数字、または2桁の数字、または1桁の数字のあとにmg」ということになります。
ここまで来れば、前回に事例として挙げていた「54」以上の参照ページを見つける方法もわかるようになります。
せっかくなので冒頭の表から54mg以上を検索してみましょう。
ここまでの知識で答えが出せますので、まずは自力で考えてみてください。
正規表現では計算はできませんので、「≧54」のような書き方もできません。
なので、まずはわかりやすい3桁から考えてみましょう。3桁になっている時点で54以上なので、すべてにヒットして構いません。先ほどと同様、「3桁の数字のあとにmg」を表す正規表現として【¥d¥d¥dmg】と書きます。
次に2桁の場合を考えてみます。
十の位が6~9なら、一の位が何であっても54以上になるので、【[6-9]¥dmg】と書くことができます。
十の位が5なら、一の位は4~9になっている必要があるので、【5[4-9]mg】と書くことができます。
あとは【|】でつないで、【¥d¥d¥dmg|[6-9]¥dmg|5[4-9]mg】とし、さらに「mg」が共通なので【(¥d¥d¥d|[6-9]¥d|5[4-9])mg】とまとめれば答えになります。
今回はここまでですが、いかがだったでしょうか。
いきなり正規表現を考えるのが難しければ、最初は文章で考えてみて、その文章を正規表現にしていけば答えにたどり着くことができます。
この「文章で考える作業」と「その文章を正規表現にする作業」は、仕事で言えば「企画/構想/Plan」と「実現/制作/Do」のように、少し頭の使い方が異なるので、ごちゃごちゃになってしまわないように意識しておくことをおすすめします。
最後におさらいクイズを出しておきます。
先ほどは冒頭の表から54mg以上を検索しましたが、19mg以上53mg以下を検索してみてください。
なお、一番下のタウリンは3桁なので、スルメイカ以外にはヒットしてしまいます。どうしても気に入らなければ正規表現の最初に【^】を追加しておいてください。
【^】は先頭を表しますが、このような「位置にヒットする正規表現」は今後の回で説明します