【Python】正規表現を使用して電話番号検索をやってみる(パート2)

検索対象パターン

今回検索対象パターンとなる文字列は

123-456-7890
123 456 7890
123.456.7890

のような3桁の数字 区切り 3桁の数字 区切り 4桁の数字で構築された文字列です。

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

の区切り文字が”-”以外もあり得る場合のパターンです。

使用するモジュール

・re

正規表現で電話番号検索

Pythonで正規表現を使用し文字列検索を行う場合は下記の手順で行います。

1.Regexオブジェクトの生成
2.Matchオブジェクトの生成
3.実際にマッチした結果を取得

 

区切り文字の正規表現

今回は区切り文字として
・空白
・.
・-
の3パターンがあります。
これを正規表現で表す場合は
\s|-|\.
です。

縦線”|”を用いることでor条件を指定できるようになり
指定された区切り文字いずれかにマッチすることを指定できます。

今回使用する正規表現

(\d{3})(\s|-|\.)(\d{3})(\s|-|\.)(\d{4})
区切り文字のみをor指定したいのでグルーピングを用いています。

※グルーピングの記事はこちら

Regexオブジェクトの生成

正規表現文字列から検索オブジェクトであるRegexオブジェクトを作成します

#電話番号のRegexオブジェクトをつくる
phone_number_rx=re.compile(r"(\d{3})(\s|-|\.)(\d{3})(\s|-|\.)(\d{4})")

Matchオブジェクトの生成

今回は複数取得を対象とするのでMatchオブジェクトは作成しません

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

Regexオブジェクトのfindallメソッドを使用して検索対象文字列から電話番号を取得します。

#電話番号のRegexで検索結果全て取得
phone_number_rx.findall("testnumber=123-456-7890,222-456-5555,333-555-8888")
#結果[('123', '-', '456', '-', '7890'), ('222', ' ', '456', ' ', '5555'), ('333', '.', '555', '.', '8888')]

サンプルコード

import re

REGEX_PHONE_NUMBER=r"(\d{3})(\s|-|\.)(\d{3})(\s|-|\.)(\d{4})"

def search_phone_number(search_str):
    #電話番号のRegexオブジェクトをつくる
    phone_number_rx=re.compile(REGEX_PHONE_NUMBER)
    
    #電話番号のRegexで検索結果全て取得
    result = phone_number_rx.findall(search_str)
    print(result)
    
    #検索結果のtupleから数値のみ抜き出し"-"で連結
    for phone_number in result:
        print("-".join([phone_number[0],phone_number[2],phone_number[4]]))
    
    

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

あわせて読みたい