2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】電話番号のハイフンに似ている記号を統一して正規化する

Posted at

#コード作成のきっかけ
CSVファイルに保存されていた電話番号を読み込み、別のシステムに送る時に事件は起きました。
CSVファイルに保存されていた電話番号は、全角ハイフンだけでなく、マイナス(−)やダッシュ(―)、エンダッシュ(–)などで区切られていたのです・・・。
送り先のシステムでは、電話番号を半角ハイフンでしか読み取る事ができず、このままではエラーが起きてしまいます。
その為、変換するプログラムを作成しました。
これは、phonenumbersを知らなかった時に作成したプログラムになります。
(phonenumbersってすごい。。。 phonenumbers Python Library

#対象の電話番号
CSVファイルを見てみると、様々な電話番号がありました。
全角数字の電話番号、()で数字を分けた電話番号、スペース(空白)で分けた電話番号、国際電話表現になっている電話番号、幸いなことに数字のみの電話番号はありませんでした。
今回は数字だけの電話番号をハイフンで分ける事はできないプログラムになります。
(03とか0120とか、数値によってハイフンの位置を決める必要があります。この規則性をコーディングするのは面倒なので、そのような場合はphonenumbers使うと便利です。)

number.py
print(number_format('0120-123-123')) #半角
print(number_format('0120ー999ー999')) #全角
print(number_format('03(1111)2222')) #()付き 全半角
print(number_format('090 1111 2222')) #空白区切り 全半角
print(number_format('080ー1111−2222')) #全角のハイフンとマイナス記号 全半角
print(number_format('+81-90-1234ー5678')) #国際電話での表現 全半角

#半角ハイフンの電話番号に変換する
半角ハイフンの電話番号に変換する為に、まずは全角の数字を半角に変化します。
また、電話番号を一度数字の固まりごとに分割し、分割した数字を半角のハイフンで連結する事にしました。(電話番号内のマイナスやダッシュを検索し、半角ハイフンにする事も考えましたが、全てのハイフンっぽいものを洗い出すのではなく、今回は記号の部分を半角ハイフンに変換する方向性で進めました)
国際電話の場合は、+81を取り出して、0を先頭につける事にします。
これらの処理をPythonでコーディングしたものが、以下になります。

code.py
import re

def number_format(call_number):
    format_number = ''
    hyphen = '-'

    hankaku = str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}) #全角を半角に
    split_number = re.findall(r'\d+', call_number) #数字のみ取り出す

    if call_number[:1] == '+' or call_number[:1] == '': #+81の国際電話番号の場合
        del split_number[0]
        format_number = '0' + split_number[0]
    else:
        format_number = split_number[0]

    for i in range(1, len(split_number)): #分割した数字を繋げる      
        format_number += hyphen + split_number[i]
        
    return format_number.translate(hankaku) 

#結果
結果としては、以下のように半角数字、半角ハイフンの電話番号に置換する事ができました。

kekka.log
0120-123-123
0120-999-999 
03-1111-2222 
090-1111-2222
080-1111-2222
090-1234-5678

今回は、数字だけの電話番号を半角ハイフンのフォーマットに変換する事はできていませんが、半角ハイフンに似ている記号を使用した電話番号を半角ハイフンの電話番号に変換する事はできました。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?