第6回 正規表現と検索 レポート課題 氏名:佐藤智久 学籍番号:C1110803 語学クラス:英語2 コース:地域共創コース 1.筆記問題 A.私の誕生日は 1992年 10月 11日 です。 これは10進数形式の誕生日なので、これを2進数表示と16進数表示の誕生日に 変換する。 今回は1992年を 0d1992 として計算する。 まずは2進数表示で表す。 最初に誕生年を2進数で表示させる。 値を2で割っていき、その余りが2進数表示の誕生日となる。 1992%2=0 996%2 =0 498%2 =0 249%2 =1 124%2 =0 62%2 =0 31%2 =1 15%2 =1 7%2 =1 3%2 =1 これに余った1を足して逆から読むと「11111001000」。 つまり 0b11111001000 となる。 次に誕生月を2進数表示する。 誕生年と同様の方法で計算していく。 10%2=0 5%2 =1 2%2 =0 これに余った1を追加し逆から読んで「1010」 よって 0b1010 である。 続いて誕生日の計算をする。 11%2=1 5%2 =1 2%2 =0 他と同じく余った1を足して「1011」 つまり 0b1011 となる。 結果として、私の誕生日を2進数表示で表した場合、 私の誕生日は 11111001000年 1010月 1011日です。 今度は16進数で誕生日を計算してみる。 初めに誕生年を変換する。 10進数から16進数への変換は2進数と似た方法で行なう。 10進数表示の値を16で割っていき、出た余りが16進数での値となる。 個の方法にしたがうと、 1992%16=8 124%16 =12 7%16 =7 126/16の余り「12」は16進数表示では「c」と表されるので、これを逆から 読むと 0x7c8 となる。 次に誕生月を変換する。 方法は誕生年と同様である。 10%16=10 16進数では「10」は「a」と表されるので、誕生月は 0x a となる。 最後に誕生日の変換を行なう。 これも上記と同様の方法である。 11%16=11 「11」は16進数では「b」となるので、誕生日は 0x b となる。 よって16進数に変換した場合は 私の誕生日は 7c8年 a月 b日 です。 となる。 B.まず、この問題ではAと同様に誕生年は 0d1992 とする。 初めに10進数表示での誕生日の合計を計算する。 1992 + 10 + 11 =2002 + 11 =2013 次に各項目を16進数で表示する。 これには先程のAの問題で答えた値を使用することができる。 1992年 → 7c8 10月 → a 11日 → b これらを10進数に変換する。 7 → 7*16**2 = 7*256 = 1792 c → c*16**1 = 12*16 = 192 8 → 8*16**0 = 8*1 = 8 a → a*16**0 = 10*1 = 10 b → b*16**0 = 11*1 = 11 これらの合計を計算すると、 1792 + 192 + 8 + 10 + 11 = 2013 16進数に変換した各項の和は2013 10進数表示で合計した値は 2013 これらは =(イコール) で結ぶことができる。 よって16進数に変換した各項の和と10進数表示での合計は同じである。 C.STDERRというメソッドをprint文に付ける理由は、プログラムを実行した際に エラーが発生した場合、ディスプレイにエラーが発生したことを知らせる メッセージを出力する必要があるため、print(f)としてプログラム中で表示 させるのではなく、画面に直接表示させるためである。 2.プログラム問題 A.今回私が作ったプログラム(ファイル)は、 「私の産まれた年から最近までのオリンピック柔道競技で金メダルを獲得した 選手の階級と名前、大会のあった年が記録されているdatファイル」 である。 左から 性別、階級、名前、名前(アルファベット表記)、大会の開催年 となっている B.以下に作成したデータファイルの内容を記述する。 C.このデータを使って、開催年に応じたメダリストを調べたり、どの階級で どの人物がメダルを獲得したのを調べたい。 D.分類に使う検索パターンは、 ・egrep "(男)子" data_c111080.dat を実行する。予想としては男子のメダリストのみが表示される。 ・egrep "hidehiko|tosihiko|tadahiro" data_c111080.dat を実行する。予想はこれらの文字列を含む項目が表示される。 ・egrep "0$" data_c111080.dat を実行する。結果は2000年でのメダリストが表示されるのではないか。 ・egrep "over*" data_c111080.dat を実行する。予想はoverと入力されている階級(超級)のみが表示される。 ・egrep "(tani|tamura)ryouko" data_c111080.dat を実行した。予想の結果は谷(田村)亮子選手の結果のみが表示される。 の5つを実行することにした。 E.Dの検索を実行した結果、 ・egrep "(男)子" data_c111080.dat pan{c111080}% egrep "(男)子" data_c111080.dat [~/Ruby] 男子 78kg 吉田秀彦 yosidahidehiko 1992 男子 71kg 古賀稔彦 kogatosihiko 1992 男子 71kg 中村兼三 nakamurakenzou 1996 男子 60kg 野村忠宏 nomurataddahiro 1996 男子 60kg 野村忠宏 nomuratadahiro 2000 男子 81kg 瀧本誠 takimotomakoto 2000 男子 100kg 井上康成 inouekousei 2000 男子 60kg 野村忠宏 nomuratadahiro 2004 男子 66kg 内柴正人 utisibamasato 2004 男子 over100kg 鈴木桂治 suzukikeiji 2004 男子 66kg 内柴正人 utisibamasato 2008 男子 over100kg 石井慧 isiisatosi 2008 ・egrep "hidehiko|tosihiko|tadahiro" data_c111080.dat pan{c111080}% egrep "hidehiko|tosihiko|tadahiro" data_c111080.dat [~/Ruby] 男子 78kg 吉田秀彦 yosidahidehiko 1992 男子 71kg 古賀稔彦 kogatosihiko 1992 男子 60kg 野村忠宏 nomuratadahiro 2000 男子 60kg 野村忠宏 nomuratadahiro 2004 ・egrep "0$" data_c111080.dat pan{c111080}% egrep "0$" data_c111080.dat [~/Ruby] 女子 48kg 田村亮子 tamuraryouko 2000 男子 60kg 野村忠宏 nomuratadahiro 2000 男子 81kg 瀧本誠 takimotomakoto 2000 男子 100kg 井上康成 inouekousei 2000 ・egrep "over*" data_c111080.dat pan{SATO Tomohisa}% egrep "over*" data_c111080.dat [~/Ruby] 女子 over78kg 塚田真希 tukadamaki 2004 男子 over100kg 鈴木桂治 suzukikeiji 2004 男子 over100kg 石井慧 isiisatosi 2008 ・egrep "(tani|tamura)ryouko" data_c111080.dat pan{c111080}% egrep "(tani|tamura)ryouko" data_c111080.dat [~/Ruby] 女子 48kg 田村亮子 tamuraryouko 2000 女子 48kg 谷亮子 taniryouko 2004 F.上記の結果から何故このようになったのか。 1つ目の検索は、括弧()を使用したことで、括弧内の指定した条件を優先的に 検索したからではないか。また括弧を検索した後に、その後ろに続く文字が ついているかどうかも調べた結果こうなったと考える。 2つ目の検索はhidehiko,tosihiko,tadahiroのいずれかに該当する項目がある かを検索した結果だと思われる。 3つ目の検索は末尾の文字が「0」がどうかを検索した結果ではないか。 ここで少し気になったのは、このデータファイルの場合、階級でも 数値を使用しているため、階級で末尾が0の場合でも検索結果に反映される のではないかということだ。しかし結果を見る限り、その様子は見受けられな い。続きはGの項目で記述することにする。 4つ目の検索はoverの後に文字列が続くかどうか検索した結果がきちんと表示 された結果だろう。しかし、over(超級)を調べる場合にはこの検索以外にも 方法はあるのではないかと思った。 5つ目の検索はメディアでも話題に上がった「谷でも金、田村でも金」という ものを検索した結果だ。これも正常に検索がかけられている。 しかし、4と同様にこれも他に方法があるように感じた。 G.今回利用した正規表現 ・() / parenthesis : 括弧内で括られた条件を先に探す。 ・| / vertical line : パイプともいう。「または」という意味を持つ。 ・$ / doller : 末尾の文字列のみを探して調べる。 ・* / asterisk : 文字列の出現は何回でも良い。 また、気付いたこととして3つ目の検索での数値が2つある場合の反映のされ方 が挙げられる。授業内でも前回の課題でも数値の項目は1つしか扱っていなかっ た。しかし今回2つの項目に数値を使ってみて、ある疑問が浮かんだ。 「データファイルで2つの項目にそれぞれ数値を使った場合、検索条件に適用 されるのはどちらなのか」ということだ。 上記でも記述したように、数値に関する検索を掛けた場合、私の考えとしては どちらにも検索が掛けられると考えていた。しかし結果からは一番後ろの数値 にしか検索は掛けられていなかった。 このことから、データファイルでの数値は一番後ろのものしか適用されないの ではないか、という考えが浮かんだ。 これについては今後も遭遇することになると思うので、調べておくことにする。 3.感想 今回の課題は私達が普段使っている検索サイトなどで使用されていると思われ る検索の方法についてだったが、正直これほど長くて複雑なものだとは思って もいなかった。人によってはそれほど難しくはないのかもしれないが、きちん と検索が掛けられていると思っても実際はミスがあったり、酷いときには検索 すら実行できなかったからだ。 検索は今後も多用し、使う場面もあると思われるので、中途半端に投げ出さず にしっかりとおぼえておくようにする。 また、自分の持ち物や考え方で正規表現を使用しているものについてだが、 私達の「思い出す」という行動(考え方)にも正規表現が使用されていると思う。 何があったか?→どこで?→誰と? といった風に、条件に合う記憶の断片を記憶のなか(データファイル)から探し ているからだ。 4.参考文献 第6回 正規表現と検索 レポート問題 : http://roy/~madoka/2012/r1/06/rpt/rpt.html 第6回 「うろ覚えの検索」 : http://roy/~madoka/2012/r1/06/r1_06_03_theme_01_patternmatching.html 第6回 「何回か繰り返されている文字を探したい」 : http://roy/~madoka/2012/r1/06/r1_06_04_theme_02_repetation.html 第6回 「いくつかある候補を探したい場合」 http://roy/~madoka/2012/r1/06/r1_06_05_theme_03_or.html 第6回 「1文字違い」 : http://roy/~madoka/2012/r1/06/r1_06_06_theme_04_onecharacter.html 第6回 「ひらがなを検索するには」 : http://roy/~madoka/2012/r1/06/r1_06_11_theme_08_hiragana.html 5.共同学習者 渡部十夢 及川慎司 小野貴己 遠藤拓磨 斎藤航平 斎藤允貴