正規表現 - コンパイル、マッチング、マッチした部分の取り出し
正規表現のコンパイル
>>> 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')