10桁以上の文字列しかない場合、これを電話番号としてフォーマットするにはどうすればよいですか?
いくつかの些細な例:
555-5555
555-555-5555
1-800-555-5555
それらをフォーマットする方法はそれだけではないことを私は知っています、そして私がそれを自分で行うなら、私は物事を省く可能性が非常に高いです。Pythonライブラリまたは電話番号をフォーマットする標準的な方法はありますか?
10桁以上の文字列しかない場合、これを電話番号としてフォーマットするにはどうすればよいですか?
いくつかの些細な例:
555-5555
555-555-5555
1-800-555-5555
それらをフォーマットする方法はそれだけではないことを私は知っています、そして私がそれを自分で行うなら、私は物事を省く可能性が非常に高いです。Pythonライブラリまたは電話番号をフォーマットする標準的な方法はありますか?
最後を除いて3桁のグループでフォーマットされた例のように見えます。単純な関数を記述し、千の区切り記号を使用して最後の桁を追加できます。
>>> def phone_format(n):
... return format(int(n[:-1]), ",").replace(",", "-") + n[-1]
...
>>> phone_format("5555555")
'555-5555'
>>> phone_format("5555555")
'555-5555'
>>> phone_format("5555555555")
'555-555-5555'
>>> phone_format("18005555555")
'1-800-555-5555'
これは、utdemirのソリューションとPython 2.6で動作するこのソリューションを応用したものです。これは、「、」フォーマッターがPython2.7の新機能であるためです。
def phone_format(phone_number):
clean_phone_number = re.sub('[^0-9]+', '', phone_number)
formatted_phone_number = re.sub("(\d)(?=(\d{3})+(?!\d))", r"\1-", "%d" % int(clean_phone_number[:-1])) + clean_phone_number[-1]
return formatted_phone_number
clean_phone()ライブラリDataPrepの関数を使用できます。でインストールしpip install dataprepます。
>>> from dataprep.clean import clean_phone
>>> df = pd.DataFrame({'phone': ['5555555', '5555555555', '18005555555']})
>>> clean_phone(df, 'phone')
Phone Number Cleaning Report:
3 values cleaned (100.0%)
Result contains 3 (100.0%) values in the correct format and 0 null values (0.0%)
phone phone_clean
0 5555555 555-5555
1 5555555555 555-555-5555
2 18005555555 1-800-555-5555
より冗長で、1つの依存関係がありますが、ほとんどの入力に対して一貫した出力が保証され、書くのが楽しかったです。
import re
def format_tel(tel):
tel = tel.removeprefix("+")
tel = tel.removeprefix("1") # remove leading +1 or 1
tel = re.sub("[ ()-]", '', tel) # remove space, (), -
assert(len(tel) == 10)
tel = f"{tel[:3]}-{tel[3:6]}-{tel[6:]}"
return tel
出力:
>>> format_tel("1-800-628-8737")
'800-628-8737'
>>> format_tel("800-628-8737")
'800-628-8737'
>>> format_tel("18006288737")
'800-628-8737'
>>> format_tel("1800-628-8737")
'800-628-8737'
>>> format_tel("(800) 628-8737")
'800-628-8737'
>>> format_tel("(800) 6288737")
'800-628-8737'
>>> format_tel("(800)6288737")
'800-628-8737'
>>> format_tel("8006288737")
'800-628-8737'
マジックナンバーなし。...簡潔にすることに興味がない場合:
def format_tel(tel):
AREA_BOUNDARY = 3 # 800.6288737
SUBSCRIBER_SPLIT = 6 # 800628.8737
tel = tel.removeprefix("+")
tel = tel.removeprefix("1") # remove leading +1, or 1
tel = re.sub("[ ()-]", '', tel) # remove space, (), -
assert(len(tel) == 10)
tel = (f"{tel[:AREA_BOUNDARY]}-"
f"{tel[AREA_BOUNDARY:SUBSCRIBER_SPLIT]}-{tel[SUBSCRIBER_SPLIT:]}")
return tel
簡単な解決策は、後ろから始めて、4つの数字の後にハイフンを挿入し、文字列の先頭に到達するまで3つのグループを実行することです。組み込み関数などは知りません。
これが役立つ場合があります: http ://www.diveintopython3.net/regular-expressions.html#phonenumbers
電話番号のユーザー入力を受け入れる場合は、正規表現が役立ちます。上記のリンクにある正確なアプローチは使用しません。数字を取り除くなど、もっと単純なものの方がおそらく簡単で同じくらい良いでしょう。
また、数字にコンマを挿入することは、他の場所で効率的に解決され、この問題に適応できる類似の問題です。