投資対効果の極めて高い、プログラムなんて分からない人のための「単純作業自動化」入門

あるいは、正規表現+置換による、プログラミングができなくても単純なテキスト編集作業を強力に自動化する方法 
 
  • このTipsの概要

 このTipsでは「テキストを、強力に自動的に操作する方法」が得られます。

 自動化といっても、プログラミング言語に習熟するのは大変です。

そこで、プログラミングほど、習熟や利用に負荷が掛からず、かつ応用範囲が広い正規表現」と言われる書式と、テキストエディタなどに付属の「置換」機能を組み合わせたものを解説します。 

 

 

  • 具体的にできるようになること

たとえば「ネットから文章をテキストエディタにコピー&ペーストしたが、変な改行がたくさん入っているので、改行を手動で消す作業をたくさんしないと。」

とか

「ごはん、ご飯、御飯、ゴハン」と、いろんな書き方で書かれている「ごはん」を、全部「ご飯」という表記に統一したい

とか

Skypeからコピペしたら、発言者名がいっぱいついて、消すのが大変‥。でも、発言時刻が違うから一筋縄ではいかない...。」

とか

「ウェブサイトをつくっているが、画像ファイルのフォルダ名を変えたので、"/img"と書かれているものをすべて、"/image"という文字列に置き換えたい。手動で1000箇所やるのかと思うとぞっとする。けれど、地の文に書かれているimgは変えてはいけない...。

とか

 

さらには↓こんなリストの 

--------------- 

日付 金額 内容
1220 100 ジュース
1221 180 コーヒー
1222 260 交通費
1223 1000 募金
1224 18000 プレゼント 

--------------- 

「日付」の表記を↓こんなふうに変えたい 

---------------
日付 金額 内容
12/20 100 ジュース
12/21 180 コーヒー
12/22 260 交通費
12/23 1000 募金
12/24 18000 プレゼント
--------------- 

とか。
こういうことがラクちんにできるようになります。カンタンカンタン♪

 

例えば最後の日付の表記変更では、今回は5個なので、"/"を手動で入れていくことも不可能ではありませんが、この日付が100個も並んでいては、とてもやる気になれません。 

かといって、普通のWordなどにある「置換」機能では、毎日日付が違うため、マッチしません。もちろん上の例では、12月だけなので、"12"を"12/"に置き換えるという手もありますが、金額に12を含むものがあればアウトです。

こういった、ちょっと特殊な表記変更を簡単に行えるのが正規表現+置換機能です。 

 

こういった、単純だけれど置換1発で作業できるわけではない単純作業を、強力に自動化する方法に興味があるかたは、続きをどうぞ。

 

 

まず正規表現」に対応した「置換機能」を持つ、テキストエディタが必要です。たとえば「秀丸エディタ」などがおすすめです。 

 

以下、エディタ(ちょっとDreamweaverとかでは動作が違う。Microsoft Wordではかなり動作が違う)によって色々と対応している書式に差異があったり、ちょっと特殊なルールがあったりするのですが、今回は秀丸準拠で、良く使えそうなものに限定して話を進めます。 

Macのかたは、miとかcodaなどがよいのかな。

 

サルにもわかる正規表現入門」なども併せて参照して頂けますと、理解がしやすいかと思います。 

 

 

正規表現では「文字」を「抽象的に」捉えることで、柔軟に文章の検索や置換を可能にします。 

文字を抽象的に捉える、とは、例えば具体的な数字である、0や1を指定するのではなく、「\d(半角の円¥マークに、半角のd)」と書くことで「0,1,2...,9のいずれか」を表すということです。

 

これによって、例えば12/01/03も、11/05/25も、85/08/11も、「\d\d/\d\d/\d\d」と表現することができます。

 

以下、メタ文字(超文字)の例を示します。

.(ピリオド1つ)で、「任意の一文字」を表します。
\d あるいは [0-9]で、数字1文字を表します。
[a-z]で、アルファベット1文字を表します。

 

例えば、
検索ワード:..い(←ピリオド2つ+い) 
置換ワード:くろい
で置換すると 

-------------
あかい
しろい
あおい
みどり
けむい
さむい
------------ 

↑のようなリストが 

-------------
くろい
くろい
くろい
みどり
くろい
くろい
------------ 

のように、置換されます。 

 

 

  • メタ文字:繰り返しの*, +, ?, {n,m} 

抽象的に文章を捉えるには、さらに「繰り返し」でマッチすると便利です。繰り返しには4種類の方法があります。

*(アスタリスク)で、直前の文字の0回以上の繰り返しを表現します。
+で、直前の文字の1回以上の繰り返しを表現します。例;いた+ → いたたたたた...
?で、直前の文字があってもなくてもいいことを表現します。例:サーバー? →サーバー or サーバ
{n,m}で、n回以上m回以下の繰り返しを表現します。{n}でちょうどn回の繰り返しを表現します。 

 

たとえば、 

[0-9]{4}と書くと、0000,0123,1234,3513,7777など、4桁の数字がマッチします。
置換元:[0-9]{4} 
置換後:■★と書くと  

---------------
日付 金額 内容
1220 100 ジュース
1221 180 コーヒー
1222 260 交通費
1223 1000 募金
1224 18000 プレゼント
--------------- 

↑のような表が 

---------------
日付 金額 内容
■★  100 ジュース
■★  180 コーヒー
■★  260 交通費
■★  ■★ 募金
■★ ■★0 プレゼント
--------------- 

このように置き換えられます。数字4桁でマッチするため、最後の2行では「金額」も反応してしまっているのがポイントです。

 

 

改行や、タブ区切りなどを表現するための特殊な記号が割り当てられています。 (次の2つはC言語などでもおなじみですね) 

改行:\n
タブ区切り:\t
文の頭:^
文末:$ 

 たとえば 

^1223\t 

で検索すると、文頭すぐに1223があって、直後にタブがついているもののみヒットする、ということになります。 

 

また、
検索:\n\n
置換:\n
で置換を行うと、改行が2つ入っているものを、1つにまとめる事ができるため 

 

こんなふう↓ に 

--------------- 

一行目テキスト 

 

二行目テキスト 

 

三行目テキスト 

 

四行目テキスト 

--------------- 

改行がたくさん入っているテキストを 

こんなふう↓ に 

---------------
一行目テキスト
二行目テキスト
三行目テキスト
四行目テキスト
--------------- 

改行を詰めることができます。 

ちなみにこれを、

検索:\n
置換: (置換後は無し)
で置き換えると、 

 ---------------  

一行目テキスト二行目テキスト三行目テキスト四行目テキスト
--------------- 

のように、文章からひとつも改行がなくなってしまいます。

 


また、
検索:\t
置換:, 

のようにすると、タブ区切りのファイルを、カンマ区切りに変える事ができます。 

 

  • グループ化+タグ:(), \1, \2, \3 

最後に、こちらが非常に強力なのですが()によるグループ化と、\1, \2, \3によるタグづけです。

 

例えば 

---------------
日付 金額 内容
1220 100 ジュース
1221 180 コーヒー
1222 260 交通費
1223 1000 募金
1224 18000 プレゼント
--------------- 

日付の表記を↓こんなふうに変えたい

---------------
日付 金額 内容
12/20 100 ジュース
12/21 180 コーヒー
12/22 260 交通費
12/23 1000 募金
12/24 18000 プレゼント 

--------------- 

という例で、作戦をたててみましょう。 

 

作戦 :

1220, 1221などの日付を、12と20, 12と21というように2桁づつバラして、それらの間に/(スラッシュ)を入れる事ができればよい、ということになります。 

 

[0-9]{2}は、01,02,11,13,99など、2桁の数値を表すのでした。これを()でくくると
([0-9]{2})というグループになります。 

 

さらに、いま、4桁の数字が2桁づつ欲しいので
([0-9]{2})([0-9]{2})
とすると、1220や1221に2桁づつマッチすることになります。 

 

しかし、これでは、12/23の所の、募金額の1000円にもマッチしてしまいます。
そこで、日付が改行の直後(あるいは文頭)にきていることに注目して改行の特殊文字\nと組み合わせると 

\n([0-9]{2})([0-9]{2}):改行後すぐに存在する2桁+2桁の数値 にマッチする事になります。

 

ここで、タグづけという方法を紹介します。 

実は、検索ワードを、(AAA)(BBB)(CCC)(DEF)(GHI)(012)というようにそれぞれ区切ると、 

文頭から順番に 

(AAA)を\1
(BBB)を\2
(CCC)を\3 

というように、順番にタグづけする事ができます。 要は、\1, \2, \3を検索語のキーワードとして使えば、n番目の()の中身を保存でき呼び出せる、ということです。

 

そのため、
\n([0-9]{2})([0-9]{2})
では、 

最初の2桁の数字(1224の12部分)は\1で、
最後の2桁の数字(1224の24部分)は\2で、
表すことができると言う事になります。 

 

従って
検索ワード:\n([0-9]{2})([0-9]{2})
置換ワード:\n\1■\2 

と書くと 

1220
1221
1222 

などが 

12■20
12■21
12■22 

のように置き換えられます。 

 

当初の欲しかった結果は
検索ワード:\n([0-9]{2})([0-9]{2})
置換ワード:\n\1/\2
のように入力すると 

 

このTab区切りのリストが 

 

--------------- 
日付 金額 内容 
1220 100 ジュース 
1221 180 コーヒー 
1222 260 交通費 
1223 1000 募金 
1224 18000 プレゼント 
--------------- 

日付の表記を↓こんなふうに

--------------- 
日付 金額 内容 
12/20 100 ジュース 
12/21 180 コーヒー 
12/22 260 交通費 
12/23 1000 募金 
12/24 18000 プレゼント 

--------------- 

 変えることができます。

(ちなみにDreamweaverなどでは\1, \2の代わりに$1, $2で使えます。) 

 

他にも
こちらのページなどに、詳しい記法が載っています。 

 

 

  • さらに、さらに、マクロの記録と保存!

秀丸では、こういった処理を連続的に行うものを「マクロの記録→保存」で簡単なスクリプトとして保存することができます。 

少し勉強すれば、スクリプトも編集する事ができるようになるため、超強力な自動化が可能になります。

 

  • まとめ
  1. 正規表現+置換を使うと、強力に文章の整形作業などがラクになる。
  2. 秀丸エディタ(Win)」「 mi / coda (Mac)」がおすすめ。
  3. .,\d,[0-9]などメタ文字で数字や文字を抽象的に捉えてみよう
  4. *, +, ?, {n,m} で繰り返しに強くなろう
  5. \n, \tなど特殊文字で、普段は検索/置換できない改行やタブを捉えてみよう
  6. (), \1, \2 などで、グループ化とタグづけを使いこなそう
  7. マクロを記録すると、強力なので応用編はそちら。

 

ちなみに、ひとつだけ。
この正規表現、 はじめにプログラミングではないと言いましたが「宣言型言語」という、処理対象の性質を記述することで処理する、一種のプログラミングです。

 

ほんの少しの学ぶコスト(特殊な文字を幾つか覚える)ことと、抽象的に文章を捉えることに習熟する(頭を鍛える訓練にもなります)ことで、単純作業を劇的に効率化できます。

 

ぜひ、試してみてください。

----
Twitterryouen

 

 

併せて読みたい:

 

論理的に考えるとはどういうことか|ロジカルシンキングことはじめ

よい仕事をするために

あざやかに生きる

卒業研究のすすめかた