青竹雑記帖(6代目)

テキスト処理をメインとしたIT解説をします。

文字だけで扱うコンピュータの世界(6):テキストファイル検索のすすめ(強力版その1)

承前

文字を打ち込むだけで検索できるという、コンピュータならではのパワーを手に入れた我々は、何でも検索できるようになりました!! ……と満足するのはまだ早い。ちょっと複雑な条件を付けて検索することだってできるんです。やってみましょう。

ここで残念なお知らせです。Windowsの「メモ帳」ですと、ケース2以降の機能が備わっていません。もしそうした検索を行いたくなったら、メモ帳からの旅立ちの日です。私の世代は、自分の学校でこそ歌いませんでしたが、合唱曲『旅立ちの日に』が全国的に歌われていました。今はどうなんでしょう。ちなみに自分の学校で歌われていなかったので、私は手で楽譜を打ち込んでMIDIファイルを作り、コンピュータにピアノ伴奏と主旋律(ソプラノパート)を演奏させて、主旋律をバリトンボイスで独唱していました。一戸建てだとそういう点は騒音公害にならなくていいですね。

コホン、脱線しすぎました。本題に行きます。

ケーススタディ

ケース1:英語の大文字と小文字を区別して検索したい

ほとんどのテキストエディタでは、初期設定では英文検索時に大文字と小文字を区別しない設定となっています。つまり、「dog」と「Dog」と「DOG」は同じものとして扱われ、検索結果に現れます。文章だと「fake news!」と「FAKE NEWS!」も同じものとして扱われます。こんな設定がある理由は、文中で基本的に全部小文字になっている単語と、文頭で先頭文字が大文字になっている単語をともに検索結果に含むためだと考えています。ちなみにこれは、日本語文字に対しては一切の効力を持ちません。「さっき」と「さつき」や、「しょうしょ」と「しようしょ」をまとめて検索結果に出すことはできません。また、あまりやる意味もないでしょう。

ケース2:英単語だけを検索したい

これも英文など、単語が空白で区切られるような言語でのみ効力を発揮するオプションです。たとえば、古来の英文法教科書の冒頭にありつつも、使う場面が相当限られていた "This is a pen." の文章と、それをうっかり書き間違えた "apen" なる奇怪な単語がファイル中にあるとき、「単語のみ検索する」オプションをオンにして "pen" を検索すると、 "This is a pen." に含まれる "pen" だけが検索結果に現れ、 "apen" を構成する "pen" は検索結果として出て来ないようになります。

ケース3 : 正規表現

正規表現」……「正しい表現」? いきなり小難しい単語を登場させてすみません。英語で言うと "Regular Expression" になります。なんやねん。こんな時はWikipedia先生に聞きましょう。

ja.wikipedia.org

正規表現(せいきひょうげん、英: regular expression)は、文字列の集合を一つの文字列で表現する方法の一つである。

わかりません。俺たちは雰囲気で正規表現を使っている。……と言うと終わっちゃいますので、少し説明を試みます。

ここまでの検索は、検索したい文字や単語をそのまま入力し、その文字や単語通りのものを見つけ出していました。これを実現したら、人間たるもの欲が出てきます。たとえば今まで「9時15分」や「3時34分」を1つずつ検索していたけど、「時間を書いてある部分を全部一度に検索で抽出したいなあ」と思うはずです。思わない人は勤勉すぎるかもしれません。その勤勉さはもっと発展的な事柄に使うべきです。面倒なことを10時間かけて学んで、これからの1000時間を節約しましょう。

ここで、時間の表現の形を「○時○分」とします。○の中には数字2ケタが入るように決めます。8時であれば「08時」と表現します。このような時間の表現が使われている部分をまとめて抽出する正規表現の一例を書きます。

[0-2][0-9]時[0-5][0-9]分
[0-9]{2}時[0-9]{2}分

これ以外にもいくつか書き方があります。実はこれだと、誰かが書き間違えた「29時59分」や、下の表現ですと「88時88分」という誤報極まりない時間の表現も抽出されてしまいます。本当に正しい時間の表現を抽出するなら、

([01][0-9]|2[0-3])時[0-5][0-9]分

になるでしょうか。このあたりを解説すると厚い本1冊になります。インターネットで有志が記載してくれている正規表現サンプルを読んで学ぶといいでしょう。

次回予告

まだまだテキスト検索は続きます。次はもっと強力に検索していきましょう。その呪文は「GREPGrep)」

次回更新は土曜未明かもしれません。現実逃避していたら金曜未明にも登場する可能性があります。