37

如果我只有一个 10 位或更多位的字符串,我该如何将其格式化为电话号码?

一些简单的例子:

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

我知道这些不是格式化它们的唯一方法,如果我自己做的话,我很可能会遗漏一些东西。是否有 python 库或格式化电话号码的标准方法?

4

6 回答 6

53

对于图书馆:电话号码(pypisource

用于解析、格式化、存储和验证国际电话号码的 Google 通用库的 Python 版本。

自述文件不足,但我发现代码有据可查。

于 2011-08-14T18:40:50.687 回答
33

似乎您的示例格式化为除最后一位之外的三位数组,您可以编写一个简单的函数,使用千位分隔符并添加最后一位:

>>> 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,因为 "," 格式化程序是 Python 2.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

更冗长,一个依赖,但保证大多数输入的输出一致并且写起来很有趣:

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

一个简单的解决方案可能是从后面开始并在四个数字后插入连字符,然后以三个为一组,直到到达字符串的开头。我不知道内置函数或类似的东西。

您可能会发现这很有帮助: http ://www.diveintopython3.net/regular-expressions.html#phonenumbers

如果您接受用户输入的电话号码,正则表达式将很有用。我不会使用上面链接中遵循的确切方法。更简单的事情,比如去掉数字,可能更容易而且同样好。

此外,在数字中插入逗号是一个类似的问题,已经在其他地方有效地解决了,并且可以适应这个问题。

于 2011-08-14T16:46:54.157 回答