如果我只有一个 10 位或更多位的字符串,我该如何将其格式化为电话号码?
一些简单的例子:
555-5555
555-555-5555
1-800-555-5555
我知道这些不是格式化它们的唯一方法,如果我自己做的话,我很可能会遗漏一些东西。是否有 python 库或格式化电话号码的标准方法?
如果我只有一个 10 位或更多位的字符串,我该如何将其格式化为电话号码?
一些简单的例子:
555-5555
555-555-5555
1-800-555-5555
我知道这些不是格式化它们的唯一方法,如果我自己做的话,我很可能会遗漏一些东西。是否有 python 库或格式化电话号码的标准方法?
似乎您的示例格式化为除最后一位之外的三位数组,您可以编写一个简单的函数,使用千位分隔符并添加最后一位:
>>> 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,因为 "," 格式化程序是 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
您可以使用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
更冗长,一个依赖,但保证大多数输入的输出一致并且写起来很有趣:
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
一个简单的解决方案可能是从后面开始并在四个数字后插入连字符,然后以三个为一组,直到到达字符串的开头。我不知道内置函数或类似的东西。
您可能会发现这很有帮助: http ://www.diveintopython3.net/regular-expressions.html#phonenumbers
如果您接受用户输入的电话号码,正则表达式将很有用。我不会使用上面链接中遵循的确切方法。更简单的事情,比如去掉数字,可能更容易而且同样好。
此外,在数字中插入逗号是一个类似的问题,已经在其他地方有效地解决了,并且可以适应这个问题。