正規表現をつかう

Python の正規表現は Ruby や Perl のように組み込みではなくて、reモジュールとして提供されている。使い方は2通りあって、ひとつはreモジュールの関数を使うやり方、もうひとつはre.compile関数で正規表現オブジェクトを作って使うやり方だ。

reモジュールの関数を使う

ここでは関数を使うやり方を試してみよう。

re.findall は文字列中で正規表現にマッチする部分すべてをリストとして返す。

>>> re.findall("a.", "abcacbcba")
['ab', 'ac']

re.split は文字列を分割する。

>>> re.split("b", "abcacbcba")
['a', 'cac', 'c', 'a']

re.sub は正規表現にマッチする部分を置き換える。

>>> re.sub("a", "A", "abcacbcba")
'AbcAcbcbA'

re.search は文字列中にマッチする部分を見つけて、マッチオブジェクトを返す。最初に見つかって部分しか返ってこないみたい。

>>> m = re.search("b.", "abcacbcba")
>>> m.group()
'bc'

re.match は re.serch と同様だけど、文字列の先頭だけを対象とする。マッチオブジェクトを返す。

>>> m = re.match("a.", "abcacbcba")
>>> m.group()
'ab'

先頭にマッチしない場合は m.group() がエラーになる。

>>> m = re.match("b.", "abcacbcba")
>>> m.group()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'NoneType' object has no attribute 'group'

re.finditer はマッチオブジェクトを返すイテレータを返す。

>>> for m in re.finditer("a.", "abcacbcba"):
...     print m.group()
...
ab
ac

正規表現オブジェクトを使う

同じ正規表現を何度も使う場合は、正規表現オブジェクトを作ったほうが速度的に有利みたい。正規表現オブジェクトを作るには re.compile 関数を使う。

>>> r = re.compile("a.")
>>> r.findall("abcacbcba")
['ab', 'ac']

r が正規表現オブジェクト。正規表現オブジェクトには reモジュールの関数と同じ動作をするメソッドがあって、使い方も同じ(引数に正規表現パターンがない以外は)。

マッチオブジェクト

search や match はマッチオブジェクトを返す。マッチオブジェクトには、マッチした文字列やサブグループの情報が保存されている。

>>> r = re.compile("a(..)a(..)")
>>> m = r.match("abcacbcba")
>>> m.groups()
('bc', 'cb')
>>> m.group()
'abcacb'
>>> m.group(0)
'abcacb'
>>> m.group(1)
'bc'
>>> m.group(2)
'cb'

これはたぶん後方参照やなんかに使えるんだろう。