37

10桁以上の文字列しかない場合、これを電話番号としてフォーマットするにはどうすればよいですか?

いくつかの些細な例:

555-5555
555-555-5555
1-800-555-5555

それらをフォーマットする方法はそれだけではないことを私は知っています、そして私がそれを自分で行うなら、私は物事を省く可能性が非常に高いです。Pythonライブラリまたは電話番号をフォーマットする標準的な方法はありますか?

4

6 に答える 6

53

ライブラリの場合:電話番号(pypisource

国際電話番号の解析、フォーマット、保存、検証のためのGoogleの共通ライブラリのPythonバージョン。

READMEは不十分ですが、コードは十分に文書化されていることがわかりました。

于 2011-08-14T18:40:50.687 に答える
33

最後を除いて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'
于 2011-08-14T16:48:36.617 に答える
6

これは、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
于 2014-10-17T01:02:24.187 に答える
1

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
于 2021-02-16T23:17:41.910 に答える
1

より冗長で、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
于 2021-09-09T00:20:43.160 に答える
0

簡単な解決策は、後ろから始めて、4つの数字の後にハイフンを挿入し、文字列の先頭に到達するまで3つのグループを実行することです。組み込み関数などは知りません。

これが役立つ場合があります: http ://www.diveintopython3.net/regular-expressions.html#phonenumbers

電話番号のユーザー入力を受け入れる場合は、正規表現が役立ちます。上記のリンクにある正確なアプローチは使用しません。数字を取り除くなど、もっと単純なものの方がおそらく簡単で同じくらい良いでしょう。

また、数字にコンマを挿入することは、他の場所で効率的に解決され、この問題に適応できる類似の問題です。

于 2011-08-14T16:46:54.157 に答える