主なreモジュール関数
まず、re
モジュール関数の操作をまとめる。以下の文字列をターゲットにする。
1 2 |
import re str = 'The rain in spain stays mainly in the plain.' |
re.match()
はパターンが先頭でマッチするかどうか。
1 2 3 4 5 |
print(re.match(r'The', str)) print(re.match(r'the', str)) # <re.Match object; span=(0, 3), match='The'> # None |
re.search()
はパターンが含まれるかどうか。最初に現れたパターンにのみマッチする。
1 2 3 4 5 |
print(re.search(r'in', str)) print(re.search(r'inn', str)) # <re.Match object; span=(6, 8), match='in'> # None |
re.findall()
は一致するパターン全てのリストを返す。
1 2 3 4 5 |
print(re.findall(r'in', str)) print(re.findall(r'inn', str)) # ['in', 'in', 'in', 'in', 'in', 'in'] # [] |
re.finditer()
は一致するパターンのイテレータを返す。
1 2 3 4 5 6 7 8 9 |
for s in re.finditer(r'in', str): print(s) # <re.Match object; span=(6, 8), match='in'> # <re.Match object; span=(9, 11), match='in'> # <re.Match object; span=(15, 17), match='in'> # <re.Match object; span=(26, 28), match='in'> # <re.Match object; span=(31, 33), match='in'> # <re.Match object; span=(41, 43), match='in'> |
re.sub()
は一致するパターンを置き換え。
1 2 3 |
print(re.sub(r'in', 'IN', str)) # The raIN IN SpaIN stays maINly IN the plaIN. |
re.subn()
は一致するパターンを置き換え、その結果と置換回数のタプルを返す。
1 2 3 |
print(re.subn(r'in', 'IN', str)) # ('The raIN IN SpaIN stays maINly IN the plaIN.', 6) |
コンパイル
パターン文字列をコンパイルしパターンオブジェクト化することで、再利用・高速化が可能。この場合、reモジュール関数と同じ名前のメソッドが使える。
1 2 3 4 5 6 7 8 9 10 |
pattern = re.compile(r'in') print(pattern.search(str)) print(pattern.findall(str)) print(pattern.sub('IN', str)) print(pattern.subn('IN', str)) # <re.Match object; span=(6, 8), match='in'> # ['in', 'in', 'in', 'in', 'in', 'in'] # The raIN IN SpaIN stays maINly IN the plaIN. # ('The raIN IN SpaIN stays maINly IN the plaIN.', 6) |
マッチオブジェクトの利用
上記のうちmatch()、search()、findall()はマッチオブジェクトを返す。マッチオブジェクトの主なメソッドには、マッチした開始点を返すstart()
、終了点(+1)を返すend()
、それらをタプルで範囲として返すspan()
、マッチした文字列を返すgroup()
がある。
1 2 3 4 5 6 |
str = 'Peter piper picked a peck of pickled pepper.' pattern = re.compile(r'[Pp]\w+r') m = pattern.search(str) print(m.start(), m.end(), m.span(), m.group()) # 0 5 (0, 5) Peter |
複数のマッチした文字列を処理するには、finditer()
で順次マッチオブジェクトを取り出すとよい。
1 2 3 4 5 6 |
for m in pattern.finditer(str): print(m.start(), m.end(), m.span(), m.group()) # 0 5 (0, 5) Peter # 6 11 (6, 11) piper # 37 43 (37, 43) pepper |