【Python】正規表現を使用して電話番号検索をやってみる

検索対象パターン

今回検索対象パターンとなる文字列は
123-456-7890のような
3桁の数字 – 3桁の数字 – 4桁の数字で構築された文字列です。

使用するモジュール

・re

正規表現で電話番号検索

実際にPythonで正規表現を使用し文字列検索を行う場合は下記の手順で行います。
1.Regexオブジェクトの生成
2.Matchオブジェクトの生成
3.実際にマッチした結果を取得

Regexオブジェクトの生成

まずPythonで正規表現で検索する場合はRegexオブジェクトを作成する必要があります。
Regexオブジェクトはreモジュールのcompile関数で作成します。

#電話番号を検索するRegexオブジェクト
phone_number_rx = re.compile(r"\d\d\d-\d\d\d-\d\d\d\d")
#上記の方法でもいいが、同じパターンがあるので{}で繰り返し回数を指定して短くすることもできる
phone_number_rx = re.compile(r"\d{3}-\d{3}-\d{4}")

Matchオブジェクトの生成

次に実際に文字列を検索するときは、
Regexオブジェクトのsearchメソッドを使って文字列の中から電話番号を検索し、
検索結果のMatchオブジェクトを取得します。

#Regexオブジェクトで検索しMatchオブジェクトを取得する
phone_number_mo =  phone_number_rx.search("testnumber=123-456-7890")

実際にマッチした結果を取得

検索しただけではMatchオブジェクトのままです。
これでは検索した結果がわからないので、
Matchオブジェクトのgroupメソッドを使用して結果の文字列を取得します。

phone_number_mo.group()

(例外)検索文字列内に複数のマッチする結果がある場合

正規表現を使用してRegexオブジェクトのsearchメソッドで検索すると、
検索文字列内で最初にヒットした文字列がMatchオブジェクトとして返されます。
もし複数取得したい場合はRegexオブジェクトのfindallメソッドを使用します。
ただし、このときRegexオブジェクトはMatchオブジェクトを返さず、検索した結果の文字列リストを返します。

result = phone_number_rx.findall("testnumber=123-456-7890,222-456-5555,333-555-8888")
#このときresultの中身は['123-456-7890', '222-456-5555', '333-555-8888']

サンプルコード

import re

REGEX_PHONE_NUMBER=r"\d{3}-\d{3}-\d{4}"

def search_phone_number(search_str):
    #電話番号のRegexオブジェクトをつくる
    phone_number_rx=re.compile(REGEX_PHONE_NUMBER)
    #電話番号のRegexで文字列を検索しMatchオブジェクトを取得
    phone_number_mo =  phone_number_rx.search(search_str)
    #groupで検索結果を表示
    print(phone_number_mo.group())
    
    #電話番号のRegexで検索結果全て取得
    result = phone_number_rx.findall(search_str)
    print(result)    

if __name__ == "__main__":
    search_str = "testnumber=123-456-7890,222-456-5555,333-555-8888"
    search_phone_number(search_str)

あわせて読みたい