next up previous contents
Next: 8 ファイルの入出力 Up: algorism_out Previous: 6 値の型変換

Subsections


7 正規表現

「正規表現」とは、何に使われるか? ネット上の情報を集めたり、たくさんのファイルの中から特定の情報を集めたり するときに大変便利である。 知っているとオペレーションが100倍便利になる。

教科書 P.54 で説明

7.1 正規表現とは

文字列のパターンを表現するルールのことで、 目的のパターンにマッチした文字列を検索したり、置換したりすることができる。

具体例で説明する。 名簿データを以下に示す。 カットアンドペーストで ``meibo.txt''に保存する。

サトウ ムネユキ  SATOH Muneyuki  さとう胸幸     青葉台   Aobadai       03-0300-3030 mune@yoko.jp 
ナカマチ タロウ  NAKAMACHI Taro  中町太郎        酒田    Sakata	       012-345-6789 ntaro@sekai.jp
コウゲイ ハナコ  KOUGEI Hanako   工芸花子        飯山    Iiyama	     098-765-3210 hana@kodai.ac.jp
イイモリ ハンコ  IIMORI Hanko   飯森判子        飯森山  Iiyamamori	046-789-0987 han@hate.com
サイトウ テツヤ  SAITOH  Tetsuya  斉藤徹夜    白夜の国   Byakuyanoyoru	007-007-0077 tetsu@shiroi.com
ゲゲノ キタロウ  GEGEGENO Kitarou 下々野喜太郎  魔界村   Makaimura 	03-0000-00000 kita@oyaji.com
ボブ サップ      Bob Sappu        母父察歩     リング    ring 		0722-32-3909 bob@ring.com
サトウ ノコハン  sato NoKohan   砂糖鋸半     食物村    Tabemonomura	03-1031-0310 noko@meshi.jp
ナニワノ タロー  NANIWANO Tarod 浪速飲太郎  探偵騎士王国 Tanteikishiouk	046-007-7007 ntaro@king.jp
シカクイ ハココ shikakui hakoko 四角井 箱子 倉庫        Shikakui Souko 06-4912-5012 hako@sekai.com
ヒミ ヨンタロウ  HIMI Yontarou   非見四太郎    甲子園    Koushien 	919-922-3333 4taro@rokko.tiger.jp
ヤマタイ ヒミコ  YAMATAI Himiko   邪馬台氷見子   大和    Yamato	      03-1313-1313 himi@yamatai.com
イモリ テツコ    IMORI  Tetsuko    井森徹子       井戸   Ido		010-1010-1000 teko@ana.hori.com
バブ   カオウ    Bab Kaoh        場分 花王     泡の国   Awanokuni      009-0808-92295   bab@kaoh.seken.com
イサ  ミアシ    Isa  Miashi    伊佐 実亜士   土俵     Dohyo 03-1330-4024 isami@sumo.ne.jp
アサヲ タタロウ Asawo Tatatou  麻生 多太郎    政界      Seikai  0303-9876-5432 asao@nagata.cho.com

``Taro''がファイルのどこに含まれているか調べるのに正規表現は便利である。 ターミナル上で、

$ egrep -n "Taro" meibo.txt
2:ナカマチ タロウ    NAKAMACHI Taro  中町太郎        酒田      Sakata
7:ナニワノ タロー   NANIWANO Taro   浪速飲太郎     探偵騎士王国 Tanteikishioukoku
実行してみると、このようになる。すなわち、2行目の7行目に ``Taro''がいる ことが分かる。 ``-n''というのは、行番号を表示するオプション。

rubyでは、プログラム中でどのように正規表現をあわらすか? 以下のように、p.58のプログラム ``saito.rb''を打ち込んで、実行してみる。

------------program Start ---------
while line = gets     #ファイルを引数とすると、ファイルから1行ずつ読み込む
  if /SAI?TOH/ =~ line
    print line
  end
end
------------Program End -----------
1行目の ``line = gets''というのは、プログラム実行時にファイルを引数 とすると、そのファイルから読み込む。while文なので、1行目から順次読み込み、 読むべきデータが無くなると、終了する。

``/SAI?TOH/ =~ line'' が正規表現にマッチしているかどうか判断して いる部分である。

教科書の例は ``/sai?toh/i =~ line''となっており、後ろの / の後にある i は、大文字と小文字を区別しないと言う事を表している。

``if''文により、マッチした場合のみ print 文が実行される。

7.2 メタキャラクタ

ピリオド . 任意の一文字(なんでもよい一文字)
クエスチョン ? 直前の文字が0または1回の繰り返し
アスタリスク * 直前の文字が0回以上の繰り返し
プラス + 直前の文字の1回以上の繰り返し
大カッコ [ ] カッコの中に書いた文字のどれか
キャレット 文字列の先頭をいみする
ドル $ 文字列の末尾を意味する
縦棒(パイプ) $\mid$ 縦棒で区切られた部分のいずれか
小カッコ ( ) グルーピング、数文字をひと固まりとして処理する
  $\backslash$w アルファベット、数字、アンダーバーのどれかにマッチする
  $\backslash$W アルファベット、数字、アンダーバー以外にマッチする
  $\backslash$d $0\sim 9$のどれかにマッチする
  $\backslash$D $0\sim 9$以外のどれかにマッチする
  $\backslash$b 単語の境界にマッチする
  $\backslash$s 空白文字にマッチする
  $\backslash$S 空白文字以外にマッチする

7.2.1 ピリオド . : 任意の一文字(なんでもよい一文字)

``ハ''ではじまり、1文字おいて、``コ''で終わる名前を検索してみます。
------------program Start ---------
while line = gets
  if /ハ.コ/u =~ line  # 日本語はUNICODE文字なので、オプション"u"を付ける
    print line
  end
end
------------Program End -----------

7.2.1.1 練習

``h''ではじまり、3文字おいて``o''で終わる文字列を検索してみよ。

7.2.2 クエスチョン ? : 直前の文字が0または1回の繰り返し

例えば、Hanako とHankoの両方にマッチさせたい場合はどうするか? ``a''があってもなくてもよい、ということになる。
------------program Start ---------
while line = gets
  if /Hana?ko/ =~ line 
    print line
  end
end
------------Program End -----------

7.2.2.1 練習

``IIMORI''と ``IMORI''にマッチするプログラムを作成せよ。

7.2.3 アスタリスク * : 直前の文字が0回以上の繰り返し

/yaho*japan/ と書くと ``yahjapan'', ``yahojapan'', ``yahoojapan'', ``yahooojapan'', ``yahoooooooooooojapan''などにマッチする。

7.2.4 プラス + : 直前の文字の1回以上の繰り返し

/yaho*japan/ と書くと ``yahojapan'', ``yahoojapan'', ``yahooojapan'', ``yahoooooooooooojapan''などにマッチする。 アスタリスク * との違いは、``o''が無いパターンの ``yahjapan'' にはマッチ しないことである。

7.2.5 大カッコ [ ] : カッコの中に書いた文字のどれか

BobとBabの両方にマッチするには、以下のようにする。
------------program Start ---------
while line = gets
  if /B[ao]b/ =~ line 
    print line
  end
end
------------Program End -----------

7.2.6 縦棒(パイプ) : 縦棒で区切られた部分のいずれか

ハナコかハンコを表示させるには、以下のようにする。 カッコはグルーピングを示す。
------------program Start ---------
while line = gets
  if /ハ(ナ|ン)コ/ =~ line 
    print line
  end
end
------------Program End -----------

7.2.7 正規表現の練習

  1. 先頭が ``サ'' で始まり ``ウ''で終わる名前のある行を検索するプログ ラムを書く。
  2. ハナコ、ハココ、ハンコを検索するプログラムを書け。


next up previous contents
Next: 8 ファイルの入出力 Up: algorism_out Previous: 6 値の型変換

平成22年12月28日