JavaScriptを有効にしてください

Pythonのreモジュールを使った正規表現の基本

 ·   4 min read

はじめに

Pythonのreモジュールの基本的な使い方をまとめた。また、正規表現を扱うために便利なraw文字列、および正規表現についても簡単に述べる。
正規表現 (Regular Expression) により、柔軟な表現で文字列のパターンマッチングを行える。

以降ではreモジュールをインポートしていることを前提とする。

1
import re

環境
Python 3.7.3

raw文字列について

正規表現の前に、raw文字列について述べる。

Pythonでは、正規表現をraw文字列で表すことが多い。これは、正規表現を表す文字列には、バックスラッシュが含まれることが多いためである。例えば、1桁の数字を表す正規表現は\dとなる。

しかし、標準のPythonの文字列の仕様では、\記号はエスケープ文字となるため、'\d'という正規表現を表すためには'\\d'と書く必要がある。

そこで、raw文字列を用いる。raw文字列とは、先頭にrが付いた文字列のことであり、文字列中の\によるエスケープを無効にできる。
すなわち、'\\d'という文字列とr'\d'というraw文字列は等価である。

正規表現を使った文字列の検索例

reモジュールによる正規表現を使った文字列の検索例を示す。

検索方法は主に以下の2種類がある。

  • re.search()関数を使う
  • 正規表現オブジェクト(re.compile)を使う

前者の方が簡潔に記述できる。一方、後者では、リファレンスによると正規表現がキャッシュされるため、同じ正規表現で何度も検索する場合は、処理を高速に行える。

以下の問題に対して、各方法の例を示す。

問題"12 * 3 = 36"という文字列の中から、2桁の数字を探す。

re.search()関数を使う

re.search()関数の第1引数に正規表現、第2引数に検索対象の文字列をとって実行すると、マッチオブジェクトが返される。
マッチオブジェクトのgroupメソッドを呼ぶと、検索結果が得られる。ただし、re.search()関数では最初にヒットした検索結果しか得られない。

1
2
3
4
reg_pat = r"\d\d"
string = "12 * 3 = 36"
mo = re.search(reg_pat, string)
print(mo.group())

実行結果

1
12

文字列の中から、正規表現と一致する全ての検索結果を得たい場合は、re.search()関数の代わりにre.findall()関数を用いる。ただし、findallメソッドの戻り値はマッチオブジェクトではなく、マッチした文字列のリストである。

正規表現オブジェクト(re.compile)を使う

正規表現オブジェクトを使う場合、以下の手順になる。

  1. re.compileに正規表現を渡して正規表現オブジェクトを作成する。
  2. searchメソッドに検索対象の文字列を渡して、マッチオブジェクトを得る。
  3. groupメソッドから検索結果を得る。
1
2
3
4
5
reg_pat = r"\d\d"
string = "12 * 3 = 36"
reg = re.compile(reg_pat)
mo = reg.search(string)
print(mo.group())

実行結果

1
12

文字列の中から、正規表現と一致する全ての検索結果を得たい場合は、searchメソッドの代わりにfindallメソッドを用いる。ただし、findallメソッドの戻り値はマッチオブジェクトではなく、マッチした文字列のリストである。

正規表現の規則

よく使うと思われる正規表現の規則について示す。(全ての規則を網羅することは困難なため、詳細を知りたい方は別サイトも参照ください)

同じ表現の繰り返し

ある表現が繰り返される回数を指定するときは、その表現の後ろに{(数字)}を付ける。


3桁の連続した数字を検索したい場合:\d{3}

また、繰り返し回数を「N回以上、M回以下」としたい場合は、{N, M}とする。

任意回数のマッチ

ある表現が0回または1回現れる場合には、その表現の後ろに?を付ける。


\d-?\dという正規表現は、「連続した2つの数字」または「間に-を挟んだ2つの数字」のどちらにもマッチする。

  • マッチする:'11', '2-3'
  • マッチしない:'1', 2+3', '2--3'

また、?と同様に*+も繰り返し回数を指定する記号である。*は0回以上のマッチを、+は1回以上のマッチをそれぞれ示す。

文字集合

/dは0から9までの数字の集合であるが、下表のようなパターンが定義されている。

パターン 意味
\d 0~9の数字 [0-9]
\D 数字以外
\w 文字、数字、下線 [a-zA-Z0-9_]
\w 文字、数字、下線以外

また、角括弧を使うと、文字集合を定義できる。[abc]はa, b, cのいずれかの文字を表す。
連続した文字はハイフンを使って指定できる。[A-Z]は大文字のAからZまでの文字集合を示す。

参考

re — 正規表現操作 — Python 3.9.1 ドキュメント
正規表現 - Wikipedia

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

サイト内検索