※記事内に商品プロモーションを含むことがあります。
はじめに
Pythonのreモジュールの基本的な使い方をまとめた。また、正規表現を扱うために便利なraw文字列、および正規表現についても簡単に述べる。
正規表現 (Regular Expression) により、柔軟な表現で文字列のパターンマッチングを行える。
以降では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()
関数では最初にヒットした検索結果しか得られない。
|
|
実行結果
|
|
文字列の中から、正規表現と一致する全ての検索結果を得たい場合は、re.search()
関数の代わりにre.findall()
関数を用いる。ただし、findall
メソッドの戻り値はマッチオブジェクトではなく、マッチした文字列のリストである。
正規表現オブジェクト(re.compile
)を使う
正規表現オブジェクトを使う場合、以下の手順になる。
re.compile
に正規表現を渡して正規表現オブジェクトを作成する。search
メソッドに検索対象の文字列を渡して、マッチオブジェクトを得る。group
メソッドから検索結果を得る。
|
|
実行結果
|
|
文字列の中から、正規表現と一致する全ての検索結果を得たい場合は、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までの文字集合を示す。