本記事ではPythonにて正規表現で文字列を検索する方法をご紹介していきます。
前提となる知識
本記事では特殊な文字クラスを使用します。
そのため、この文字クラスを知りたい人は下記のドキュメント、もしくは「Python 特殊文字クラス」で調べてみて下さい。
また、正規表現というこよでreモジュールを多用することになるため、より詳細に知りたい場合は下記のドキュメントをご覧ください。
正規表現を使ったマッチ例1
gist454dfe53064dc61fc76443d6b5a2d2ba
1、2:基本的なマッチ
本記事では冗長になるため「1」のみエラー処理が入れていますが、ほぼ全ての場合に入れておいた方がいいです。
【'\[(\d{3})\]'】も比較的わかりやすく、【\[】と【\]】の【\】は特殊文字をエスケープ、つまり通常の文字であることを示しています。
そして【\d{3}】の【\d】は[0-9]の数字とマッチするというものなので、【\d{3}】は3つの数字を、【\d+】は数字1つ以上ある場合でマッチします。
3:条件に合うもの全てにマッチ
これはfindall関数を使うことで、マッチ条件に合ったものを全て出力できるようになります。
4、5、6:複数の条件にマッチ
「4」は2つの正規表現を使ったマッチ方法となっています。
間にある【-】は特殊文字出ないため、【\】は使っていません。
「5」はキャプチャする領域を少し変更したバージョンとなっています。
どこまでキャプチャしたいかによって使い分けてください。
「6」は数字の数を指定した結果となります。
特別複雑なことはないので、分かりやすいと思います。
正規表現を使ったマッチ例2
gist27e7f6826e807ec6a07527fb0e950fd6
1:基本的なマッチ
まず「1」は最も簡単なマッチで、この方法であるなら正規表現を使わない方が簡単です。
ここからどんどん正規表現を複雑にしていきます。
2:特定条件でマッチ
「2」の【(.+)】は、改行以外の任意の文字が1回以上続く場合にマッチします。
それに【"(.+)"】となれば、【""】で囲まれている中の文字をキャプチャしてマッチするというものになります。
3:複雑な条件でのマッチ
「3」は少々複雑で、【'<h2([^>]*)?>'】を分解してみる必要があります。
まず【[^>]】は【>】以外の文字とマッチする否定のような条件です。
そして【[^>]*】となると、【[^>]】が0回以上繰り返されているという意味になります。
最後に【([^>]*)?】となると、【([^>]*)】というグループが0回か1回繰り返したかという条件になります。
これにより、【<h2 class="・・・">】でも【<h2>】両方でもマッチするようにできます。
4:非キャプチャグループを利用
「4」は「3」の正規表現にキャプチャしないように設定を加えたものです。
そのため、いつものようにマッチした結果を出力しようとすると、エラーがでます。
5:キャプチャと非キャプチャを混ぜたマッチ
「5」はキャプチャグループと非キャプチャグループを混ぜた正規表現となっています。
非キャプチャグループの正規表現は「4」と同じであり、キャプチャグループの正規表現は「2」と同じです。
6:より複雑な条件かつ実用的なマッチ
「6」は、かなり複雑な正規表現ですが、様々なことに使えるマッチとなっています。
この正規表現を分割していくと、下記の6つのグループになります。
・(\d)
・(?:\s+(\w+)=\"(\w+)\")?
・(\w+)
・(\w+)
・(.+)
・(?:\d)
分解してから見てみると分かりやすくなっています。
\sは空白、\wは英数字にマッチするようになっており、これを大文字にすると意味が反対になってしまうため注意が必要です。
参考記事
本記事の内容は以上となります。
Pythonの正規表現を使ったマッチ方法は、様々なものを検索する時に便利ではありますが、意味を理解していないと記号の羅列にしか見えません。
もし正規表現を使おうと思っているなら、ぜひ本記事を参考にしてみて下さい。
本記事は以上です。お疲れさまでした。