前回の授業より正規表現によるテキスト処理が始まったが、この正規表現はファイル名やファイル内容、webのコンテンツなど幅広い分野で利用されている重要な概念である。実際、正規表現を知っているとRubyのようなスクリプト言語以外でも役に立つことが多い。ここでは、正規表現ではないが、同じような考え方で文字列の一般化を行うような例もいくつか挙げて実際の利用について説明する。
UNIX(Linux)においてはコマンドベースで操作を行うことが基本であることは以前より紹介しているが、ファイルの検索なども、コマンドベースで効率よく行うことができる。(もちろん、ファイルマネージャを起動してGUIで行うことも可能である。)
ここではメタ文字を利用してfindというコマンドでファイルを検索する方法について操作してみる。ただし、詳しくは、
$ man find
として使用法を確認のこと。
$ find ~ -name tex -print
というのが基本的な使い方である。ここで、コマンドとオプション、引数の関係は以下のようになっている。
find 起点ディレクトリ 検索条件 処理
これは、どのディレクトリから検索を開始するかをまず指定し、探す条件が何か、検索した結果何を行うか、という順序である。上の例で行くと、ホームディレクトリ以下についてtexという名前のファイルを検索し、画面に出力することを行う。
エレクトロニクスセミナーAにおいてTeXの自習を行っている場合にはtexという名前のディレクトリが一つできている。ところが、 /virtual/home/b00**/tex/tex/tex のように複数の階層にわたって作ってしまっている場合にはそれは間違いであり、今後混乱を生じる元であるので必要なファイルをすべて一番上の階層のtexディレクトリに移し、余分なディレクトリを削除するべきである。方法は別ページに示す。 |
先ほどファイル名を指定して検索を行ったが、次に、メタ文字を使用して同じようなことを行ってみる。
$ find ~ -name "t??" -print
結果はどうなっただろうか?各人のファイル構成によって異なる可能性があるが先ほどと同様にtexディレクトリが検索されているはずである。「?」は「任意の一文字」を意味しており、上の検索はtで始まる3文字のファイル名を持つファイルを対象としていた。(メタ文字を使用する場合にはファイル名を”でくくる必要がある。)また、次の検索の結果はどうなるであろうか?
$ find ~ -name "s*t" -print
これも各人の状況によって異なる結果となるかもしれないが、とりあえずはscriptディレクトリが検索されたはずである。(ここでも同様に間違って複数の階層にわたってscriptディレクトリを作ってしまっている場合には環境を再構築しておく必要がある。)「*」は0文字以上の任意の文字列を意味しており、ここでの検索ファイル名はsではじまりtで終わるが、そのsとtの間に文字がないか、あるかの別無く検索を行う。すなわち、stというファイルが存在すればそれをリストアップするし、sstやsxtなど間に文字があっても該当する。また、sssttやsabcdefgtのように文字数に制限もない。
メタ文字はこのようにファイル名が不明なとき、入力を省略したいときなど各種の場面で役立つ。もちろん、findコマンドだけでなく他のコマンドでもファイル名の省略としてよく使われる。
本学科のWebには日本語全文検索エンジンを用意している。これは、適当なキーワードを入力するとその文字列を含むページを自動的にピックアップしてくれる物で、自分でページを読んで探す手間が省ける便利な機能である。このような全文検索エンジンを用意しているページはだんだんと増えてきており、特に、メーリングリストの過去メールから必要な物を見つけたいときなど役に立つ。
通常は、記入欄に複数の単語をスペースで区切って入力することによりand検索(両方を満たすケースを探す)が行えるようになっているが、より的確に短時間で検索するためにはメタ文字や正規表現を知っている方が良い。以下に縄手の研究室のページを利用して活用の例を示す。
上記ページには検索方法として特定の文字を含んだり含まなかったりという例が挙げてある。そこに書いてあることを試してみる。
フォームによる記入欄(入力欄)にgmrと入力して検索すると、6個のファイルが表示される。これは、検索対象範囲内にgmr(もしくはGMR)を含むページが6つあることを意味している。GMRとはGiant MagnetoResistanceの略であり、日本語で巨大磁気抵抗効果と呼ばれている。磁界を印加することによりサンプルの電気抵抗が数十%も変化する特異な現象であり、最近の高密度ハードディスクの情報を読み出すヘッドして実用化されている。(縄手の研究のメインテーマの一つである。)
さて、ここでGMRが略語であることがわかったが、略していない場合の研究成果の載っているページもあるかもしれない。そこで、記入欄に
( gmr | giant )
としてみよう。結果は10件見つかったはずである。これにより、特定の技術用語が省略されていたり、いなかったりした場合でも逃さず必要なページを探すことができる。
さらに、どのようなサンプル材料での研究成果かを含めて、例えば、Co/Cu人工格子の場合は除外するとすると、入力欄には、
( gmr | giant ) not Co/Cu
とする必要がある。この場合には検索結果は8件と減ってくる。加えて、Feを用いた物に限るようにするために、
( gmr | giant ) not Co/Cu and Fe
とすると、さらに減って6件となる。ここで、notやandの順番と結合の強さに少し注しておく必要がある。すなわち、notはCo/Cuにのみ係り、not ( Co/Cu and Fe)とは違うことである。
現在、各種のサーチエンジンがwebページの検索のために用意されている。特に、gooのようなロボット型の物はページの登録作業が不要であるので、思いもよらない貴重な情報源に当たることもよくあり重宝する。サーチエンジンにおいてもキーワードが少ないと、膨大な数のページにヒットしてしまうので、その後の絞り込みが大変である。そこで、複数のキーワードを指定して条件を細かく設定することが望ましい。
通常の入力欄ではスペースで区切って複数の単語を並べてから「すべての語を含む」か「いずれかの語を含む」として選べるが、詳細サーチのコーナーに行くともう少し複雑な検索もできるようになっている。そこで効率よく行うためには上で紹介したような概念が重要であるし、メタ文字なども使用できるので活用すると良い。
上でメタ文字の活用など基本的なことを見てきたが、本格的な正規表現を用いることにより、より的確な文字列選択が行えるので、スクリプト言語で文字列を処理する際には是非とも覚えておくのが望ましい。以下に、教科書に沿って補足をする。
1文字マッチ
指定された1文字にそのままマッチするか、「.」を用いた場合には任意の文字に一文字マッチするような場合である。注意するのは、必ずしも文字列の先頭にある必要はないことで、途中に出てきてもマッチする。
マッチの実際を確かめるためには、例えば、以下のようなスクリプトを実行してみる。
#!/usr/bin/ruby /[a-z]/ =~ "abced" print $&, "\n"上記のスクリプトにおいて、$&はp.79の表2-9に出ている「マッチした部分」である。上の例では、a-zまでのアルファベットのどれか一文字にマッチする条件であるので、文字列abcdeの最初のaにマッチする。よって、出力結果はaとなる。
グルーピング
教科書p.76の下の方に、「Rubyの通常の文字列を表現を表す正規表現」という言葉が出てきて、
/(["'`]).*?\1/
となるとある。これに関しては説明が必要で、この正規表現を分解すると、まず、[]の中に、引用符が3つあることがわかる。p.68で見たように、文字列を示す引用符には3種類あったのでそれがここでの[]の中身に対応している。次は「.*?」であるので、任意の一文字の0回以上の繰り返しである。これは任意の文字列という意味である。最後に、\1によって、最初にマッチした部分を指定するので、始まりが”であれば終わりも”となり、’ならば’のように対応する。すなわち、Rubyの文字列が必ず引用符でくくられているので引用符の間に存在する任意の文字列ということで、文字列が指定できる。
マッチ後の変数参照も以下に例を挙げておく。
#!/usr/bin/ruby /^(.*?):/ =~ "http://www.ecs.shimane-u.ac.jp" print $1, "\n"
オプション
教科書p.78にある日付の正規表現は、まず、
$ date
として、表示される日付を確認する。すると、曜日、月、日、時刻、(タイムゾーン)、年の順に表示されることがわかる。その表現を正規表現に当てはめると教科書のようになることを意味している。分解すると、初めに曜日をアルファベット3文字で表示する。また、ここでは曜日を4文字以上で表記する場合にも対応させており、カンマを付ける表記法も考慮してある。空白の次に月を3文字で表示、空白、日付を一桁もしくは二桁で表示、空白、数字もしくは:(コロン)の繰り返しの後の空白、最後に4桁の年号となっている。これは、上記の日付の形式に対応しているが、さらに、
Tuesday, June 6 10:30:00 2000
にも対応していることに注意する必要がある。すなわち、+で指定された繰り返しの条件があるので、曜日や月が3文字とは限らない。
授業の進み具合によって課題を課すのでアナウンスに注意すること。