正規表現を使用して自動化できる8つのタスク
正規表現は、使い方を知っていれば素晴らしいツールです。しかし、残念ながら、それを解釈するのは世界で最も簡単なことではありません。しかし、適切な式を使えば、あなたが望むことを自動化することができます。正規表現は、以下の8つのケースのように、テキストの検索、マッチング、操作に最適です。
なぜ正規表現を使うのか?
正規表現(REGular EXpressionsの略)は、クリーンアップや標準化を簡単に行うことができます。編集ツールとしての汎用性がある一方で、適用には限界があります。正規表現を考える最良の方法は、スーパー強力なワイルドカード検索または検索と置換のようなもので、必要に応じて使用できるということです。もちろん、それがサポートされている場合に限ります。最近、Microsoft Excelが正規表現のサポートを開始し、それを学ぶことが役立つスキルとなりました。
しかし、正規表現を具体的に何に使うことができるのでしょうか?8つの一般的な例を見てみましょう。
一部のプログラムは正規表現をサポートしておらず、他のプログラムは部分的にしかサポートしていません。Notepad++のようなアプリは、検索と置換機能を使って正規表現コマンドを実行するのに最適です。
コピー&ペーストしたPDFテキストを修正する
私たちは皆、PDFからいくつかの情報をコピーして、自分のドキュメントに貼り付けるという経験をしています。そして、コピーした時に奇妙な間隔やアーティファクトが表示されることもあります。しかし、正規表現(regex)がそれを助けることができることをご存知でしたか?このコマンドを検索と置換の機能に入力してください:
Find: [^\S\r\n]{2,}|\s*\r?\n\s*\r?\n\s*
Replace: \n
この正規表現はあなたのテキストエディタを作成します:
- 複数のスペースのインスタンスを削除します。
- 複数の改行を1つの改行に削減します
- 末尾の空白を削除します
これにより、お使いのコピーしたテキストが役立つものに整理されるはずです。
ダウンロードしたファイルの一括リネーム
残念なことに、複数の不運な出来事で、私は一組のファイルをダウンロードしましたが、それらには奇妙な名前が付いていました。Advanced Renamerのような一括リネームツールを持っている場合は、正規表現を使用してそれらのファイル名をより認識しやすいものに整理することができます。記号が至る所にあるファイルのシリーズがある場合は、この正規表現を使ってリネームツールを使用できます:
Find: [^a-zA-Z0-9-.]
Replace:
これは数字、ピリオド、文字をそのまま保持しますが、それ以外のすべてをダッシュに置き換えます。
通貨フォーマット
たくさんの異なる形式の通貨が含まれるファイルがあるとしましょう。それらすべての通貨を手動で確認して、特に複数の奇妙な形式がある場合、あなたが望む形式に修正したくありません。以下は、あなたが正規表現に使用するものです:
Find: \$?\s*(\d+(?:\,\d{3})*(?:\.\d{2})?)\s*(?:USD|dollars?)?
Replace: $\1
この正規表現は、あなたの通貨ファイルをスクラブし、ドル記号、通貨のエントリ、セントのための小数点以下2桁を整えるものです。
日付形式を標準化する
私には、日付を標準化された形式に抽出しなければならなかったいくつかの状況があります。例えば、テキストからデータベースに移動するような場合です。このような状況に直面したとき、正規表現(regex)を使用してデータを見つけて簡略化された形式(この場合はYYYY-MM-DD)に抽出することができます。これのためのregexは次の通りです:
Find: \b(?:\d{1,2}[-/\.]\d{1,2}[-/\.]\d{2,4})|(?:(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*[\s.-]?\d{1,2}(?:st|nd|rd|th)?[\s,.-]?\d{2,4})\b
これにより、文書全体を検索し、すべての日付をこの標準化された形式に修正することができます。
HTMLタグを削除する
ウェブから何かをコピーすると、時々それにはHTMLタグが付いています。幸運なことに、正規表現には文書からHTMLタグを取り除く便利なメソッドがあります。
Find: <[^>]+>|&[^;]+;|\s*\n\s*
Replace: \n
この正規表現は文書を検索し、HTMLタグを見つけて、それらを消去します。また、余分な改行や他のHTMLエンティティ(例えば'&')も消去します。これで、この正規表現を使ってタグを探し、空のもので置き換えるだけで簡単に文書をクリーンアップできます。
Find: <[^>]+>
Replace: (empty)
ただし、ドキュメントが奇妙なHTMLタグ、フォーマット、またはエンティティを使用している場合、問題が発生する可能性があります。最初の正規表現は一般的なクリーンアップであり、2番目のものはより詳細な検索を行います。
テキストからURLを抽出する
時々、テキストの中に埋もれているURLが含まれている文書があります。それらのURLを抽出するのに、文書全体を手動で検索する必要はなく、正規表現を使うことで時間を節約できます。URLは常にhttpまたはhttpsで始まることが分かっており、その知識を正規表現に活用できます。
Find: (https?://)?([\w\-]+(\.[\w\-]+)+\.?(:\d+)?(/\S*)?)|((www\.)?[\w\-]+(\.[\w\-]+)+\.?(:\d+)?(/\S*)?)
このエクストラクターはあなたのURLを見つけますが、いくつかの問題があります。誤った形式のURLやhttpまたはhttpsのプレフィックスがないものの場合、そのURLは表示されません。このパターンではメールも受け取れませんが、特にメール用に使える別のものがあります。
テキストからメールアドレスを抽出する
データスクレイピングやメールリストの検証を行う際に直面する最も一般的な問題の一つは、テキストファイルからメールアドレスを取得することです。メールアドレスは通常、テキストファイルと正規表現が対話しやすいパターンを持っています。メール検索機能のためには、次のようなことを行います:
Find: (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
これは多く見えるかもしれませんが、基本的には<something>@<domain>.comというパターンを持つものを検索します。正規表現は非常に強力ですが、完璧ではありません。ドットで始まるメールや、正しくフォーマットされていないメールは見逃されます。
ソーシャルメディアアカウントのフォーマット
フォームからデータベースへ、またはその逆にデータを移動する際には、時々フォーマットの問題を修正する必要があります。ソーシャルメディアのハンドルがその良い例です。これを行うための正規表現は次の通りです:
Find: (?:^|[^@\w])[@\s]*(\w{1,30})
Replace: @$1
これはソーシャルメディアのハンドルをフォーマットするための最も堅牢なユースケースですが、各プラットフォームにはユーザー名に独自のニュアンスがあります。特定のハンドルに対してエラーチェックを書くことはできませんが、例えばPythonスクリプトでこのregexを使用する場合は可能です。それでも、regexを使ってPythonコードをデバッグするのは少し複雑かもしれません。
正規表現は万能ではない
「ハンマーを持っていると、すべての問題が釘に見える」という言葉があります。経験豊富なコーダーとして言えるのは、これは正規表現に関して100%真実です。オンラインには正規表現を学ぶためのいくつかの場所がありますが、その知識は控えめに使用すべきです。
コードに正規表現を含めることは、デバッグプロセスを複雑にする可能性があります。コメントを付けることもできないため、他の人とコードを共有することがさらに難しくなります。最後に、正規表現は自動化システムの一部であり、元データが悪い場合、結果も悪くなります。正規表現は強力なツールですが、あることには向いている一方で、他のことには向いていないこともあります。


