Hatena::Grouppython

HM python

Pythonについて覺えたことや疑問に思ったこと、及び參考にしたリソースをメモして行く感じで。面倒なのでマーク附けは最小限に。

 | 

2006-06-16

正規表現のグループに名前を附けて參照する

Pythonの正規表現では、グループに名前を附けてその名前で參照することが出來る:

import re

s = '2006-06-16T11:12:23.96+09:00'
re_w3cdtf = re.compile(r'(?P<year>[0-9][0-9][0-9][0-9])-'
                       r'(?P<month>0[1-9]|1[0-2])-'
                       r'(?P<day>[0-2][0-9]|3[0-2])T'
                       r'(?P<hour>[0-1][0-9]|2[0-3]):'
                       r'(?P<minute>[0-5][0-9]):'
                       r'(?P<second>[0-5][0-9]).'
                       r'(?P<microseconds>[0-9]+)'
                       r'(?P<tzd>Z|[-+][0-2][0-9]:[0-5][0-9])')

m =  re_w3cdtf.search(s)
if m:
    print m.group('year')
    print m.group('month')
    print m.group('day')
    print m.group('hour')
    print m.group('minute')
    print m.group('second')
    print m.group('microseconds')
    print m.group('tzd')

實行結果:

2006
06
16
11
12
23
96
+09:00

(?P<name>)で圍んだ部分が名前附きのグループ。m.group('name') のやうにして參照出來る。通常のグループのやうに整數でも參照可。

名前附きグループは正規表現が若干繁雜になる一方、 グループ參照の際の可讀性を高める效果がある。だがそれだけだったらコメントで註を附けておけば良い話だ。名前附きグループを使ふ理由としてはそれよりも、參照の際のインデックスが不變といふ效果が大きいと思はれる。つまり、正規表現にグループを追加したり削除したらグループ番號(m.group(1)1とか)を正規表現に合せて變更しなければならない場合が多いが、名前による參照ならそのやうな手間が無い。これは結構嬉しい。

なほ通常のグループ同樣に、正規表現中や置換テキスト(re.subの第二引數など)の中でも參照出來る。(?P=name)とか\g<name>。その邊を含めた詳細については下記リンク先を參照。

 | 
MORIYAMA Hiroshi <hiroshi@kvd.biglobe.ne.jp>