みんな大好き、正規表現。私自身まだまだ使いこなせていませんが、必要な正規表現を覚えるだけで日々の自分の仕事の効率化に活用できます。
「正規表現はエンジニア等の一部の人のためのもの」
「正規表現は自分にとって関係ない」
そんな風に思っていたらあまりにももったいない。正規表現はたしかにプログラマーやエンジニアなどのプログラミング言語を扱う専門職がよく利用していますが、エクセルやワード、テキストエディタ等のアプリケーションを使って、メールやウェブ、各種資料からの何らかのテキストデータを処理しているデスクワーカーであれば覚えて損はありません。
正規表現を覚えたらデスクワーカーの自分にとってどう便利なのかという観点で、いくつかサンプルも踏まえてご紹介します。
目次
デスクワーカーが正規表現で便利になること
例えば、以下のような作業を行っていた場合、正規表現を活用することで効率化できる可能性があります。
- 複数行あるテキストデータを箇条書きにするため先頭に「・(中黒)」を入れたいが、手動で一つずつ入力している
- もらったデータがHTMLだったが、HTMLタグは不要なので全部削除したい。複数のタグがあるため、タグがある回数だけ検索して削除している(または手作業で削除)
- ウェブページで特定の箇所をコピーしたいが、不要な場所までコピーされてしまうため、一旦ペーストしたあと手作業でいらない部分を消している
行頭や行末に特定の箇所に文字を挿入したい場合なども正規表現を使って任意の位置を指定し挿入が可能です。
また、大量の文章のなかから、「同一」の文字列を削除したり置換したりする場合は正規表現を使わなくてもエディタやエクセル上で検索/置換で可能ですが、「異なる」文字列の場合はそうはいきません。そうなると従来の検索機能は使えないため手作業でやったり複数回検索置換したりとなり、そんな時に正規表現であれば異なる文字列を探すことができるため、力を発揮します。
正規表現は全部理解しなくていい
正規表現とはなんでしょう。Wikipediaで調べてみると、
正規表現(せいきひょうげん、英: regular expression)は、文字列の集合を一つの文字列で表現する方法の一つである。
https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE
なんて出てきて、よく意味がわからないと思います。誤解を恐れず言うと、あるテキストデータに対して任意の操作をするための手法です。任意の操作とは例えば、
- テキストデータから特定の文字を抜き出す
- 検索した複数の文字列に対して一括で処理をする
- 異なるが規則性がある文字列を検索して一括で置き換える
- 特定の位置に文字を挿入する
このような操作が正規表現で可能になります。学んでみようと思って正規表現を検索すると、パターンマッチのルールがズラッと並んでいて、どこから手を付けて良いのかわからない状態になる人も多いのではないでしょうか。エンジニアであれば多くの表現を理解しておく必要が強いですが、デスクワーカーであれば全部を覚える必要はありません。自分にとって必要な正規表現が理解できていればまずはそれで良くて、必要になったときに調べてみて発見する、という使い方でまずは十分です。
正規表現を使った想定例
それでは実際に正規表現を使ってどうやって処理するのか、例を見てみます。利用しているエディタはSumblime Text 3ですが、正規表現が使えるエディタであれば基本的に問題なく実施できるはずです。(一部エディタによって利用できる正規表現が異なる場合がある)
文章の先頭に文字を挿入する
日本
アメリカ
中国
インド
イギリス
上記のような複数行の文字列に対して、箇条書きの体裁にするため行の先頭に「・(中黒)」を追加します。正規表現ではハットまたはキャレットと呼ばれる「^」を検索することで、行頭を表現できます。
■検索文字
^
検索文字には「^」のみを設定します。これで各行の先頭が選択されました。
■置換文字
・
置換文字に「・」を設定し、一括置換します。これで箇条書きスタイルになりました。
文章の行末に文字を挿入したい
9,000
540
12,022
88
134,113
今度は反対に、行末に対して文字を挿入する場合です。このような数字が並んだデータに対して、すべてに「円」をつけたいとします。その場合は「$」を検索することで行末を検索できます。
■検索文字
$
検索文字には「$」のみを設定します。これで各行の末部分が選択されました。
■置換文字
円
置換文字に「円」を設定。これですべて価格表記となりました。
不要なHTMLタグを消したい
<ul>
<li>日本</li>
<li><a href="">アメリカ</a></li>
<li><span>中国</span></li>
</ul>
このようなHTMLリストがあったとします。すべてのHTMLのタグを消して、テキストデータだけにしたい場合はHTMLタグで利用している「<>(かっこ)」を検索し、「任意の一文字」を表す「.(ドット)」と「1回以上の繰り返し」という意味の「+」を使うことで、HTMLタグをすべて削除できます。これだけだとHTMLの開始タグから終了タグまで含まれてしまい含まれている文字列まで対象となってしまうため、最短マッチの「?」を追加しています。おまけで、liタグの先頭についている「タブ」も削除したいので、「\t」を検索し、さらにタブを含まないHTMLタグが除外されないように「?」を追加しています。
■検索文字
\t?<.+?>
HTMLタグだけであれば「<.+?>」だけで構いません。先頭にある「\t?」はタブを含んでいるかどうかです。
■置換文字
なし(空欄)
検索対象の文字列を削除するため、置換文字には何も設定しません。
ウェブページの表から必要なデータだけ抜き出したい
ウェブページで公開されている情報をコピーして、手元のエディタ等にペーストすると、無駄なテキストや改行が含まれてしまい、そのまま利用するのは困難なことがあります。サンプルデータとして IFIS銘柄ランキング – IFIS株予報 を利用しました。
上記のようなデータから、例えば会社名だけ欲しいとします。HTMLを見てみましょう。(こちらも長いので省略&一部整形済み)
<tbody>
<tr>
<th rowspan="2">Code</th>
<th rowspan="2">会社名</th>
<th rowspan="2">業種</th>
<th colspan="3">経常利益コンセンサス</th>
</tr>
<tr>
<th>前週値</th>
<th>最新値</th>
<th class="pickup">変化率</th>
</tr>
<tr>
<td class="center"><a href="index.php?action=tp1&sa=report_top&bcode=3050">3050</a></td>
<td><a href="index.php?action=tp1&sa=report_top&bcode=3050">DCMH</a></td>
<td class="center"><a href="index.php?action=tp1&sa=find&wd=@27">小売業</a></td>
<td class="right">25,500</td>
<td class="right">27,900</td>
<td class="right">9.4<span class="scale">%</span></td>
</tr>
<tr>
<td class="center"><a href="index.php?action=tp1&sa=report_top&bcode=3994">3994</a></td>
<td><a href="index.php?action=tp1&sa=report_top&bcode=3994">マネーフォワード</a></td>
<td class="center"><a href="index.php?action=tp1&sa=find&wd=@25">情報・通信</a></td>
<td class="right"><span class="num_minus">-845</span></td>
<td class="right"><span class="num_minus">-792</span></td>
<td class="right">6.3<span class="scale">%</span></td>
</tr>
</tbody>
表の会社名の箇所に使われているHTMLタグを見てみると、
<td><a href="index.php?action=tp1&sa=report_top&bcode=3050">DCMH</a></td>
となっており、会社名以外の行はすべてtdにclass属性が付与されていました。よって簡単に取得できそうです。今回は該当する箇所以外のHTMLをすべて削除する形で抜き出します。一度にマッチさせる方法もあるかもしれませんが、わかりやすくするために3回に分割しました。
①会社名以外の行を削除
■検索文字
<.*tbody>|<.*tr.*>|<th.+>|<.*td class.+>|</td>|\t+
会社名以外のHTMLをすべて検索します。「|」を使って複数の条件を検索し一発で任意のHTMLタグを検索できます。tbodyやtr、tdの前にある「*」はHTMLタグの閉じタグである「/」がある場合もない場合も対象に含めるようにしてます。
■置換文字
なし(空欄)
検索対象の文字列を削除するため、置換文字には何も設定しません。
②不要な連続した改行を削除
■検索文字
\n+
会社名以外の行を削除したことにより、連続した改行が残ります。こちらは不要のため削除しましょう。「\n」は改行をマッチする正規表現。「+」により2個以上の連続した改行が対象となります。
■置換文字
\n
削除してしまうと改行が一切なくなってしまうため、一つの改行で置き換えます。
③会社名の行のHTMLタグを削除
■検索文字
<td>.+?>|</a>
前半部分はtdタグとaタグです。tdはそのままで、aタグの方は「.」を使って一文字以上の任意の文字(この場合はaタグの開始タグである「<」が該当)とし、「+」で直前の文字の繰り返し、「>」の前に「?」で最短マッチとすることでaタグの前半終わり部分までをマッチさせます。「|」は先程も出てきましたので同様です。
■置換文字
なし(空欄)
削除のため何も設定しません。
ちなみに、Sublime TextのFind All機能を利用した方法だともっとスムーズに該当箇所のみ抜き出せます。それについては以前書きました。
Sublime TextのFind All機能が便利すぎて仕事が捗る
非エンジニアでも正規表現を使うことでもっと楽できる
いくつかサンプルを使って正規表現を説明しました。正規表現の説明から入ると難しい話になってしまいがちですし、すでにたくさん丁寧に説明しているウェブページがあるため省略しました。この記事の目的は「正規表現難しいと思っていたけど、覚えたら便利そうだしちょっとやってみるか」と非エンジニアの人に思ってもらうことです。
普段の仕事で色々なテキストデータを処理している場合は、通常の検索置換ではできない一歩進んだ処理ができますし、表データをわざわざエクセルを開いてペーストして該当の箇所を取り出す、といったことをしなくてももっと早くスマートに抜き出すことができます。何より、単調な作業を繰り返ししなくていいので楽できます。
特にウェブデザイナーやウェブディレクターといった立場の人はプログラムを触る機会が多いけど毛嫌いしている人もいると思うので、こういった作業も少しづつ覚えていってエンジニア寄りになれるとプロジェクトが少しでも前に進みやすくなるのかなと思います。
正規表現、私もまだまだ勉強中です。覚えるととても便利なので、少しずつやってみてはいかがでしょうか。
コメントを残す