ひきメモ

2007-12-20

[]正規表現 - コンパイル、マッチング、マッチした部分の取り出し

正規表現コンパイル

>>> import re
>>> r = re.compile("(\w)=(\d)")
>>> print r
<_sre.SRE_Pattern object at 0x00954EC0>

マッチングを行う

search( )は文字列の中にマッチする部分があるかを、match( )は文字列の先頭でマッチするかを調べます。

>>> import re
>>> r = re.compile("[a-z]+")
>>> m = r.search("abcdef") # マッチしたらMatchObjectのインスタンスを返す
>>> print m 
<_sre.SRE_Match object at 0x009D4218>
>>> m = r.search("123456") # マッチしなければNoneを返す
>>> print m 
None
>>>
>>> m = r.match("123abc")  # 先頭でマッチしないと駄目
>>> print m
None
>>> m = r.search("123abc") # どこでマッチしてもよい
>>> print m
<_sre.SRE_Match object at 0x009D4288>

マッチした部分を取り出す

group( )でマッチした部分全体、または( )にマッチした部分を取り出すことができます。

>>> r = re.compile("([a-z]+)=([0-9])"
>>> m = r.search("abc=123&def=456")
>>> m.group(0)    # マッチした部分全て
'abc=1'
>>> m.group(1)    # 1番目のグループ
'abc'
>>> m.group(2)    # 2番目のグループ
'1'
>>> m.group(1, 2) # 複数のグループ
('abc', '1')
>>>
>>> m.groups()    # 全てのグループ
('abc', '1')
>>>
>>> r = re.compile("[a-z]=\d$")
>>> m = r.search("a=1&b=2")
>>> m.start() # マッチした文字列が始まる位置
4
>>> m.end()   # マッチした文字列が終わる位置
7
>>> m.span()  # start()とend()のタプル
(4, 7)

マッチした部分を全て取り出す

search( )やmatch( )では最初にマッチした部分しか取り出せません。マッチした部分を全て取り出すにはfindall( )を使います。

>>> r = re.compile(r"[a-z]=[0-9]")
>>> r.findall("a=1&b=2&c=3") # マッチした部分からなるリストを返す
['a=1', 'b=2', 'c=3']
>>>
>>> r = re.compile("([a-z])=[0-9]")
>>> r.findall("a=1&b=2&c=3") # ( )があればグループのリスト
['a', 'b', 'c']
>>>
>>> r = re.compile("([a-z])=([0-9])")
>>> r.findall("a=1&b=2&c=3") # 複数の( )があればタプルのリスト
[('a', '1'), ('b', '2'), ('c', '3')]
>>>
>>> r.findall("hogehoge")    # マッチしなければ空のリスト
[]

リストではなくMatchObjectのインスタンスが欲しい場合はfinditer( )を使います。

>>> r = re.compile("([a-z])=(\d)")
>>> for x in r.finditer("a=1&b=2&c=3"):
...     print x
...     print x.groups()
...
<_sre.SRE_Match object at 0x009D60F8>
('a', '1')
<_sre.SRE_Match object at 0x009C3DA0>
('b', '2')
<_sre.SRE_Match object at 0x009D60F8>
('c', '3')

monofeemonofee 2008/07/02 14:13 googleからやってきました。
group()の使い方にとまどっていたのですが、おかげさまでしっかり理解できました!
ありがとうございました!