Pythonで正規表現:電話番号

郵便番号については既に議論した。次は電話番号行を特定するための正規表現である。
電話番号行は
行の先頭が’電話’、’Tel’、’TEL’で始まる文字列の行(例:電話022-222-4444)。または0から9の半角数字、記号’-‘、記号'(‘、記号’)’の文字からのみなる文字列(例:022(222)2345や022-227-2345)とする。
この条件をPythonで書くと:


#coding: utf-8
import re
msgs = ['電話022-222-2222', 'Tel022-222-2345', 'TEL022-228-5678', \
        '022(2267)5678', '234-3456-4567', '456局345(65678)','34+456+4567']
for i, msg in enumerate(msgs):
    m1 = re.search(r'^電話|Tel|TEL', msg)
    #print(i, m1)
    m2 = re.search(r'[^0-9-()]', msg)
    #print(i, m2)
    if bool(m1) or not bool(m2):
        print(msg, ' OK')
    else:
        print(msg, ' NG')

m1は文の先頭に’電話’等の文字列があることを条件にしている。m2は当該の位置にない文字を指定している。つまり、0から9まで半角数字、記号’-‘、記号'(‘、記号’)’以外のものがあるとマッチする。文字列のどこかに該当する文字があるとマッチする1文字マッチの条件である。m2にはその文字が代入される。その文字列の最後まで探して該当する文字がないとm2はNoneになる。つまり、除外した文字のみでできている文字列であるかどうかを判定できる。

結果は
電話022-222-2222 OK
Tel022-222-2345 OK
TEL022-228-5678 OK
022(2267)5678 OK
234-3456-4567 OK
456局345(65678) NG
34+456+4567 NG
となる。

Pythonによる正規表現はここが詳しい。