Pythonの正規表現はエスケープ文字に気をつける
import re phone_regex = re.compile(r'''( (\d{3}|\(\d{3}\))? (\s|-|\.)? (\d{3}) (\s|-|\.) (\d{4}) (\s*(ext|x|ext.)\s*(\d{2,5}))? )''', re.VERBOSE) mo1 = phone_regex.findall('333-333-4444 x 555') print(mo1) # [('333-333-4444 x 555', '333', '-', '333', '-', '4444', ' x 555', 'x', '555')]
全体がリストの[0]になり()で囲まれた部分が順番にリストになっている → findall()メソッド。
問題は \( \) のエスケープ文字だ。これは文字であって、()に含まれない。当たり前だ。これを勘違いしてしまうと
凄い混乱がおこってしまう。気を付けていただきたい。
青文字のところにあるように、まず全体の正規表現がリストに格納され → 次にその内側の括弧がリストに格納される。
しかしこの改行で正規表現ができるようになる”'()”’は非常に便利だ。