今回は Python における正規表現の使い方について説明します。正規表現とは文字列の並びやパターンを表現するものです。複雑な文字列の検索や置換、バリデーションなど様々なアプリケーションの開発において必要不可欠な機能です。
正規表現のパターン
正規表現はいくつかの特別な文字「メタ文字」と呼ばれる文字を組み合わせて表現します。メタ文字は特別な意味をもっており、以下のような文字が存在します。
メタ文字 | 説明 | 例 | マッチする例 | マッチしない例 |
. | 任意の一文字 | a.c | abc, acc, aac | abbc, accc |
^ | 文字列の先頭 | ^abc | abcdef | defabc |
$ | 文字列の末尾 | abc$ | defabc | abcdef |
* | 0回以上の繰り返し | ab* | a, ab, abb, abbb | aa, bb |
+ | 1回以上の繰り返し | ab+ | ab, abb, abbb | a, aa, bb |
? | 0回または1回 | ab? | a, ab | abb |
{m} | m回の繰り返し | a{3} | aaa | a, aa, aaaa |
{m,n} | m〜n回の繰り返し | a{2, 4} | aa, aaa, aaaa | a, aaaaa |
[] | 集合 | [a-c] | a, b, c | d, e, f |
| | 和集合(または) | a|b | a, b | c, d |
() | グループ化 | (abc)+ | abc, abcabc | a, ab, abcd |
また、頻繁に使用される数字や英数字を表現する正規表現のパターンは、バックスラッシュ \ で始まる「特殊シーケンス」によって定義されています。
以下は特殊シーケンスの一覧です。
特殊シーケンス | 説明 | 同義のパターン |
\d | 任意の数字 | [0-9] |
\D | 任意の数字以外 | [^0-9] |
\s | 任意の空白文字 | [\t\n\r\f\v] |
\S | 任意の空白文字以外 | [^\t\n\r\f\v] |
\w | 任意の英数字 | [a-xA-Z0-9_] |
\W | 任意の英数字以外 | [\a-xA-Z0-9_] |
\A | 文字列の先頭 | ^ |
\Z | 文字列の末尾 | $ |
正規表現はこれらの「メタ文字」や「特殊シーケンス」を組み合わせることによってパターン文字列を作ります。このパターン文字列を利用することで、文字列の柔軟な検索を行うことができます。
Python での正規表現の使い方
Python で正規表現を使用する場合は、re モジュールを使用します。
re モジュールとは
re モジュールは正規表現パターンを使用した検索、置換、連結、分割などの便利なメソッドが備えられています。これらのメソッドはマッチした文字列を返すものもあれば、いくつかは MatchObject(マッチオブジェクト)インスタンスを返します。MatchObject は正規表現にマッチした文字列、マッチした文字列の開始位置、終了位置などの情報をもっています。
MatchObject には以下のようなメソッドがあります。
group() | マッチした文字列を返す。 |
start() | マッチした文字列の開始位置を返す。 |
end() | マッチした文字列の終了位置を返す。 |
span() | マッチした文字列の (開始位置, 終了位置) のタプルを返す。 |
正規表現オブジェクト
検索を行う前に正規表現パターンを事前に compile() 関数を使用し、正規表現オブジェクトを作成し re モジュールに渡す方法と、re モジュールの引数にコンパイルなしに正規表現パターンを渡す方法があります。
同じパターンを複数回利用する場合は、事前にコンパイルした方が正規表現パターンのコンパイルが1度だけで済むので、高速に処理が行えます。
以下のように compile() 関数を使用して正規表現オブジェクトを作成します。
1 2 3 4 5 |
import re regex = r'ab+' text = "abbabbabaaabb" pattern = re.compile(regex) matchObj = pattern.match(text) |
また、コンパイルせずに re モジュールの引数に正規表現パターンを渡す場合は以下のようにします。
1 2 3 4 |
import re regex = r'ab+' text = "abbabbabaaabb" matchObj = re.match(regex, text) |
正規表現パターンを複数回使用するかどうかで、コンパイルするかを判断するといいでしょう。
正規表現を用いた検索、置換の方法に関しては以下の記事を参照してください。
パターン文字列を定義するときの注意点
正規表現のパターン文字列を定義するときは、クォーテーションの前に r を付て利用した方が良いです。正規表現にはバックスラッシュを使用したパターンが存在するため、r を付けることによって raw 文字列として扱われ、エスケープシーケンスを無効にしてくれます。
1 |
>>> regex = r'ab*' |
正規表現で日本語を扱う
Python の正規表現で日本語を扱う場合は、正規表現パターンを Unicode に変換して使用します。
1 |
>>> regex = u'[ぁ-ん]' |
Python 3.x 系からはすべての文字列は Unicode として扱われるようになりました。その関係で Python 3.0 〜 3.2 までは u"..." で変換を行うとエラーが発生するので注意してください。Python 3.3 からは u"..." で変換できるようになっています。
以下は日本語に関する正規表現パターンです。
パターン | 説明 |
[ぁ-ん] | 任意のひらがな |
[ァ-ン] | 任意のカタカナ |
[ぁ-んァ-ン] | 任意のひらがなとカタカナ |
[一-龥] | 任意の漢字 |
まとめ
今回は Python における正規表現の使い方について説明しました。正規表現は複雑な文字列の処理を行うときに非常に便利な方法です。Python の re モジュールを使用して様々な正規表現パターンを試してみましょう。