*正規表現を用いたテキストデータの一括検索・置換 [#h66227a1]

#contents

**第4回授業の獲得目標: &worried; [#x402d0f5]
+&size(14){''ウェブページ経由で送信されるデータを知り、セキュリティに関心を持つ''};
+&size(14){''大量データ一括処理には検索・置換が有効であることを理解する''};
+&size(14){''正規表現とはどのようなものかを理解し、テキストエディタによる正規表現検索、置換の便利さを実感する''};
+&size(14){''テキストエディタとエクセルの間でのデータの共有方法を習得する''};


**【セキュリティ】ウェブページ経由で送信されるデータ: ⌣ [#w3d77f8b]
私達は日常的にインターネットを、様々な方法で利用している。ネットを利用する場合、多くの場合、
-検索サイト使ってキーワード検索
-表示されたリンクをクリックして、ウェブページを表示
-掲示版やコメント欄では、キーボードから文字を入力することもある

このとき、インターネット上のサーバと、自分の使っているコンピュータの間で、どのような通信記録が残るか知っているだろうか?今日、最初のグループワークがmoodleにあるので見て欲しい。
-''演習1(出席確認演習)''
--http://bean.bio.chiba-u.jp/moodle24/ にある''演習1''を見て、そこに書かれた質問項目について、グループディスカッションを5分程度行い、その後、自分の判断を各自がmoodle経由で送信しよう。(%%%送信しないと出席と見なされないので注意!%%%)

***ログファイル [#e25fc86d]
皆さんがインターネット上のページは閲覧するとき、自分がそのページを見ているなんて誰も知らないと思っているかもしれないが、実は、%%%どのパソコンを経由して、どのページが閲覧されたかということは、すべてログファイルに記録されている%%%。
~例えば、この授業ではmoodleを使ってレポートを提出してもらっているが、moodleからは次のような情報が閲覧できる。
--金 2012年 04月 27日 15:50 	172.xx.xx.xx 	XXXXXXX	quiz view 	課題3. テキストデータの検索・置換 【予習課題】
--金 2012年 04月 27日 15:50 	172.xx.xx.xx 	XXXXXXX	quiz close attempt 	課題3. テキストデータの検索・置換 【予習課題】
--金 2012年 04月 27日 15:50 	172.xx.xx.xx 	XXXXXXX	quiz continue attemp 	92
--金 2012年 04月 27日 15:47 	172.xx.xx.xx 	XXXXXXX	quiz attempt 	課題3. テキストデータの検索・置換 【予習課題】
--金 2012年 04月 27日 15:47 	172.xx.xx.xx 	XXXXXXX	quiz view 	課題3. テキストデータの検索・置換 【予習課題】
--金 2012年 04月 27日 15:47 	172.xx.xx.xx 	XXXXXXX	course view 	H24_情報処理
--金 2012年 04月 27日 15:47 	172.xx.xx.xx 	XXXXXXX	quiz view 	課題2. プロファイルの編集
--金 2012年 04月 27日 15:47 	172.xx.xx.xx 	XXXXXXX	quiz close attempt 	課題2. プロファイルの編集
--金 2012年 04月 27日 15:47 	172.xx.xx.xx 	XXXXXXX	quiz continue attemp 	93
--金 2012年 04月 27日 15:46 	172.xx.xx.xx 	XXXXXXX	quiz attempt 	課題2. プロファイルの編集
--金 2012年 04月 27日 15:46 	172.xx.xx.xx 	XXXXXXX	quiz view 	課題2. プロファイルの編集
--金 2012年 04月 27日 15:46 	172.xx.xx.xx 	XXXXXXX	course view 	H24_情報処理

こういう記録のことを、'アクセスログ''と呼ぶ。また、moodleに限らず、インターネットを介してウェブサーバにアクセスすると、ウェブサーバには、
 access_log 
というファイルができる。~
-''デモ'': 教員のパソコンから、サーバに接続し、アクセスログを見せてみる。
~
-このファイルの中身は''テキストデータ''(今、勉強中の文字データのこと)で、次のような情報が書かれている。
 192.29.8.70 - john [30/Apr/2009:15:41:26 +0900] "POST /joho/index.php HTTP/1.1" 
  200 18644 http://bean.bio.chiba-u.jp/joho/index.php?joho21%2FXXXXXX "Mozilla/5.0 
  (Windows; U; Windows NT 5.1; ja; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8"
 192.29.8.69 - tom [30/Apr/2009:15:42:18 +0900] "POST /joho/index.php HTTP/1.1" 
  200 6124 http://bean.bio.chiba-u.jp/joho/index.php?joho21%2FXXXXXX "Mozilla/4.0 
  (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)"
 192.29.8.69 - tom [30/Apr/2009:15:43:17 +0900] "POST /joho/index.php HTTP/1.1"
  302 - http://bean.bio.chiba-u.jp/joho/index.php?cmd=edit&page=joho21%2FXXXXXX
  "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)"
 192.29.8.70 - jane [30/Apr/2009:15:43:39 +0900] "POST /joho/index.php HTTP/1.1" 
  302 - http://bean.bio.chiba-u.jp/joho/index.php?cmd=edit&page=joho21%2FXXXXXX 
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8"
 192.29.8.1 - jane [30/Apr/2009:15:52:38 +0900] "POST /joho/index.php HTTP/1.1"
  200 18516 http://bean.bio.chiba-u.jp/joho/index.php?joho21%2FXXXXXX "Mozilla/5.0
  (Windows; U; Windows NT 5.1; ja; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8"
 192.29.8.50 - john [30/Apr/2009:15:52:42 +0900] "POST /joho/index.php HTTP/1.1"
  200 6124 http://bean.bio.chiba-u.jp/joho/index.php?joho21%2FXXXXXX "Mozilla/5.0 
  (Windows; U; Windows NT 5.1; ja; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8"
 192.29.8.8 - john [30/Apr/2009:15:52:45 +0900] "POST /joho/index.php HTTP/1.1"
  200 6124 http://bean.bio.chiba-u.jp/joho/index.php?joho21%2FXXXXXX "Mozilla/5.0 
  (Windows; U; Windows NT 5.1; ja; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8"
 192.29.8.50 - tom [30/Apr/2009:15:52:47 +0900] "POST /joho/index.php HTTP/1.1" 
  200 6124 http://bean.bio.chiba-u.jp/joho/index.php?joho21%2FXXXXXX "Mozilla/5.0 
  (Windows; U; Windows NT 5.1; ja; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8"
 (IPアドレス等のデータは適当に変更してある)
この中の''IPアドレス''というのは、インターネットに繋がっているコンピュータ1台1台につけられた、番号のことだ。
~
つまりログファイルを見れば、いつどのコンピュータから、ウェブサーバのどのページにアクセスがあったのか、さらには、どんな文字が入力されて送信されてきたかが分かってしまう。~
さらに、大学などのネットワークでは、学内のどのコンピュータから、学外のどのコンピュータにアクセスがあったかということも、全てログファイルに残っている。自分がインターネットを介してどのページにアクセスしたかは、ネットワークの管理者ならば知ることができるということは覚えておこう。~
試しに、下のリンクにしてみよう~
~
&size(14){http://seki.jpn.org/ssi/env.html};~
皆さんのコンピュータから、インターネットを介して送信されている情報の一部が、表示されるだろう。~
ただ、こういう情報が送られることに心配する必要は全く無い。これらの情報は、インターネットを介した接続を正常に行うためにやりとりされているものであって、IPアドレスが分かったからといって、個人が特定される訳では無い。しかし、刑事事件などの大きな問題があって、警察などからサーバの管理者に情報公開の要請があった場合は別だ。~
また、プロキシーサーバを中間におけば、自分のコンピュータのIPアドレスを或る程度は隠すことができる。しかし、信用できるプロキシサーバを使わないと、かえって、自分が送受信している個人情報を、第三者に知られてしまうことにもなりかねない。


**大量データ一括処理には検索・置換が有効!!⌣ [#m8d8b057]
前回授業では、K2Editorというテキストエディタを使って、テキストデータの検索・置換を体験してもらった。「検索・置換」がよく分からなかったという人もかなりの数いたので、もう一度簡単におさらいしておこう。(前回授業を「おそい」と感じた人は、この部分は飛ばしてもいい。今日の課題でもやっていてほしい)。
-&color(brown){''★★朗報★★'' K2K2EditorはWindows8でも使えました。調べてくれた人、ありがとう!};

***''おさらい''<時間によってはここはスキップ>: 検索と置換 はいろんなソフトウェアで使える 便利技 [#rc1a1566]
コンピュータはとても便利だが、扱うデータがすぐに膨大になってしまい、人間の頭だけでは情報の整理が追いつかなくなることがある。例えば、コンピュータの中から自分の必要とするファイルを見つけ出すのは、一つ一つフォルダを目で探すと、けっこう時間のかかる作業になってしまう。そんなとき便利なのが、前回学習した
 検索 と 置換
だ。下に演習を3つ用意しておいたので、各自、やってみて欲しい。
-''演習1'': ブラウザからの文字列の検索~
今見ているこのページの中で、「置換」という文字列を探してみる。「編集」メニューから「検索」を選び(あるいは、コントロール+Fキー)、「置換」と入力。
-''演習2'': スタートメニューからのファイルやプログラムの検索~
スタートメニューからファイルやプログラムの検索のところに、探したいファイル名の一部を入力してみる。~
&ref(授業/H23/情報処理/04/Untitled-1.gif);
-''演習3'': MS Word内の文書で検索と置換~
右のファイルを開き、Wordの検索機能を使って、「芋」  という文字列を探す。 &ref(授業/H23/情報処理/04/example1.docx);~
また、その文字列を「茶」 に置換する。~
''発展演習'': 「粥」という文字を「飯」という文字に置換すると同時に、置換された文字の色を&color(red){赤色};にする。
-''演習4'': MS Excelの文書内での検索と置換~
右のファイルを開き、Excelの置換機能を使って、「使っていない」という文字を「ない」に置換する。  &ref(./example_4_1.xls);
 検索と置換は、ほとんどのソフトウェアで使える基本技だ
 大きい文書の中で特定の文字を探したいときなどは、すぐに検索しよう
 また、同じ文字をいくつも変更する場合は、置換しよう

***K2Editorでの検索・置換 :【復習】 [#r5cad644]
同じように、検索・置換をK2Editorでやってみよう。この後、正規表現を使った検索置換を勉強するが、まずは、通常の置換から。
+K2Editorを立ち上げて、下の囲みの中のテキストをコピー・ペースト
   Lumpty   Dumpty  sat   on a wall.
   Lumpty   Dumpty  had  a great    fall.
   All the  king's horses and   all the king's men
   Couldn't put   Lumpty    together again. 
このテキストの中のLumptyは実はスペルミスで、Humptyだった。そこで、全てのLumptyをHumptyに修正したい。~
数が少なければ手作業でやってもいいが、こういうときには、迷わず、一括検索・置換。
+メニューバーの「検索」から「置換」を選んで、検索ウィンドウを開き、検索語と置換語を入力
 検索語: Lumpty
 置換語:  Humpty
(大文字小文字の区別、ファイルの先頭からの横のボックスをチェックすることも忘れずに。正規表現をチェックしてあっても、この場合は影響は無い)
+''「全置換」''のボタンをクリックすると、対象としているテキストの中から、「Lumpty」が全て検索され、「Humpty」に置換される。
~
こんな簡単な操作だが、大切なのは、
~&size(16){&color(brown){''非常に大きなデータファイルであっても、検索・置換は一瞬にして終わる''};};
~ということだ。もし検索・置換をやらなかったとしたら、
 1行ずつ目で検索語を探し、
 見つかった検索語を消して、置換語を1つずつペーストする
~なんていう面倒なことをしなくてはならない。

***もう1つの演習: テキストデータをタブ区切りにして、エクセルで閲覧 [#sc0f4c8d]
前回授業でやったもう一つの大事な点は、
 タブで区切られたテキストデータをエクセルにコピーペーストすると、マス目の1つ1つにうまく収まる
ということだ。~
''タブ''というのは、キーボードの左端にある「Tab」と書かれたキーを押すことで入力できる、ある種の空白文字のことだ。この空白文字の扱いはアプリケーションソフトの種類によって異なっており、
-テキストエディタ: スペースよりも広い空白が挿入
-MSワード: スペースよりも広い空白が挿入される。ルーラーで幅を変えられる
-MSエクセル: タブキーを押すことによって、カーソルを一つ右のセルに移動できる

~
では、下のデータ(東葛地域における空間放射線量の測定結果 単位は μSv/h。http://www.pref.chiba.lg.jp/taiki/press/2011/230602-toukatsu.htmlから抜粋)を使って実際に操作してみよう。操作の流れは、
-1.下の囲みの中のデータをコピーしてK2Editorにコピー・ペースト
-2. K2Editorで 半角のコンマ(,) を 全てタブに置換する
 検索語: ,
 置換語: タブ (編集画面で1つタブを入力し、それをコピーして、置換語を入力する場所にペースト)
-3. 一括置換できたら、全てを選択してコピーして、エクセルにペースト

これだけの数の検索・置換も、一瞬で終わるはずだ。~
作業が終わったら、放射線量の順に並び替えてみよう
 測定値*(μSv/h) ,,,,
 測定地点名,地上 1.0m,地上 0.5m,地面の形状 ,測定日天候
 野田市桐ヶ作(二川小学校),0.09,0.1,土,5月31日晴
 野田市野田(野田幼稚園),0.13,0.13,土,5月31日曇り
 野田市木野崎(福田保育所),0.23,0.25,土,5月31日晴
 柏市松葉町(松葉第一公園),0.49,0.54,土,5月31日晴
 柏市千代田(千代田町公園),0.42,0.47,土,5月31日晴
 柏市大津ヶ丘(大津ヶ丘中央公園),0.33,0.35,土,5月31日晴
 我孫子市白山(我孫子第四小学校),0.3,0.31,土,5月31日曇り
 我孫子市中里(湖北小学校),0.2,0.2,土,5月31日晴
 我孫子市布佐平和台(布佐南小学校),0.35,0.33,土,5月31日晴
 松戸市常盤平西窪町(常盤平保育所),0.18,0.19, 土,6月1日曇り 
 松戸市小金(小金保育所),0.24,0.24,土, 6月1日曇り
 松戸市二十世紀が丘梨本町(二十世紀公園),0.34,0.36, 芝生, 6月1日曇り
 流山市江戸川台東(江戸川台保育所),0.24,0.26, 土, 6月1日曇り
 流山市流山(流山小学校),0.32,0.34, 土, 6月1日曇り
 流山市名都借(名都借保育所),0.28,0.28, 土,6月1日曇り 
 鎌ケ谷市粟野(北部小学校),0.27,0.29, 土,6月1日曇り 
 鎌ケ谷市中央(鎌ヶ谷小学校),0.24,0.25, 土,6月1日曇り 
 鎌ケ谷市道野辺中央(道野辺保育園),0.17,0.17, 土, 6月1日曇り  

~以上のように。&size(16){&color(brown){''大量データの処理に、検索・置換は非常に有効!!''};};であることは、忘れないでおこう~


**正規表現と友達になろう ⌣ [#z78a3b46]

上の例では、 HumptyをLumptyに置き換えるという、ごく簡単な操作を行った。では、もっと複雑な処理をするにはどうすれば良いか?たとえば、前回の課題を考えてみよう。
   Humpty Dumpty sat on a wall.
   Humpty Dumpty had a great fall.
   All the king's horses and all the king's men
   Couldn't put Humpty together again. 
という内容のテキストに対して、
-1. 「空白以外の任意の文字が任意の数だけ連続して『pty』を含む文字列」を全て「Pumpty」に置き換えると、上のテキストはどうなるか?
-2.「空白以外の任意の文字が1つ以上連続した後にallが続く'文字列」を全て「ball」に置換すると、対象とするテキストはどうなるか?
-3. 改行文字(画面には表示されていないけれど、改行を指定している文字コード)を全て削除すると、対象とするテキストはどうなるか?
-4. テキスト中の「タブ」(授業で説明したタブコードのこと)を全て半角スペースに置き換えると、上のテキストはどうなるか?

前回課題の内容は、「」の中の言葉の意味を考えてもらうことがポイントだった。例えば、
  「空白以外の任意の文字が任意の数だけ連続してptyを含む文字列」
とはどういうものかというと、上の例では、
 Humpty
 Dumpty
がそれに対応する。他にどんな文字列が 「空白以外の任意の文字が任意の数だけ連続してptyを含む文字列」になりうるか、自分で考えてみよう。
 当てはまる語: "empty"  "ptylos"  "optymous"
 当てはまらない語: "emp ty"  "puty"  "Ptylo"(大文字・小文字を区別しない場合は当てはまる)

「空白以外の任意の文字が任意の数だけ連続してptyを含む文字列」という表現がどうして便利かというと、もし、この表現で検索文字を指定できたら、上のテキストに対して1回の置換操作で、HumptyDumptyの両方をPumptyに置換できる。~
こういう便利な表現が、&size(16){正規表現};だ。

~正規表現はIT用語辞典によると、
 文字列のパターンを表現する表記法。文字列の検索・置換を行なうときに利用される。
検索や置換で文字そのものを検索・置換するのでは無く、%%%パターンを検索・置換するもの%%%ということだ。(「正規」という言葉に特に意味があるわけでは無いので、気にしなくてもよい)~
正規表現による検索・置換はテキストエディタを利用する醍醐味であると言える。~
&size(14){習得できれば、大学生活中も、社会に出てからも、様々な場面で役立つこと間違いない!、なぜなら、};
~&size(16){手作業で一つ一つ繰り返さなければならない作業が、&color(blue){''検索パターン''};と&color(blue){''置換パターン''};を考えるという知的作業に一変する};
~この授業で是非とも習得して欲しい。

***正規表現の演習1: [#dad60f54]
   Humpppppty Dumpppppppty sat on a wall.
   Humpppty Dumpppppty had a great fall.
   All the king's horses and all the king's men
   Couldn't put Humpppppppppppty together again. 
上の テキストをみると、pがたくさん連続している場所があることが分かる。どうも、手入力するときに、"p"をいくつも連続で入力してしまったようだ。~
%%%2つ以上pが連続しているところは、全てpを1つにしたい。%%%~
そんなとき、例えば
 1回目
 検索語:pp
 置換語: p
 2回目
 検索語:pp
 置換語: p
という検索置換を何度も繰り返すのも1つの手ではあるが、これを正規表現で行う手を考えて欲しい。

-''演習2: グループワーク'':  上のテキストから、「どのような&color(blue){''検索パターン''};」を探し出して、「どのような&color(blue){''置換パターン''};」に置換すれば、1回の検索・置換の操作で、連続するpが全て1つになるか、グループで相談してみよう。~
いくつかの班には答えて貰う。

//次のような正規表現を使えば、1回で処理が済む
// 検索語:  p+
// 置換語:  p
//ここで出てきた
// +
これから使う+という記号は、正規表現の基本表現のうちの1つだ。この"+"の意味は、
 直前のパターン(文字そのものや、正規表現で表された文字列)の1回以上連続するもの
ということだ。例えば、
 an+d
という正規表現は、
 and
 annd
 annnnnnnnnnnd
には一致するが(このことを、「マッチ」するという)、~
 ad
 add
 adn
などには一致しない。

***正規表現の演習2: + を使って連続するアンダーバー(_)を一括検索・置換 [#lda07ba2]
 Humpty__Dumpty__sat______on_a_wall.
 Humpty____________Dumpty__had__a_great____fall.
 All_the__king's_____horses_and___all_the______________king's_men
 Couldn't_put___Humpty____together_________________again.
この演習では、スペースの代わりにアンダーバー(_)を用いている。(というのは、検索・置換文字列を説明するときに、スペースは画面に表示されないため、説明しにくいから)~


-''演習3: グループワーク'':  上のテキストで、「半角アンダーバーが2つ以上連続しているところは、全て半角アンダーバー1つにしたい。」~
これを正規表現を使ってやるにはどうすれば良いか。先ほどのグループで、相談してみよう。~
いくつかの班には答えて貰う。
---ヒントは、
|&size(16){_+};|



***他の正規表現も見てみよう: K2Editorのヘルプファイル [#g4acdaf1]
正規表現には、上に示した以外にも様々な命令がある。K2Editorを立ち上げて、メニューバーからヘルプを表示させ、画面をスクロールして検索・置換に関する説明を見ると、正規表現について様々なことが書いてある。ヘルプにある説明はかなり分かりやすく書かれているのだが、これまで全く正規表現に触れたことの無い人が、この説明を理解するのは不可能だろう。前回の予習課題は、ヘルプファイルに書かれているような言葉の意味を考えて貰ったものだ。そこで、ヘルプファイルから、重要な点をいくつか抜き出して、例をあげて説明する。
~注) 例年、「マッチする」という言葉が分かりにくいという質問が出るので、下に正規表現を使った検索語がマッチする場合と、マッチしない場合の例を挙げておく。
 正規表現を使った検索語:  an+d (意味:aで始まり、nが1回以上、任意の数繰り返し、dで終わる文字列)
 上の検索語にマッチする文字列の例: and, annd,  annnd, annnnnnnnnnnnnnnnnd
 上の検索語にマッチしない文字列の例: ad, aid, acid, answered

-よくつかう正規表現
|&size(16){.};| 注:半角ドット1つ| (改行以外の) すべての文字にマッチする|
||| 例: a.d|
||| aで始まり、つぎになにか1文字つづき、dで終わる文字列。|
||| 「and」「add」「a漢d」などがマッチする。|
|&size(16){*};| 注:アスタリスク1つ|直前のパターンに0回以上の連続にマッチ|
||| 例: an*d    |
|||aで始まり0回以上のnの繰り返しを含みdで終わる文字列。|
||| 「ad」「and」「annd」などがマッチする。|
|&size(16){+};| 注:プラス記号1つ| 直前のパターンに1回以上連続でマッチ|
||| 例:    an+d    |
||| aで始まり1回以上のnの繰り返しを含みdで終わる文字列。|
||| 「and」「annd」はマッチするが「advance」「add」などはマッチしない。|
|&size(16){[...]};| 〔〕の中の文字のグループ| 複数の文字を指定してもいいし、「-」で範囲や、「^」で否定をあらわす|
||| 例:   [abc]          |
||| 文字a,b,cのどれかに一致する文字 |
||| 上に挙げた「+」と組み合わせて使われることが多い |
||| 例:  [abc]+ |
||| 「abc」  「abacabcb」  「cccaaabbb」などがマッチ |
||| 例:   [a-z]+    半角英文字小文字のみからなる文字列 |
||| 例:  [A-Za-z0-9]+   半角英数字のみからなる文字列 |
||| [の次ぎに^をいれると、「文字集合以外」 をあらわすことができる。 |
||| 例:   [^a-z]+      半角英数字以外の文字からできている文字列 |
||| 文字aからz(半角小文字)以外の文字にマッチ。 |
|&size(16){ ''\t''}; (あるいは ¥t )| | ''タブ''	<<エクセルとの合わせ技に必須!>>|
|&size(16){ ''\n''};(あるいは ¥n)| | ''改行''|
|^||行の先頭位置を表す|
|$||行の終わりの位置を表す|
-&color(red){注:};日本語キーボードでは、\は半角の¥マークです
※:上の解説はK2Editorのヘルプファイルとマック版JeditXのヘルプファイルを参考にして作成した。MS Wordのワイルドカード検索も正規表現の文法にかなり近いものを使っている。~
 
***正規表現を使った演習問題 3・ [#t491dcc2]
-次の囲みの中のテキストデータを、K2Editorの新しいページにコピー・ペースト
   Humpty   Dumpty  sat      on a wall.
   Humpty   Dumpty  had  a great    fall.
   All the  king's horses and   all the king's men
   Couldn't put   Humpty    together again. 

-1. 上のテキスト中、 "pty" で終わる単語を全て"Pumpty"に置き換える。
--ヒント: 半角スペース以外の文字の連続を表す正規表現は、
 [^ ]+
-2. 上のテキスト中、 "all" で終わる単語を全て"ball"に置き換える。
-3. 上のテキスト中、大文字で始まる単語を削除する
--ヒント: 大文字で始まる単語はこの場合
 [A-Z][^ ]+
-4. 上のテキスト中、小文字を全て削除する
--ヒント 小文字全ては
 [a-z]+

***正規表現を使った検索・置換の練習2⌣ [#if8455e3]
※一緒に操作すること。今回復習課題に出す操作の多くが含まれている。なお、ポイントは~
        &size(16){テキストデータにおける"タブ"はExcelの"カラム(列)の区切りに相当する};
~ということ。タブで区切られたテキストデータは、エクセルにコピー・ペーストすることで、カラム(列)で区分されたデータとして扱う事が出来る。~
 &ref(授業/H19/情報処理/05/Untitled-1.gif); というテキストをコピーして、エクセルにペーストすると、&ref(授業/H19/情報処理/05/Untitled-2.gif); 
-練習: 下の囲みの中のデータはタブで区切られたテキスト。コピーして、エクセルにペースト(貼り付け)してみよう
 リンゴ	ミカン	ナシ
 スイカ	モモ	ブドウ
 サクランボ	イチゴ	バナナ
--※エクセルできれいな表として貼り付けられなかった場合、一度、K2Editorにペーストしてから、再度コピーし、エクセルにペーストしてみよう。
-練習: 下の囲みの中のデータは複数の半角空白で区切られたテキスト。コピーしてそのままエクセルにペーストしても、きれいな表にはならない。そこで、正規表現を使って、複数の空白をタブ1つに置換してみよう。~

 リンゴ     ミカン       ナシ
 スイカ   モモ       ブドウ
 サクランボ  イチゴ        バナナ
--問題:複数の半角空白の連続を表す正規表現は何か?置換文字に指定する文字は何か?
-方法:
+K2Editorを開いて、新規ページに上のデータをペースト
+データの並びをじーっと見る
 リンゴ     ミカン       ナシ
+下のようなパターンが見えてくる
  リンゴ<複数の半角空白の連続>ミカン<複数の半角空白の連続>ナシ
~<複数の半角空白の連続>をタブに置き換えればいいということだから、
+正規表現検索・置換を使って
 (正規表現チェック)
 検索文字 [ ]+
 置換文字 \t
+全体を選択してコピーする。
~&size(14){  ここまででK2Editorでの操作は終わり。次はエクセルでの操作 };
+エクセルで新しいページを開き、左上角のセルをクリックして、
+ワークシートの中の左上のセルをクリックして、ペースト。【''&color(brown){テキストファイルのデータをエクセルに移動できた};''】

**テキストファイルとエクセルの間でのデータのやりとり⌣ [#ufb2f2ff]
いまやった操作は、テキストデータをK2Editorで編集して、エクセルの表にしたというもの。皆さんは簡単にできたけど、実はわりと高度な技。千葉大生100人に聞いて、10人知っているかどうか。。。
~これほど世の中でパソコンが普及していても、大半の人は、テキストファイルを編集したことが無いみたい。だから、タブ区切りテキストとエクセルのセルの関係も知らない人が大勢いる。~
~今後、皆さんは学習や研究の過程でいろんなデータを扱うことになるが、
~      %%%&size(16){''テキストデータにおけるタブはエクセルのセル間の区切りに対応する''};%%%
~ということを知っているだけで、~
~      &size(16){''大量のデータの一括処理処理やデータの書式統一がとても楽になる''};&bigsmile;~
~一つ一つコピー・ペーストしたり、目で探しだすのもいいけれど、テキストエディタによる一括整形でラクしたいものだ。
----
**''今日の授業が遅いと感じてヒマな人向けの解説'': 発展的な正規表現:後方参照への挑戦''⌣ [#a9277943]
この項目は、次週学ぶ予定のものだが、もし、今日の授業でヒマをもてあましている人がいたら、ぜひ、正規表現の後方参照を理解して、使いこなせるように自習してほしい。後方参照はK2Editorのヘルプによると、次のように書かれている。
 後方参照
 正規表現の中で()を使ってグループ化された部分にマッチ文字列は、 \1,\2などの表現で、
 再度正規表現の中に埋め込むことが可能です。 
 \の後ろに続く数字は、何番目のグルーピングされた文字列かを示します。 
 たとえば、(\w+)[ ]+\1 は "ABC ABC"や"ppp ppp"に対してマッチしますが、 
 "ABC ppp"にはマッチしません。 
 \の後ろに続く数字には制限はありません。ただし、1〜9までは常に後方参照と解されますが、
  \10以降は、その後方参照に対応するグループがない場合は、8進数のコントロール文字と
 解されますので注意が必要です。 
 また、本当に一桁の8進数のコントロール文字を書く場合には、 \001などという風に書きましょう。 
 (K2Editorのヘルプファイルから後方参照の部分を抜粋)
ちょっと分かりにくいかも知れないが、半角の
 ()
の中で指定したパターンにマッチした文字列を、
 ¥1
などという記号を使うことで、呼び出すことができるということだ。~
まず簡単な例で操作をしてみよう
 テキストデータ: A9JA49K6  に対して、
 1. Aの次の1文字と、Kの次の1文字をすべて削除したい。
 2. Aの次の1文字と、そのAの並び順を入れ替えたい。
というような問題があったとする。~
K2Editorで実際に試してみると:
 テキストデータ  A9JA49K6
 ・AかKの次の1文字を削除
   検索文字列 ([AK]).
   置換文字列 ¥1
 ・Aに続く1文字とAの順序入れ替え
   検索文字列 (A)(.)
   置換文字列 ¥2¥1

***書籍リストを出版年順に並び替える [#ncf4694c]
では、もう少し具体的な例をつかって、段階的に説明してみよう。~
まず、次のような書籍のリストがある。このリストを、K2Editorで開いてみよう。&ref(授業/H22/情報処理/06/書籍リスト.txt);~
-次のようなリストが入っているはずだ(一部のみを表示)(データは、[[生物科学ニュースホームページhttp://bsj.or.jp/nc2/htdocs/]]から拝借した)。~
・絵でわかる細胞の世界 黒谷明美著,講談社,2001年,162ページ,2,000円~
・細胞工学別冊 植物細胞工学シリーズ19 新版 分子レベルから見た植物の耐病性 島本 功・渡辺雄一郎・柘植尚志 監修~
・琉球弧の成立と生物の渡来 木村政昭編著,沖縄タイムス社,2002年,206ページ,8,200円~
・植物ゲノム機能のダイナミズム  —転写因子による発現調節— 岩淵雅樹・篠崎一雄編,シュプリンガ−・フェアラーク東京,2001年,256ページ,5,000円~
・森林の環境・森林と環境 地球環境問題へのアプローチ 吉良竜夫,新思索社,2001年,358ページ,3,800円~
・植物の観察と実験を楽しむ−光と植物のくらし− 松田仁志著,裳華房,2004年,159頁,1,600円~

***まずは、これまでに習った正規表現で、どこまで解決できるか考えてみる [#zc309a30]
このリストには、出版年が含まれているにも関わらず、出版年の順番に並んでない。どうすれば、出版年で並び替えられるだろうか?~
リストをよく見てみると
 タイトル・著者,出版年,ページ・価格
という順番で並んでいる。ここで、
 出版年だけを切り出して、
 出版年 <タブ> タイトル・著者,出版年,ページ・価格
というリストを作り、エクセルにペーストして
|出版年| タイトル・著者,出版年,ページ・価格|
という表を作り、出版年で並び替えれば良いということまでは、想像できるだろう。~
では、出版年だけを切り出すにはどうすればいいだろうか?
まず、[[これまでにならった正規表現>http://bean.bio.chiba-u.jp/lab/index.php?%E6%8E%88%E6%A5%AD%2FH22%2F%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%2F04#b81c6886]]で表現できるところだけを書いてみると、
-ファーストネームは、行の先頭から始まって、空白で終わる文字列だから、これまでに習った
 ^     は行の先頭を表す
 [0-9]+年    は、数字の出版年を表す
 .*,   は全角の,で終わる任意の文字列を表す
 $   は行の終わりを表す
これらを組み合わせて、
 ^.*,[0-9]+年.*$
で1行の情報全てを表せるだろう。
~
なので、例えば、
 検索文字列: ^.*,[0-9]+年
で、
 ・琉球弧の成立と生物の渡来 木村政昭編著,沖縄タイムス社,2002年
 ・植物の観察と実験を楽しむ−光と植物のくらし− 松田仁志著,裳華房,2004年
 .....
という出版年で終わる文字列は表せるけれど、これを年度に置換するときには、
 置換文字列:  2002年
        ^^^^
今まで習った通りだと、%%%何か置換文字列を指定しなければならない%%%。~
上の例だと、
 2002年
 2004年
 ....
という異なる年度に置換したいので、一度の置換ではできそうにない。~
~
もしも、このとき、最初の行で、当てはまった「2002年」をどこかどこかにコピーして保存しておいて、自分の置換文字列に指定できれば、いいだろう。~
この、
 検索文字列と一致した文字列を保存しておいて、置換文字列に使う
ということをやってくれるのが、''後方参照''だ。
~前置きはともかく、まずやってみよう。新しく登場するのは、
 ( ) 半角のカッコで、検索文字列を囲んでおくと
 置換文字列に半角の¥マークと数字を使うことで、 (例: ¥1  ¥2  こんな風に)
 上でカッコで囲んだ検索文字列を呼び出せる。
  では、上の書評リストを出版年と出版年以外のパートに分けて、カッコで囲んでみよう
 ^(.*,)([0-9]+年)(.*)$
こうすることで、検索文字列で使われた( )内の文字列を、左から順番に置換文字列として指定することができる
 (.*,)      → \1
 ([0-9]+年)  → \2
 (.*)      → \3
具体的に上の例の1行目で考えると
 ・絵でわかる細胞の世界 黒谷明美著,講談社, → ^(.*,)    → \1
 2001年                    → ([0-9]+年) → \2
 ,162ページ,2,000円             → (.*)$    → \3
-''演習:1'' 今までの解説に従って、添付の書籍リストで後方参照による検索置換を行って、
 出版年 <タブ> タイトル・著者,出版年,ページ・価格
に置き換えてみよう。

--答え:
+++K2Editorに上のリストをコピーする
+++置換ウィンドウで、次のように指定する
 検索文字列: ^(.*,)([0-9]+年)(.*)$
 置換文字列: \2\t\1\2\3
+++置換を実行
+++エクセルにコピーペーストして、一番左の列で並び替え

***練習:日付データの形式変更 [#la44bbf5]
下に友達の誕生日リストが月、日、年の順で書かれている。
 April 29, 1984
 March 20, 1987
 September 23, 1980	
 December 23, 1982
 February 11, 1984
 January 1, 1999
 May 3, 1988
 May 4, 1993
 May 5, 1987
 November 23, 1985
 November 3, 1994
-このリストを正規表現検索置換を使って、
++年・月・日の順(例:1984 April 29)に並び替えなさい
++日、月、年の順(例:29 April, 1984)に並び替えなさい
--この課題が簡単すぎて暇をもてあました人は、エクセルを使って同じことをやってみよう(%%%この場合は実はエクセルの方が簡単%%% 列全体を選択して、コピー・ペーストするだけ)
-解答例
 検索文字列:([A-Za-z]+) ([0-9]+), ([0-9]+)
 置換文字列:¥3 ¥2 ¥1
  あるいは
 検索文字列:^([^ ]+) ([^ ]+), ([^ ]+)$
 置換文字列:¥3 ¥2 ¥1
--補足:2番目の例では、([^ ]+)(意味:空白以外の1回以上の連続)が改行を含んでしまってるため、最後に1行の終わりを示す$をつけないと、うまく行かない。~
-~また、上の例では
 ^  には2つの意味があるので注意!!
 
 ■検索文字列の最初においた場合は行頭から始まることを示す
   ^[A-Z].* で、行頭がアルファベット大文字で始まる任意の文字列
 ■文字集合を表す[ ]の中で最初に置かれた場合、それに続く文字以外を表す
  [^a-z]+     で、英小文字以外の任意の文字からなる文字列
  参考:$は検索文字列の最後に置かれた場合、行末であることを示す
   [a-z]+$  は、行末に続く英小文字の連続を示す
正規表現の例のいくつかは、昨年度の学生の要望で作った、[[授業/H20/情報処理/正規表現熟語帳]]を参照してみよう。自分でこういう単語帳を作ってみると、正規表現への理解がますます高まるだろう。
#include(授業/H20/情報処理/regex_table,notitle)
***発展演習: DNAの塩基配列データの整形処理 [#rc63a5f3]
添付されているファイル&ref(./sequence_Pdic.fasta);には、Pedicularisという植物のDNA塩基配列データがFASTA形式で入っている。GenBankからダウンロードしたままの形式なので、
 >gi|310769146|gb|HM596759.1| Pedicularis procera tRNA-Leu (trnL) gene
  (GenBankID, データベース、Accession No.、種名、遺伝子の種類...)
が、それぞれのデータを示すラベル情報として入っている。これを、よりシンプルに、
 >種名の省略形_Accession No.
 という形に整形したい。上の例だと、
 >P_procera_HM596759
に置換したい。どのようにすれば良いか、考えてみよう。~
この操作は、実際にDNAデータベースのデータを使って、系統解析を行うときに、知っていると大変役に立つ。
----
**その他の便利知識 [#nc52e012]
***学内無線LANへの接続方法とスマートフォンからのメール送受信 [#h8517120]
最近、学内でスマートフォンやノートパソコン、タブレットPC等を学内LANに接続したいという希望が多い。iPhoneを例にして、スマートフォンを学内LANに接続する方法を、簡単に解説する。
***学内無線LANへの接続(IPhoneの場合) [#b2242f11]
-1. 「設定」から「Wi-Fi」をタップ。 「Wi-Fi」を「オン」にして、「ネットワーク選択」から
 chiba-wep
 chiba-wpa
のいずれかが表示されると、学内無線LANに接続できる。~
&ref(/授業/H24/情報処理/01/lan_01.png,60%);
-2. いずれかを選択し、無線LANアクセスポイントへの接続のためのパスワードを入力する。~
&ref(/授業/H24/情報処理/01/lan_02.png,60%);~
無線LANアイコンが表示されたら、接続は完了(でも、まだ、インターネットには繋がっていない)
-3. インターネットへの接続には、ブラウザからの認証が必要。Safari等のブラウザを開き、どこかのページにアクセスしようとすると、自動的に認証ページが開く。~
&ref(/授業/H24/情報処理/01/lan_03.png,60%);~
-4. 利用者番号とパスワード(全てに共通のもの)を入力してログイン。下図右の画面が表示されれば、インターネットへの接続完了。ブラウザからのウェブページの表示や、メールの送受信ができる。。~
&ref(/授業/H24/情報処理/01/lan_04.png,60%);  &ref(/授業/H24/情報処理/01/lan_05.png,60%);~

***無線LANの使える場所、使い方の公式マニュアル [#f9aac00f]
-総合メディア基盤センターのページ: http://www.imit.chiba-u.ac.jp/services/musenlan/index.html~
このページ内に、教職員・学生向けマニュアルと、Vista用接続マニュアルのPDFがある。
***スマートフォンからの統合メールの送受信 [#g33bf533]
スマートフォンから統合メールを送受信する方法を、IPhoneを例に解説する。
-1. スマートフォンがインターネットに接続された状態で、「設定」から、「メール/連絡先/カレンダー」を開く。統合メールのアカウントを設定するには、「アカウントを追加...」をタップし、次の画面で「メールアカウントを追加」をタップ。~
&ref(/授業/H24/情報処理/01/mail_01.png,60%);  &ref(/授業/H24/情報処理/01/mail_02.png,60%); 
-2. 統合メールのアクセス情報を入力する。メールには統合メールの正しいメールアドレスを入力(注:皆さんの場合は、''XXXXX@chiba-u.jp'')。パスワードは全てに共通のもの。~
&ref(/授業/H24/情報処理/01/mail_03.png,60%); 
-3. 次の画面で、メールサーバーの設定を行う。まず、メールの送受信方法でIMAPかPOPかを選択。IMAPはサーバ上のメールとスマートフォンのメールを同期させるもの(サーバでメールが消えると、スマートフォンには残らない)。POPはサーバからスマートフォンにメールをダウンロードして使うもの(サーバからメールが消えても、スマートフォンには残っている)。容量の少ないスマートフォンの場合、IMAPが便利(但し、他のパソコンでPOP接続でメールをダウンロードし、サーバのメールを削除してしまうと、スマートフォンには表示されなくなるので注意)~
メールを送受信するサーバの情報を、下の例に従って入力する。~
&ref(/授業/H24/情報処理/01/mail_04.png,60%);   &ref(/授業/H24/情報処理/01/mail_05.png,60%);  &ref(/授業/H24/情報処理/01/mail_06.png,60%); ~
メールアカウントは全てフルメールアドレス(@以下を含む全て)を入力すること。
-4. 「メール」を開くと、設定した統合メールのアカウントを送受信できる。~
&ref(/授業/H24/情報処理/01/mail_07.png,60%); ~

**課題: Moodleページから提出 [#m9f9d0bc]