Python モジュール: re
概要
- Python で正規表現を扱うためのモジュール
使い方
import re
よく使う機能
正規表現のコンパイル
REGEXP_OBJ = re.compile(REGEXP_STR, PROPERTY)
REGEXP_OBJ
: 正規表現オブジェクトを格納する変数名REGEXP_STR
: 正規表現パターンの文字列- raw 文字列 (文字列を示すクォーテーションの前に
r
を付ける) を与えると、エスケープシーケンスも無効化できるので便利 (特にバックスラッシュをそのまま正規表現として利用できるので便利)。
例:r“REGEXP”
PROPERTY
: 追加のオプション (あってもなくても良い)re.IGNORECASE
: 大文字小文字を区別しない
- Python では正規表現を一度コンパイルしてから使うらしい。
- コンパイルすることで、高速に検索できる
- プログラム内で、数回利用するだけなら、コンパイルせず、各メソッド内で正規表現文字列を与えると良い
- 例: “A” の間に何かの文字1文字が入る文字列を検索する正規表現オブジェクトを作成
re_obj = re.compile(r"A.A")
文字列の検索
- match: 文字列の先頭に指定された正規表現がマッチするかを判定
- 正規表現をコンパイルしないで使う場合
MATCH_OBJ = re.match(REGEXP_STR, TEXT)
MATCH_OBJ
: マッチした結果が格納される変数 (オブジェクト)REGEXP_STR
: 正規表現パターンの文字列TEXT
: 検索する文字列
- 正規表現オブジェクトを使う場合
MATCH_OBJ = REGEXP_OBJ.match(TEXT)
MATCH_OBJ
: マッチした結果が格納される変数 (オブジェクト)REGEXP_OBJ
: コンパイル済みの正規表現オブジェクトTEXT
: 検索する文字列
- search: 文字列の中に正規表現が含まれるかを判定 (こっちのほうが使い勝手が良い)
- 使い方は、match メソッドの
match
の部分が search に変わっただけ。 - 複数箇所にマッチするとしても、返される値は最初にマッチした箇所のみ。
- findall: マッチする箇所をリストで返す
- 正規表現をコンパイルしないで使う場合
MATCH_LIST = re.findall(REGEXP_STR, TEXT)
MATCH_LIST
: マッチした文字列が格納されるリストREGEXP_STR
: 正規表現パターンの文字列TEXT
: 検索する文字列
- 正規表現オブジェクトを使う場合
MATCH_LIST = REGEXP_OBJ.findall(TEXT)
MATCH_LIST
: マッチした文字列が格納されるリストREGEXP_OBJ
: コンパイル済みの正規表現オブジェクトTEXT
: 検索する文字列
マッチオブジェクトから情報を取得するメソッド
- group: マッチした文字列を返す
hoge = MATCH_OBJ.group()
hoge
: マッチした文字列を受け取る変数MATCH_OBJ
: 文字列の検索で結果を受け取ったオブジェクト
- start: マッチした箇所の開始位置を返す
hoge = MATCH_OBJ.start()
hoge
: マッチした文字列の開始位置を受け取る変数MATCH_OBJ
: 文字列の検索で結果を受け取ったオブジェクト
- end: マッチした箇所の終了位置を返す
hoge = MATCH_OBJ.end()
hoge
: マッチした文字列の終了位置を受け取る変数MATCH_OBJ
: 文字列の検索で結果を受け取ったオブジェクト
- span: マッチした箇所の開始、終了位置をタプルで返す
hoge = MATCH_OBJ.span()
hoge
: マッチした文字列の開始、終了位置のタプルを受け取る変数MATCH_OBJ
: 文字列の検索で結果を受け取ったオブジェクト
Tips
後方参照をさせない
- 正規表現パターン内で
()
を使うと、カッコ内の文字列をグループ化することができるほか、後方参照が可能になるが、グループ化のみ (後方参照を利用しない) をしたい場合は、カッコ内の先頭に?:
を付ける- 後方参照とは、() 内のパターンにマッチした結果をその後のパターンとして利用する方法である。
- () 内のパターンにマッチした結果は括弧の位置に合わせて、
\1
、\2
、\3
、…と表現する- 例: XXX と YYY の間の文字列が YYY と ZZZ の間にもある場合にマッチさせる場合
re_pattern = re.compile(r"XXX(..)YYY\1ZZZ")
- この場合、XXXaaYYYaaZZZ にマッチするが、XXXaaYYYbbZZZ にはマッチしない