第 6 回 正規表現と検索 レポート課題 氏名:高橋岬 学籍番号:c111097 語学クラス:英語5 コース:環境サイエンスコース 1.A.自分の誕生日→1992年8月8日 10進数を2進数変換するには、商が0になるまで2で割り、余りを下から読む。 1992は 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 = 0 余り 1 となるので 0d1992 = 0b11111001000 8も1992と同じように計算する。 8 / 2 = 4 余り 0 4 / 2 = 2 余り 0 2 / 2 = 1 余り 0 1 / 2 = 0 余り 1 よって 0d8 = 0b1000 上記の結果から2進法で誕生日を表すと 0b11111001000年0b1000月0b1000日 となる。 10進数を16進数変換するには、商が0になるまで16で割り、余りを下から 読む。 1992は 1992 / 16 = 124 余り 8 124 / 16 = 7 余り 12 7 / 16 = 0 余り 7 となる。 16進法では 12 = c となるので 0d1992 = 0x7c8 8も1992と同じように計算する。 8 / 16 = 0 余り 8 よって 0d8 = 0x8 上記の結果から16進法で誕生日を表すと 0x7c8年0x8月0x8日 となる。 B.誕生日の和は 1992 + 8 + 8 = 2008 A.で計算した結果より誕生日を16進数変換すると 0d1992 = 0x7c8 , 0d8 = 0x8 となるので 0d1992 + 0d8 + 0d8 = 0x7c8 + 0x8 + 0x8 = 0x7c8 + 0x10 ( 8 + 8 = 16 ) = 0x7d8 ( c = 12 , 12 + 1 = 13 = d ) この数値を分解すると 7 d 8 * * * 16^2 16^1 16^0 となるので10進数変換すると 7 * 256 + 13 * 16 + 8 = 2008 となる。 この結果より、10進数で計算した数値と16進数で計算した数値が一致するこ とがわかる。 C.標準エラー出力[STDERR(STanDardERRor)]は、print(f*) 文などの実行時に メッセージやエラーメッセージを Kterm 表示させたいから。 参考文献 基礎プログラミング I 第 3 回 (キーボードから入力して計算させるには) 「入力した値をプログラムで使おう」 http://roy/~madoka/2012/r1/03/r1_03_03_theme_01_gets.html 2.A.作成したデータの説明 山形県の市町村 ローマ字表記 人口(2011年10月) 市町村の木 市町村の花 作成したデータ 山形市 Yamagata-shi 254487 ナナカマド ベニバナ 寒河江市 Sagae-shi 42085 サクランボ ツツジ 上山市 Kaminoyama-shi 33408 アララギ キク 村山市 Murayama-shi 26413 アカマツ バラ 天童市 Tendo-shi 62138 モミジ ツツジ 東根市 Higashine-shi 46827 ケヤキ サクランボ 尾花沢市 Obanazawa-shi 18536 ケヤキ ツツジ 山辺町 Yamanobe-machi 15095 キャラボク リンドウ 中山町 Nakayama-machi 11894 イチョウ ヒマワリ 河北町 Kahoku-machi 19760 該当なし ベニバナ 西川町 Nishikawa-machi 6107 ブナ ミズバショウ 朝日町 Asahi-machi 7731 ブナ ヒメサユリ 大江町 Oe-machi 9088 スギ アジサイ 大石田町 Oishida-machi 8012 カツラ サクラ 新庄市 Shinjo-shi 38462 モミ アジサイ 金山町 Kaneyama-machi 6259 カネヤマスギ 該当なし 最上町 Mogami-machi 9665 ウメ リンドウ 舟形町 Funagata-machi 6032 エンジュ コブシ 真室川町 Mamurogawa-machi 8983 ウメノキ ウメノハナ 大蔵村 Okura-mura 3707 ブナ リンドウ 鮭川村 Sakegawa-mura 4766 モミジ ミチノクヒメユリ 戸沢村 Tozawa-mura 5170 ヤマノウチスギ ヒメサユリ 米沢市 Yonezawa-shi 89009 コメヅカ アズマシャクナゲ 南陽市 Nannyo-shi 33404 サクラ キク 長井市 Nagai-shi 29297 ツツジ アヤメ 高畠町 Takahata-machi 24805 アカマツ ツツジ 川西町 Kawanishi-machi 17060 マツ ダリヤ 小国町 Oguni-machi 8691 ブナ オオヤマザクラ 白鷹町 Shirataka-machi 15112 エドヒガンザクラ コブシノハナ 飯豊町 Ide-machi 7791 モミジ ユリ 酒田市 Sakata-shi 110253 ケヤキ トビシマカンゾウ 鶴岡市 Tsuruoka-shi 135374 ブナ サクラ 三川町 Mikawa-machi 7740 ケヤキ ナノハナ 庄内町 Shonai-machi 22925 該当なし 該当なし 遊佐町 Yuza-machi 15208 クロマツ チョウカイフスマ どんなときに使いたいのか 市町村の読みや人口、花や木を調べたいとき 検索パターン a. egrep "Oh?e" Ruby/data_c111097.dat を実行する → 大江町のローマ字読みがわからないが大江町が検出されるはず b. egrep "yama" Ruby/data_c111097.dat を実行する → 「yama」が付く市町村が検索されるはず c. egrep -i "yama" Ruby/data_c111097.dat を実行する → 「yama」か「Yama」が付く市町村が検索されるはず d. egrep "[サザ]クラ" Ruby/data_c111097.dat を実行する → 木か花で「サクラ」か「ザクラ」と書いている市町村が検索されるはず e. egrep "shi" Ruby/data_c111097.dat を実行する → 「shi」が付く市町村が検索されるはず f. egrep "shi\s" Ruby/data_c111097.dat を実行する → 「shi」の後にスペースがある ◯◯市 だけが検索されるはず g. egrep " [0-9][0-9][0-9][0-9] " Ruby/data_c111097.dat → 4桁つまり人口1万人以下の市町村が検出されるはず h. egrep "^山" Ruby/data_c111097.dat を実行する → 「山」から始まる市町村が検索されるはず i. egrep "ウ$" Ruby/data_c111097.dat を実行する → 「ウ」で終わる花を市の花に制定しているものが検索されるはず 実行した結果 と 考察 a.pan{c111097}% egrep "Oh?e" Ruby/data_c111097.dat 大江町 Oe-machi 9088 スギ アジサイ → 作成したデータ上での読みは「Oe」だったが、「?」が直前の文字が あってもなくても検索するので、大江町が検索された。 b.pan{c111097}% egrep "yama" Ruby/data_c111097.dat 上山市 Kaminoyama-shi 33408 アララギ キク 村山市 Murayama-shi 26413 アカマツ バラ 中山町 Nakayama-machi 11894 イチョウ ヒマワリ 金山町 Kaneyama-machi 6259 カネヤマスギ 該当なし → 「yama」がつく市町村が検索された。 c.pan{c111097}% egrep -i "yama" Ruby/data_c111097.dat 山形市 Yamagata-shi 254487 ナナカマド ベニバナ 上山市 Kaminoyama-shi 33408 アララギ キク 村山市 Murayama-shi 26413 アカマツ バラ 山辺町 Yamanobe-machi 15095 キャラボク リンドウ 中山町 Nakayama-machi 11894 イチョウ ヒマワリ 金山町 Kaneyama-machi 6259 カネヤマスギ 該当なし → 「yama」「Yama」がつく市町村が検索された。 b. と c. で検索結果が違うのは検索文に「-i」が入っているから。 「-i」は、大文字小文字関係なく検索することができる。なので b. では 小文字で「yama」となっているものだけが検出され、 c. では頭文字が大 文字になっている「Yama」も検出された。 d.pan{c111097}% egrep "[サザ]クラ" Ruby/data_c111097.dat 寒河江市 Sagae-shi 42085 サクランボ ツツジ 東根市 Higashine-shi 46827 ケヤキ サクランボ 大石田町 Oishida-machi 8012 カツラ サクラ 南陽市 Nannyo-shi 33404 サクラ キク 小国町 Oguni-machi 8691 ブナ オオヤマザクラ 白鷹町 Shirataka-machi 15112 エドヒガンザクラ コブシノハナ 鶴岡市 Tsuruoka-shi 135374 ブナ サクラ → [ ] を使うことで [ ] 内のいずれかの文字に該当するもの、つまり 「サクラ」か「ザクラ」とつくものを検索された。 e.pan{c111097}% egrep "shi" Ruby/data_c111097.dat 山形市 Yamagata-shi 254487 ナナカマド ベニバナ 寒河江市 Sagae-shi 42085 サクランボ ツツジ 上山市 Kaminoyama-shi 33408 アララギ キク 村山市 Murayama-shi 26413 アカマツ バラ 天童市 Tendo-shi 62138 モミジ ツツジ 東根市 Higashine-shi 46827 ケヤキ サクランボ 尾花沢市 Obanazawa-shi 18536 ケヤキ ツツジ 西川町 Nishikawa-machi 6107 ブナ ミズバショウ 大石田町 Oishida-machi 8012 カツラ サクラ 新庄市 Shinjo-shi 38462 モミ アジサイ 米沢市 Yonezawa-shi 89009 コメヅカ アズマシャクナゲ 南陽市 Nannyo-shi 33404 サクラ キク 長井市 Nagai-shi 29297 ツツジ アヤメ 川西町 Kawanishi-machi 17060 マツ ダリヤ 酒田市 Sakata-shi 110253 ケヤキ トビシマカンゾウ 鶴岡市 Tsuruoka-shi 135374 ブナ サクラ → 「shi」とつくもの全てが検索された。 f.pan{c111097}% egrep "shi\s" Ruby/data_c111097.dat pan{TAKAHASHI Misaki}% → 「\s」は空白を意味するので、後に空白(スペース)がある ◯◯市 が検索されるはずであるが、上手く検索してくれない。 なので egrep "shi " Ruby/data_c111097.dat を実行する。 pan{c111097}% egrep "shi " Ruby/data_c111097.dat 山形市 Yamagata-shi 254487 ナナカマド ベニバナ 寒河江市 Sagae-shi 42085 サクランボ ツツジ 上山市 Kaminoyama-shi 33408 アララギ キク 村山市 Murayama-shi 26413 アカマツ バラ 天童市 Tendo-shi 62138 モミジ ツツジ 東根市 Higashine-shi 46827 ケヤキ サクランボ 尾花沢市 Obanazawa-shi 18536 ケヤキ ツツジ 新庄市 Shinjo-shi 38462 モミ アジサイ 米沢市 Yonezawa-shi 89009 コメヅカ アズマシャクナゲ 南陽市 Nannyo-shi 33404 サクラ キク 長井市 Nagai-shi 29297 ツツジ アヤメ 酒田市 Sakata-shi 110253 ケヤキ トビシマカンゾウ 鶴岡市 Tsuruoka-shi 135374 ブナ サクラ → 「 (スペース)」をいれることで ◯◯市 だけを検索することができ た。 g.pan{c111097}% egrep " [0-9][0-9][0-9][0-9] " Ruby/data_c111097.dat 西川町 Nishikawa-machi 6107 ブナ ミズバショウ 朝日町 Asahi-machi 7731 ブナ ヒメサユリ 大江町 Oe-machi 9088 スギ アジサイ 大石田町 Oishida-machi 8012 カツラ サクラ 金山町 Kaneyama-machi 6259 カネヤマスギ 該当なし 最上町 Mogami-machi 9665 ウメ リンドウ 舟形町 Funagata-machi 6032 エンジュ コブシ 真室川町 Mamurogawa-machi 8983 ウメノキ ウメノハナ 大蔵村 Okura-mura 3707 ブナ リンドウ 鮭川村 Sakegawa-mura 4766 モミジ ミチノクヒメユリ 戸沢村 Tozawa-mura 5170 ヤマノウチスギ ヒメサユリ 小国町 Oguni-machi 8691 ブナ オオヤマザクラ 飯豊町 Ide-machi 7791 モミジ ユリ 三川町 Mikawa-machi 7740 ケヤキ ナノハナ → [ ] の理由は d. の考察同様。 0-9 は 0~9 の数字全てから当てはまるものを検索させる。 4つ [ ] が並んでいるのは4桁の数値を検索させるため。(文字を表 す「\d」も上手く動いてくれなかった。) また最初と最後に「 (スペース)」をいれているのは、 f. の考察同 様、「\s」が上手く動いてくれないため。 h.pan{c111097}% egrep "^山" Ruby/data_c111097.dat 山形市 Yamagata-shi 254487 ナナカマド ベニバナ 山辺町 Yamanobe-machi 15095 キャラボク リンドウ → 「^」はデータの最前列の先頭文字が一致するものを検索させるので、 「山」から始まる市町村が検索された。 i.pan{c111097}% egrep "ウ$" Ruby/data_c111097.dat 山辺町 Yamanobe-machi 15095 キャラボク リンドウ 西川町 Nishikawa-machi 6107 ブナ ミズバショウ 最上町 Mogami-machi 9665 ウメ リンドウ 大蔵村 Okura-mura 3707 ブナ リンドウ → 「$」はデータの最後尾の最後の文字が一致するものを検索させるの で、「ウ」で終わる花を市の花と制定している市町村が検索された。 使用した正規表現 ? : 直前の文字があってもなくても検索する -i : 大文字、小文字関係なく検索する [ ] : [ ] 内の文字のどれか一つと一致する場合検索する \s : 空白(スペース)を検索する \d : 文字を検索する 0-9 : 0~9を検索する(「-」はローマ字、仮名、漢字にも対応) ^ : データの最前列の先頭文字が一致するものを検索する $ : データの最後尾の最後の文字が一致するものを検索する 3.感想 日常で正規表現を使用しているのはExcelなどの計算ソフトではないか? 今回のプログラム問題を解いてみて、検索させるためにどのような正規表現を 用いれば良いのかで時間を使った。 実際に動かしてみて、上手く動かないことも多かったが、なぜ動かないのかを 自分で気付くことが出来たので良い経験になった。 ----------------------------- 高橋 岬 東北公益文科大学 2年 c111097@g.koeki-u.ac.jp -----------------------------