正規表現を使用して自動化できる 8 つのタスク
Regex は、使い方を知っていれば素晴らしいツールです。残念ながら、それを解釈するのは世界で最も簡単なことではありません。ただし、適切な式を使用すれば、必要なものはすべて自動化できます。正規表現は、これら 8 つのケースのように、テキストの検索、照合、操作に最適です。
正規表現を使用する理由
Regex (REGular EXpressions の略) を使用すると、クリーンアップと標準化が簡単になります。編集ツールとしては多用途ですが、応用には限界があります。正規表現について考える最良の方法は、必要なときにいつでも (もちろんサポートされている場合には) 使用できる超強力なワイルドカード検索または検索と置換として考えることです。 Microsoft Excel は最近正規表現のサポートを開始したため、学習すると便利なスキルになります。
しかし、正規表現は正確に何に使用できるのでしょうか? 8 つの一般的な例を見てみましょう。
正規表現をサポートしていないプログラムもあれば、部分的にしかサポートしていないプログラムもあります。 Notepad++ のようなアプリは、検索機能と置換機能を使用して正規表現コマンドを実行するのに最適です。
コピー&ペーストされた PDF テキストを修正
PDF からいくつかの内容をコピーして自分の文書に貼り付けたところ、コピーに奇妙な間隔が生じたりアーティファクトが発生したりしたことは誰しも経験があるでしょう。しかし、正規表現がそれに役立つことをご存知ですか?検索と置換関数に次のコマンドを入力します。
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 桁を提供するためにすべてをクリーンアップします。
日付形式の標準化
テキストからデータベースに日付を移動するなど、日付を標準化された形式に抽出する必要がある状況が何度かありました。このような問題に直面した場合は、正規表現を使用してデータを検索し、簡略化された形式 (この場合は YYYY-MM-DD である必要があります) に抽出できます。この正規表現は次のようになります。
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タグの除去
Web から何かをコピーすると、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 がある場合、URL は表示されません。このパターンのメールも受信しませんが、メール専用に使用できるパターンがもう 1 つあります。
テキストからメールアドレスを抽出する
データ スクレイピングやメール リストの検証を行うときに遭遇する最も一般的な問題の 1 つは、テキスト ファイルからメールを取得することです。通常、電子メールには、正規表現によるテキスト ファイルの操作を容易にするパターンがあります。電子メール検索機能の場合は、次のようなことを行います。
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])+)\])
これは大変に見えるかもしれませんが、基本的には
ソーシャルメディアハンドルのフォーマット
フォームからデータベースにデータを移動するとき、またはデータベースからデータを移動するときに、いくつかの書式設定の問題を修正する必要がある場合があります。優れた例はソーシャルメディアのハンドルです。これを行うための正規表現は次のとおりです。
Find: (?:^|[^@\w])[@\s]*(\w{1,30})
Replace: @$1
これはソーシャル メディア ハンドルをフォーマットするための最も堅牢な使用例ですが、各プラットフォームではユーザー名に独自のニュアンスがあります。たとえば、Python スクリプトでこの正規表現を使用しない限り、これらの特定のハンドルのエラー チェックを記述することはできません。それでも、正規表現を使用して Python コードをデバッグするのは少し複雑になる可能性があります。
正規表現は特効薬ではない
ハンマーを持っていると、すべての問題が釘のように見え始めるという格言があります。経験豊富なプログラマーとして、正規表現に関してはそれが 100% 真実であると言えます。正規表現の学習に役立つオンラインの場所がいくつかありますが、この知識は慎重に使用する必要があります。
コードに正規表現を含めると、デバッグ プロセスが複雑になる可能性があります。コメントすることもできないため、コードを他の人と共有することがより困難になります。最後に、これらは自動化システムの一部です。ソースデータが悪ければ、結果も悪くなります。正規表現は強力なツールですが、他のものよりも優れているものもあります。


