第 6 回 正規表現と検索 レポート課題 氏名:佐藤美咲 学籍番号:c111081A 語学クラス:英語2 コース:地域共創 1.筆記問題 A. 誕生日 1992 年 12 月 30 日 10進数を2進数にする。 10進数で2で割って、その割った数をまた2で割る。 余りが0になるまで繰り返し、最後に余りをしたから並べる。 0d1992 1992/2 = 996余り0 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 = 1余り1 1/2 = 0余り1 0d1992 = 0b111111001000 0d12 12/2 = 6余り0 6/2 = 3余り0 3/2 = 1余り1 1/2 = 0余り1 0b = 1100 0d30 30/2 = 15余り0 15/2 = 7余り1 7/2 = 3余り1 3/2 = 1余り1 1/2 = 0余り1 0d30 = 0b11110 10進数を2進数にしたときの余りが 111111001000 なので、16進数にするには 111111001000を右から4桁毎に区切る。 1111 1100 1000 と区切られる。 これを下記の表を使って16進数に変換すると、 1111 = F 1100 = C 1000 = 8 よって 0d = 0xFC8 1100 = C よって 0d = 0xC 0011 = 3 1100 = C よって 0d = 0x3C 「1992年 12月 30日」は、 16進数表示では 「 FC8年 C月 3C日 」となる。 10進数 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 2進数 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 16進数 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 B. 誕生日 1992 年 12 月 30 日 各項を16進数に変換すると、 さっきAの問題で16進数に変換した、 0d1992 = 0xFC8 0d12 = 0xC 0d30 = 0x3C になり、FC8 + C + 3C = ? と求めたいが ネットで調べたり史料を見て考えても計算方法がわからなかったため 10進数のままで和を求めてから16進数に直す方法で計算した。 1992 + 12 + 30 = 2034 2034 を 16進数 にしたいので 16 で割っていく。 2034/16 = 127余り2 127/16 = 7余り15 7/16 = 0余り7 下から余りを読んで並べると、7 15 2 さらに16進数表を見て変換すると、7 F 2 となる。 これをあらためて10進数に直すと 7 * 16^2 = 1792 15 * 16^1 = 240 2 * 16^0 = 2 1792 + 240 + 2 = 2034 となった。 1992 + 12 + 30 = 2034 だったので一致した。 C. STDERR という method を print(f*) 文につける理由 標準エラー出力は、エラーメッセージや警告メッセージを出力するためのストリームで、 大域変数 stderr に代入されている。 kterm のような端末ソフトウェアから プログラムを普通に起動した場合、標準エラー出力は端末につながっている。 従って、標準エラー出力にメッセージを書き出せば、メッセージは端末の画面に表示される。 そこで、fprintf 関数を利用することでエラーがあったことを端末画面に表示させると ユーザがエラーを見つけることができる。 よって、簡単に言うと 利用者が操作間違いをしたことが分かるようにするため、である。 2. A.ディズニーランドのタウン名、そのレストラン名、おすすめのメニュー名、値段について B. ワールドバザール イーストサイド・カフェ パスタコース 1980 トゥモローランド プラザ・レストラン グローブシェイプ・チキンパオ 530 トゥーンタウン ミッキーのトレーラー スプリングロール 280 ファンタジーランド キャプテンフックス・ギャレー シーフードピザ 400 クリッターカントリー グランマ・サラのキッチン クリッターカントリーケーキ 510 ウエスタンランド ハングリーベア・レストラン ポークカツカレー 930 アドベンチャーランド カフェ・オーリンズ ケイジャンシュリンプ 480 メディテレー二アンハーバー マゼランズ ランチコース 2800 ミステリアスアイランド ノーチラスギャレー スモークターキーレッグ 500 アメリカンウォーターフロント ニューヨーク・デリ デリサラダ 840 ポートディスカバリー ホライズンベイ・レストラン "セレクトファイブ"セット 1980 ロストリバーデルタ トロピック・アルズ ティポトルタ 350 C.行きたいレストランがどのタウンにあるのか、どんなタウン、レストランがあるのか、 おすすめメニューは何なのか、また、その人の考えているコストに見合ったレストランを知らせたい。 D.検索パターン 7つの検索パターンを考えた。 ★パターン1★ egrep "1980" date_c111081.dat を実行。 予想、値段のうち¥"1980"のつくメニューが検索される。 ★パターン2★ egrep "カフェ" date_c111081.dat を実行。 予想、レストラン名のうち"カフェ"のつくレストランが検索される。 ★パターン3★ egrep "テリサラダ|デリサラダ" date_c111081.dat を実行。 予想、メニュー名のうち"テリサラダ"か"デリサラダ"の正しいメニュー名が検索される。 ★パターン4★ egrep "[500-2000]" date_c111081.dat を実行。 予想、値段のうち500から2000までのメニュー名が検索される。 ★パターン5★ egrep "^ファンタジー" date_c111081.dat を実行。 予想、タウン名のうち"ファンタジー"が先頭に付くタウンが検索される。 ★パターン6★ egrep "ランド$" date_c111081.dat を実行。 予想、タウン名のうち"ランド"が末尾に付くタウンが検索される。 ★パターン7★ egrep "[ぁ-ん]" date_c111081.dat を実行。 予想、タウン名、レストラン名、メニュー名、値段のうち ひらがなは存在しないので何も検索されない。 E.実行結果 ★パターン1★ pan{SATO Misaki}% egrep "1980" date_c111081.dat [~/Ruby] ワールドバザール イーストサイド・カフェ パスタコース 1980 ポートディスカバリー ホライズンベイ・レストラン "セレクトファイブ"セット 1980 "1980"円のメニュー2つあったので、予想通り"1980"円のメニューが検索された。 ★パターン2★ pan{c111081}% egrep "カフェ" date_c111081.dat [~/Ruby] ワールドバザール イーストサイド・カフェ パスタコース 1980 アドベンチャーランド カフェ・オーリンズ ケイジャンシュリンプ 480 "カフェ"のつくレストランは"イーストサイド・カフェ"と"カフェ・オーリンズ" であったので、予想通り"カフェ"のつくレストランが検索された。 ★パターン3★ pan{c111081}% egrep "テリサラダ|デリサラダ" date_c111081.dat [~/Ruby] アメリカンウォーターフロント ニューヨーク・デリ デリサラダ 840 正しいのは"デリサラダ"なので、予想通り"デリサラダ"が検索された。 ★パターン4★ pan{SATO Misaki}% egrep "[500-2000]" date_c111081.dat [~/Ruby] ワールドバザール イーストサイド・カフェ パスタコース 1980 トゥモローランド プラザ・レストラン グローブシェイプ・チキンパオ 530 トゥーンタウン ミッキーのトレーラー スプリングロール 280 ファンタジーランド キャプテンフックス・ギャレー シーフードピザ 400 クリッターカントリー グランマ・サラのキッチン クリッターカントリーケーキ 510 ウエスタンランド ハングリーベア・レストラン ポークカツカレー 930 アドベンチャーランド カフェ・オーリンズ ケイジャンシュリンプ 480 メディテレー二アンハーバー マゼランズ ランチコース 2800 ミステリアスアイランド ノーチラスギャレー スモークターキーレッグ 500 アメリカンウォーターフロント ニューヨーク・デリ デリサラダ 840 ポートディスカバリー ホライズンベイ・レストラン "セレクトファイブ"セット 1980 ロストリバーデルタ トロピック・アルズ ティポトルタ 350 検索した結果、500から2000のメニューは検索されず、 値段の数字の中に、"5" "2" "0" が1つでも含まれているメニューだけが 検索されてしまった。 ★パターン5★ pan{SATO Misaki}% egrep "^ファンタジー" date_c111081.dat [~/Ruby] ファンタジーランド キャプテンフックス・ギャレー シーフードピザ 400 "ファンタジー"が先頭につくタウンはこれだけなので、 予想通り"ファンタジーランド"が検索された。 ★パターン6★ pan{c111081}% egrep "ランド$" date_c111081.dat [~/Ruby] pan{SATO Misaki}% egrep "ランド$" date_c111081.dat [~/Ruby] pan{SATO Misaki}% egrep "ランド$" date_c111081.dat [~/Ruby] 検索した結果、タウン名に"ランド"がつくものもそれ以外も何も検索されなかった。 よって、予想ははずれた。 ★パターン7★ pan{SATO Misaki}% egrep "[ぁ-ん]" date_c111081.dat [~/Ruby] トゥーンタウン ミッキーのトレーラー スプリングロール 280 クリッターカントリー グランマ・サラのキッチン クリッターカントリーケーキ 510 検索した結果、タウン名、レストラン名、メニュー名、値段のうち ひらがなは存在しないので何も検索されないと予想したが、 ひらがなを使用していたレストランがあったことを自分が忘れているだけであって 実際は2つも検索された。 意外な結果で、予想ははずれた。 F.結果の考察 ★パターン1★ 自分の予想と実行結果が同じだったので、正しいといえる。 ★パターン2★ 自分の予想と実行結果が同じだったので、正しいといえる。 ★パターン3★ 自分の予想と実行結果が同じだったので、正しいといえる。 ★パターン4★ egrep "[500-2000]" data06.dat 検索した結果、500から2000のメニューは検索されず、 値段の数字の中に、"5" "2" "0" が1つでも含まれているメニューだけが 検索されてしまったので予想ははずれてしまった。 これを解決するために先頭の文字列のみ探して調べてくれる ^ を全ての数字に付け500と2000を固定すれば500から2000のメニューが 出てくるのではないかと思って実行してみた。 pan{c111081}% egrep "[^5^0^0-^2^0^0^0]" date_c111081.dat [~/Ruby] ワールドバザール イーストサイド・カフェ パスタコース 1980 トゥモローランド プラザ・レストラン グローブシェイプ・チキンパオ 530 トゥーンタウン ミッキーのトレーラー スプリングロール 280 ファンタジーランド キャプテンフックス・ギャレー シーフードピザ 400 クリッターカントリー グランマ・サラのキッチン クリッターカントリーケーキ 510 ウエスタンランド ハングリーベア・レストラン ポークカツカレー 930 アドベンチャーランド カフェ・オーリンズ ケイジャンシュリンプ 480 メディテレー二アンハーバー マゼランズ ランチコース 2800 ミステリアスアイランド ノーチラスギャレー スモークターキーレッグ 500 アメリカンウォーターフロント ニューヨーク・デリ デリサラダ 840 ポートディスカバリー ホライズンベイ・レストラン "セレクトファイブ"セット 1980 ロストリバーデルタ トロピック・アルズ ティポトルタ 350 すると、egrep "[500-2000]" date_c111081.dat と実行しとものと 同じ結果になってしまった。 なので次は、直前の文字が出現しなければならず、その出現は何回でもよい場合に使う + を全ての数字の間に付け500と2000を固定すれば500から2000のメニューが 出てくるのではないかと思って実行してみた。 pan{c111081}% egrep "[5+0+0-2+0+0+0]" date_c111081.dat [~/Ruby] ワールドバザール イーストサイド・カフェ パスタコース 1980 トゥモローランド プラザ・レストラン グローブシェイプ・チキンパオ 530 トゥーンタウン ミッキーのトレーラー スプリングロール 280 ファンタジーランド キャプテンフックス・ギャレー シーフードピザ 400 クリッターカントリー グランマ・サラのキッチン クリッターカントリーケーキ 510 ウエスタンランド ハングリーベア・レストラン ポークカツカレー 930 アドベンチャーランド カフェ・オーリンズ ケイジャンシュリンプ 480 メディテレー二アンハーバー マゼランズ ランチコース 2800 ミステリアスアイランド ノーチラスギャレー スモークターキーレッグ 500 アメリカンウォーターフロント ニューヨーク・デリ デリサラダ 840 ポートディスカバリー ホライズンベイ・レストラン "セレクトファイブ"セット 1980 ロストリバーデルタ トロピック・アルズ ティポトルタ 350 しかし、やはり同じ結果になってしまった。 よって、私が授業で習った内容だけでは500から2000のメニューを検索することは 残念ながら"出来ない"ということになる。 ★パターン5★ 自分の予想と実行結果が同じだったので、正しいといえる。 ★パターン6★ 検索した結果、タウン名に"ランド"がつくものもそれ以外も何も検索されなかった。 よって、予想ははずれてしまった。 これを解決するために思い付いたことが、 タウン名、レストラン名、メニュー名、値段は全て繋がっているので 最後の値段以外の最後の文字をとっても表示されないのではないかという案だ。 実際に実行してみた。 pan{c111081}% egrep "ド$" date_c111081.dat [~/Ruby] pan{SATO Misaki}% egrep "ズ$" date_c111081.dat [~/Ruby] pan{SATO Misaki}% egrep "0$" date_c111081.dat [~/Ruby] ワールドバザール イーストサイド・カフェ パスタコース 1980 トゥモローランド プラザ・レストラン グローブシェイプ・チキンパオ 530 トゥーンタウン ミッキーのトレーラー スプリングロール 280 ファンタジーランド キャプテンフックス・ギャレー シーフードピザ 400 クリッターカントリー グランマ・サラのキッチン クリッターカントリーケーキ 510 ウエスタンランド ハングリーベア・レストラン ポークカツカレー 930 アドベンチャーランド カフェ・オーリンズ ケイジャンシュリンプ 480 メディテレー二アンハーバー マゼランズ ランチコース 2800 ミステリアスアイランド ノーチラスギャレー スモークターキーレッグ 500 アメリカンウォーターフロント ニューヨーク・デリ デリサラダ 840 ポートディスカバリー ホライズンベイ・レストラン "セレクトファイブ"セット 1980 ロストリバーデルタ トロピック・アルズ ティポトルタ 350 タウン名の最後に"ド"のつくものは5つあるはずなのに 何も検索されなかった。 レストラン名の最後に"ズ"のつくものは3つあるはずなのに 何も検索されなかった。 メニュー名には最後が同じ文字のものは存在しないので何もしていない。 最後に、値段の最後に0がつくものは12 あるので 12全てのデータが検索された。 よって、$ はその各データの一番最後の文字、又は数字だけを探すのに使うのが 適しているいうことが分かった。 ★パターン7★ 検索した結果、タウン名、レストラン名、メニュー名、値段のうち ひらがなは存在しないので何も検索されないと予想したが、 ひらがなを使用していたレストランがあったことを自分が忘れているだけであって 実際は2つも検索されたので意外な結果で、予想ははずれてしまった。 しかし、これは自分の勘違いだったため正規表現は正常に機能してくれたという ことが分かった。 G.利用した正規表現のまとめ、気付いたこと ★ | (vertical line またはパイプ) 「または」の意味で、vertical lineで区切ったどちらかに該当するものを探して欲しい時に使用する ★ [文字1-文字2](braket) (文字1)から(文字2)の範囲の 1 文字を全て取りだして欲しい時に使用する [a-z] 小文字全ての中から 1 文字 [0-9] 数字の 0 から 9 までの 1 文字 [ぁ-ん] ひらがなの中から 1 文字 [亜-腕] 常用漢字の中から 1 文字 ★ ^ (caret) 先頭の文字列のみ探して欲しい場合に使用する ★ $ (dollar) 末尾の文字列のみ探して欲しい場合に使用する ★ + (plus) 直前の文字が出現しなければならず、その出現は何回でもよいという場合に使用する ☆パターン7 で気付いたこと $ は末尾の文字列のみ探して欲しい場合に使用するが その各データの一番最後の文字、又は数字だけを探すことしか出来ない ということがわかった。 3.感想 間違いを発見しそれがどうして間違っているのか、どうしたら成功するのかを 考えるのにだいぶ頭を使いました。今回の課題はいつもより時間がかかってしまいました。 しかし、実際にやってみて分かったこともあるし、新たな発見がたくん出来たので 時間をかけて本当によかったと思います。 私がいつも英語野予習をするために使用している電子辞書の機能で 英語の単語を入力すると日本語訳が出てくるものがあります。 たとえば"rose"と入力すると rose roseless roselike このように候補が検索されます。 この機能は正規表現の ^ か + を使っていると思いました。 ^rose r+o+s+e ★参考文献 http://www.tokyodisneyresort.co.jp/tds/map.html 作者不明 東京ディズニーシー マップ http://www.tokyodisneyresort.co.jp/tds/restaurant.html 作者不明 東京ディズニーシー レストラン http://roy/~madoka/2012/r1/06/r1_06_04_theme_02_repetation.html 西村まどか 基礎プログラミング I 第 6 回 (正規表現と検索) 「何回か繰り返されている文字を探したい」 http://roy/~madoka/2012/r1/06/r1_06_05_theme_03_or.html 西村まどか 基礎プログラミング I 第 6 回 (正規表現と検索) 「いくつかある候補を探したい場合」 http://roy/~madoka/2012/r1/06/r1_06_06_theme_04_onecharacter.html 西村まどか 基礎プログラミング I 第 6 回 (正規表現と検索) 「1 文字違い」 http://roy/~madoka/2012/r1/06/r1_06_17_appendix_04_stderr.html 西村まどか 基礎プログラミング I 第 6 回 (正規表現と検索) 「操作間違いをユーザに知らせたい場合」