第 6 回 正規表現と検索 レポート課題 氏名:樋口千穂 学籍番号:c1111240 語学クラス:中国語3 コース:政策マネジメント 1.筆記問題 A. 誕生日 1993年1月20日 まず10進数を2進数に変換する。 10進数を 2 で割っていき、答えと余りを計算していく。 答えが 0 になるまでこれを繰り返し、出た余りの数字を下から上に読めばよい。 0d1993 1993/2 = 996 余り 1 996/2 = 498 余り 0 498/2 = 249 余り 0 249/2 = 124 余り 1 124/2 = 62 余り 0 62/2 = 31 余り 0 31/2 = 15 余り 1 15/2 = 7 余り 1 7/2 = 3 余り 1 3/2 = 1 余り 1 1/2 = 0 余り 1 下から数字を読むと 11111001001 となる。 よって 0d1993 = 0b11111001001 0d1 1/2 = 0 余り 1 よって 0d1 = 0b1 0d20 20/2 = 10 余り 0 10/2 = 5 余り 0 5/2 = 2 余り 1 2/2 = 1 余り 0 1/2 = 0 余り 1 下から数字を読むと 10100 となる。 よって 0d20 = 0b10100 自分の誕生日を2進法表示にすると 11111001001 年 1 月 10100 日 となる。 次に10進数を16進数に変換する。 10進数を16進数に変換する方法には、 ・10進数を直接16進数に変換する ・10進数を2進数に変換してから16進数に変換する という2通りの方法がある。 今回は上で10進数を2進数に変換したものを使い、16進数への変換を行なう。 2進数を右から4桁ずつに区切り、16進数の変換表に当てはめる。 0d1993 = 0b11111001001 より 0111 1100 1001 と区切ることができるので 0111 = 7 1100 = c 1001 = 9 よって 0d1993 = 0x7c9 0d1 = 0b1 より 0001 = 1 よって 0d1 = 0x1 0d20 = 0b10100より 0001 0100 と区切ることができるので 0001 = 1 0100 = 4 よって 0d20 = 0x14 16進法表示で自分の誕生日は 7c9 年 1月 14 日 となる。 B. 誕生日 1993年1月20日 1993 + 1 + 20 を計算する。 各項を16進数に変換すると 0d1993 = 0x7c9 0d1 = 0x1 0d20 = 0x14 となるので 0x7c9 + 0x1 + 0x14 の和を求めたいが、16進数同士の和の求め方が分からない ため、10進数のままで和を求めてから16進数に直すことで16進数の和を求める。 1993 + 1 + 20 = 2014 2014/16 = 125 余り 14 125/16 = 7 余り 13 7/16 = 0 余り 7 下から余りを読むと 7 13 14 16進数では 13 = d 14 = e なので、誕生日を16進数に変換すると 7de となる。 これをあらためて10進数変換に戻すと 7 * 16^2 = 1792 13 * 16^1 = 208 14 * 16^0 = 14 1792 + 208 + 14 = 2014 となるので比較すると一致した。 C. STDERR という method を print(f)文につけるのは 利用者が操作間違いをしたことがわかるようにするためである。 2.プログラム問題 A.サンリオのキャラクター(ランダムに選んだ14体)に関するデータを作成。 キャラクター名、開発された年、性別、モチーフとなった生き物、好きなもの・ ことをデータ化した。 B.作成データ deta_c111124.dat ハローキティ 1974年 女 ネコ アップルパイ マイメロディ 1975年 女 ウサギ アーモンドパウンドケーキ リトルツインスターズ 1975年 女&男 人間 星釣り、発明、お絵書き タキシード サム 1979年 男 ペンギン ネクタイ けろけろけろっぴ 1987年 男 カエル 冒険すること バッドばつ丸 1993年 男 ペンギン おすし ポ厶ポ厶プリン 1996年 男 不明 ミルク しんかんせん 1999年 男 しんかんせん 走ること ウサハナ 2001年 女 ウサギ オレンジシャーベット シナモン 2001年 男 子犬 シナモンロール シュガーバニーズ 2004年 男 ウサギ スイーツ チャーミーキティ 2004年 女 ネコ 光るもの クロミ 2005年 女 ウサギ らっきょう ミスベア−ズドリーム 2010年 女 クマ ドーナツ C.キャラクターの名前を調べたい場合や、開発された年、性別やモチーフとなっ た生き物からキャラクターを調べたい場合などに使用したい。 D.検索パターン ◯パターン1◯ egrep "[2000-2012]" deta_c111124.dat を実行する。 予想 2000年から2012年に開発されたキャラクターが検索される。 ・ウサハナ ・シナモン ・シュガーバニーズ ・チャーミーキティ ・クロミ ・ミスベア−ズドリーム ◯パターン2◯ egrep "女" deta_c111124.dat を実行する。 予想 キャラクターのうち設定が女の子であるキャラクターが検索される。 ・ハローキティ ・マイメロディ ・リトルツインスターズ ・ウサハナ ・チャーミーキティ ・クロミ ・ミスベア−ズドリーム ◯パターン3◯ egrep "ウ" deta_c111124.dat を実行する。 予想 名前、モチーフとなった生き物、好きなもの・ことのどこかに ウ が入っ ているキャラクターが検索される。 ・マイメロディ ・ウサハナ ・シュガーバニーズ ・クロミ ◯パターン4◯ egre "^シ" deta_c111124.dat を実行する。 予想 キャラクター名が シ から始まるキャラクターが検索される。 ・シナモン ・シュガーバニーズ ◯パターン5◯ egrep "ズ$" deta_c111124.dat を実行する。 予想 キャラクター名が ズ で終わるキャラクターが検索される。 ・リトルツインスターズ ・シュガーバニーズ ◯パターン6◯ egrep "バウンド|パウンド" deta_c111124.dat を実行する。 予想 バウンド か パウンド の正しいワードが入ったキャラクターが検索され る。 ・マイメロディ ◯パターン7◯ egrep "[ぁ-ん]" deta_c111124.dat を実行する。 予想 キャラクター名、モチーフとなった生き物、好きなもの・ことのどこかに ひらがなが入っているキャラクターが検索される。 ・リトルツインスターズ ・けろけろけろっぴ ・バッドばつ丸 ・しんかんせん ・チャーミーキティ ・クロミ E.実行結果 ◯パターン1◯ pan{c111124}% egrep "[2000-2012]" deta_c111124.dat [~/Ruby] ハローキティ 1974年 女 ネコ アップルパイ マイメロディ 1975年 女 ウサギ アーモンドパウンドケーキ リトルツインスターズ 1975年 女&男 人間 星釣り、発明、お絵書き タキシード サム 1979年 男 ペンギン ネクタイ けろけろけろっぴ 1987年 男 カエル 冒険すること バッドばつ丸 1993年 男 ペンギン おすし ポ厶ポ厶プリン 1996年 男 不明 ミルク しんかんせん 1999年 男 しんかんせん 走ること ウサハナ 2001年 女 ウサギ オレンジシャーベット シナモン 2001年 男 子犬 シナモンロール シュガーバニーズ 2004年 男 ウサギ スイーツ チャーミーキティ 2004年 女 ネコ 光るもの クロミ 2005年 女 ウサギ らっきょう ミスベア−ズドリーム 2010年 女 クマ ドーナツ 検索した結果、2000年から2012年に開発されたキャラクターは検索されず、開発 された年に「0」「1」「2」のつく全キャラクターが検索されてしまい予想は外 れた。 ◯パターン2◯ pan{c111124}% egrep "女" deta_c111124.dat [~/Ruby] ハローキティ 1974年 女 ネコ アップルパイ マイメロディ 1975年 女 ウサギ アーモンドパウンドケーキ リトルツインスターズ 1975年 女&男 人間 星釣り、発明、お絵書き ウサハナ 2001年 女 ウサギ オレンジシャーベット チャーミーキティ 2004年 女 ネコ 光るもの クロミ 2005年 女 ウサギ らっきょう ミスベア−ズドリーム 2010年 女 クマ ドーナツ 検索した結果、設定が女の子であるキャラクター7体が予想通り検索された。 ◯パターン3◯ pan{c111124}% egrep "ウ" deta_c111124.dat [~/Ruby] マイメロディ 1975年 女 ウサギ アーモンドパウンドケーキ ウサハナ 2001年 女 ウサギ オレンジシャーベット シュガーバニーズ 2004年 男 ウサギ スイーツ クロミ 2005年 女 ウサギ らっきょう 検索した結果、名前、モチーフとなった生き物、好きなもの・ことのどこかに ウ が入っているキャラクター4体が予想通り検索された。 ◯パターン4◯ pan{c111124}% egrep "^シ" deta_c111124.dat [~/Ruby] シナモン 2001年 男 子犬 シナモンロール シュガーバニーズ 2004年 男 ウサギ スイーツ 検索した結果、キャラクター名が シ から始まるキャラクター2体が予想通り検 索された。 ◯パターン5◯ pan{c111124}% egrep "ズ$" deta_c111124.dat [~/Ruby] pan{HIGUCHI Chiho}% [~/Ruby] 検索した結果、キャラクター名が ズ で終わるキャラクターは検索されず、どの キャラクターもヒットしなかったため予想は外れた。 ◯パターン6◯ pan{HIGUCHI Chiho}% egrep "バウンド|パウンド" deta_c111124.dat [~/Ruby] マイメロディ 1975年 女 ウサギ アーモンドパウンドケーキ 検索した結果、 パウンド というワードが入ったキャラクターが予想通り検索さ れた。 ◯パターン7◯ pan{c111124}% egrep "[ぁ-ん]" deta_c111124.dat [~/Ruby] リトルツインスターズ 1975年 女&男 人間 星釣り、発明、お絵書き けろけろけろっぴ 1987年 男 カエル 冒険すること バッドばつ丸 1993年 男 ペンギン おすし しんかんせん 1999年 男 しんかんせん 走ること チャーミーキティ 2004年 女 ネコ 光るもの クロミ 2005年 女 ウサギ らっきょう 検索した結果、キャラクター名、モチーフとなった生き物、好きなもの・ことの どこかにひらがなが入っている6体のキャラクターが予想通り検索された。 F.結果の考察 ◯パターン1◯ egrep "[2000-2012]" deta_c111124.dat を実行した結果、キャラクターの開発 された年に「0」「1」「2」のつく全てのキャラクターが検索されてしまい、予 想は外れてしまった。 これを解決するために、任意の一文字の候補を取り出してくれる .(period) を 用いた egrep "20.." deta_c111124.dat を実行してみた。 pan{c111124}% egrep "20.." deta_c111124.dat [~/Ruby] ウサハナ 2001年 女 ウサギ オレンジシャーベット シナモン 2001年 男 子犬 シナモンロール シュガーバニーズ 2004年 男 ウサギ スイーツ チャーミーキティ 2004年 女 ネコ 光るもの クロミ 2005年 女 ウサギ らっきょう ミスベア−ズドリーム 2010年 女 クマ ドーナツ すると、2000〜2012年に開発されたキャラクターが正しく検索されたので、解決 するために考えた egrep "20.." deta_c111124.dat は正しいと言える。 また、出現は何回でもよい場合に使う *(asterisk) を用いた egrep "20*" deta_c111124.dat でも正しく検索できるのではないかと考え実行してみた。 pan{c111124}% egrep "20*" deta_c111124.dat [~/Ruby] ウサハナ 2001年 女 ウサギ オレンジシャーベット シナモン 2001年 男 子犬 シナモンロール シュガーバニーズ 2004年 男 ウサギ スイーツ チャーミーキティ 2004年 女 ネコ 光るもの クロミ 2005年 女 ウサギ らっきょう ミスベア−ズドリーム 2010年 女 クマ ドーナツ すると、予想通り2000年〜2012年に開発されたキャラクターが正しく検索でき たので egrep "20*" deta_c111124.dat でも .(period) を用いた時と同様に検 索できることが分かった。 ◯パターン2◯ 自分の予想と実行結果が同じだったので正しいと言える。 ◯パターン3◯ 自分の予想と実行結果が同じだったので正しいと言える。 ◯パターン4◯ 自分の予想と実行結果が同じだったので正しいと言える。 ◯パターン5◯ egrep "ズ$" deta_c111124.dat を実行した結果、キャラクター名が ズ で終わ るキャラクターは検索されず、どのキャラクターもヒットしなかったため予想は 外れてしまった。 これを解決するためにどこが悪かったのかを考えてみると、$ (dollar) は行の 末尾にその文字がくるものを検索する正規表現であるため、 ズ$ と検索した場合 にはキャラクターの最後の文字が ズ であるものがヒットするのではなく、キャ ラクターの好きなもの・ことの最後の文字が ズ であるものがヒットするのだと いうことに気付いた。そこで ズ を ク に変えた egrep "ク $"deta_c111124.dat を実行してみた。 pan{HIGUCHI Chiho}% egrep "ク$" deta_c111124.dat [~/Ruby] ポ厶ポ厶プリン 1996年 男 不明 ミルク すると好きなもの・ことの最後の文字が ク であるキャラクターが正しく表示さ れた。 また今度は egrep "ツ$" deta_c111124.dat を実行してみた。 pan{HIGUCHI Chiho}% egrep "ツ$" deta_c111124.dat [~/Ruby] シュガーバニーズ 2004年 男 ウサギ スイーツ ミスベア−ズドリーム 2010年 女 クマ ドーナツ すると好きなもの・ことの最後の文字が ツ であるキャラクターが正しく表示さ れた。 よって初めの予想は自分の勘違いで、$(dollar) を用いることで行の末尾にその文字 がくるキャラクターを検索することができるのだと分かった。 ◯パターン6◯ egrep "バウンド|パウンド" deta_c111124.dat を実行した結果、予想通りに検 索することができたが、[ ] で括られた文字のどれかが一致するものを取 り出す [ ] (braket) を用いた egrep "[バパ]ウンド" deta_c111124.dat でも 実行できるのではないかと考えたので実行してみた。 pan{c111124}% egrep "[バパ]ウンド" deta_c111124.dat [~/Ruby] マイメロディ 1975年 女 ウサギ アーモンドパウンドケーキ すると予想通り [ ] (braket) を用いても | (vertical line) を用いて実行し た結果と同じになったので予想通りに検索できたと言える。 ◯パターン7◯ 自分の予想と実行結果が同じだったので正しいと言える。 G.利用した正規表現 .(period) 分からない一文字を探して候補を取りだしてくれる。また、 .. と連 続して用いることによって* (asterisk) と同じ使い方もできる。 * (asterisk) *の直前の文字の出現が何回でもよい場合に使用できる。 ^ (caret) 行の先頭にその文字がくるものを検索する。 $ (dollar) 行の末尾にその文字がくるものを検索する。単語の末尾にその 文字がくるものは検索されないので注意する。また、データの 行の末尾の後ろに空白があると正常に検索されないのでこれも 注意する。 | (vertical line) 「または」の意味なので | で区切ったものに該当 するものを検索する。 [ ] (braket) [ ]で括られた文字のどれかが一致するものを取りだ す。文字数に制限はない。 [0-9] 一文字だけ思い出せないが数字だと分かっている場合 に使用できる。二桁以上の数字は一文字ずつで処理さ れてしまうため使用できない。 [ぁ-ん] 一文字だけ思い出せないがひらがなだと分かっている 場合に使用できる。 3.感想 正規表現はgoogleやyahooなどの検索サイトに利用されている。まだ自分が検索 ワードを入力している途中であっても、その後に続く文字を予測して探しだし表示 してくれる。これは最後まで検索ワードを自分で入力する手間を省くことができ るし、後半の文字があやふやな場合においてもスムーズに検索することができて 非常に便利である。 今回、講義で学んだ正規表現を実際に利用して検索してみて、自分で考えたパター ン1から予想通りに検索されなくて心が折れそうになった。しかし、どうして予 想通りにできなかったのか考えて実際に検索しながら解決方法を考える過程が大 変だったけれど面白かった。様々な正規表現を実際に使ってみることで自分なり の理解が深まり、正規表現の使いわけができるようになったのでよかった。 4.参考文献 webサイト:http://roy/~madoka/2012/r1/06/r1_06_03_theme_01_patternmatching.html 西村まどか先生、基礎プログラミング I 第 6 回 (正規表現と検索) 「うろ覚えの検索」 webサイト:http://roy/~madoka/2012/r1/06/r1_06_04_theme_02_repetation.html 西村まどか先生、基礎プログラミング I 第 6 回 (正規表現と検索) 「何回か繰り返されている文字を探したい」 webサイト:http://roy/~madoka/2012/r1/06/r1_06_05_theme_03_or.html 西村まどか先生、基礎プログラミング I 第 6 回 (正規表現と検索) 「いくつか ある候補を探したい場合」 webサイト:http://roy/~madoka/2012/r1/06/r1_06_06_theme_04_onecharacter.html 西村まどか先生、基礎プログラミング I 第 6 回 (正規表現と検索) 「1 文字違 い」 webサイト:http://roy/~madoka/2012/r1/06/r1_06_17_appendix_04_stderr.html 西村まどか先生、基礎プログラミング I 第 6 回 (正規表現と検索) 「操作間違 いをユーザに知らせたい場合」 webサイト:http://www.sanrio.co.jp/characters/index.html 株式会社サンリオ © 2012 SANRIO CO., LTD.、サンリオキャラクター webサイト:http://www.mrl.co.jp/download/manual-online/optits/manual/docs/bin_hex.html 作者不明、2進数/16進数変換表 共同学習者:佐藤美咲