Python代码接受许多不同格式的美国电话号码?

时间:2009-11-13 18:30:36

标签: python

我正在阅读许多用户输入的数据,这些数据代表文件中的电话号码。它们的输入方式略有不同:

5555555555
555-555-5555
555-555/5555
1555-555-5555
etc...

如何在Python中轻松解析所有这些电话号码并生成规范输出,如: 555-555-5555?

6 个答案:

答案 0 :(得分:9)

答案 1 :(得分:6)

我不是美国人,但这适用于俄罗斯电话号码......也许它也适用于美国电话号码?

  1. 弃掉所有非数字字符
  2. 验证剩余数字的数量
  3. 在适当的位置插入几个破折号

答案 2 :(得分:3)

只使用正则表达式的数字。然后找出它们是否附加1(无区域代码以1开头)。如果它在那里,删除它,否则,格式化您想要的10位数。

import re
pnumber = re.sub("[^0-9]", "", input_number)
if pnumber[0] == 1:
    pnumber = pnumber[1:]#strip 1st char if it's a 1

#insert the dashes
if len(pnumber) == 10:
    pnumber = "%s-%s-%s" % (pnumber[:3],pnumber[3:6],pnumber[6:])
else:
    #throw error

答案 3 :(得分:2)

使用string.maketrans进行一些准备后,字符串'translate方法可以提供非常快速和简单的操作。我正在为普通字符串提供Python 2代码(Python 3和Python 2中的Unicode字符串,有点不同 - 请问这是否是您需要的):

准备工作(一劳永逸,例如在模块加载时):

>>> import string
>>> allchars = string.maketrans('', '')
>>> nondigits = allchars.translate(allchars, string.digits)

执行(将任何合适的字符串转换为属性格式化的数字):

>>> x='1555-555-5555'
>>> y=(x.translate(allchars, nondigits)).lstrip('1')
>>> assert len(y) == 10
>>> '%s-%s-%s' % (y[:3], y[3:6], y[6:])
'555-555-5555

当然,当len(y) 等于10时,你需要决定该做什么(只是因为我在这里做了一个异常,或者还有什么)。但是,这也适用于任何其他形式的处理(正则表达式或其他)。 translate方法非常快速而简单! - )

答案 4 :(得分:0)

def extractNumber(s):
    """take a string phone number and extract it to the legal string"""

    target = ""
    for char in s:
        try:
            target += int(s)
        except ValueError:
            target += '-'

    return target

答案 5 :(得分:0)

确定要识别的格式,然后创建一个正则表达式,匹配每个格式的不同部分(如区号,前缀等)。最后使用替换来生成您想要的规范输出。

示例:

匹配

xxx-xxx-xxxx   -> \d{3}-\d{3}-\d{4}
(xxx) xxx-xxxx -> \(\d{3}\) \d{3}-\d{4}
1-xxx-xxx-xxx  -> 1-\d{3}-\d{3}-\d{4}

这忽略了限制前缀和区域代码的规则(美国不允许区域代码或前缀为0或1)。您可以尝试并且超级聪明,并创建一个匹配所有内容的正则表达式,但最终会出现无法修改的乱七八糟的混乱,而您应该将这些模式组合在一起,以便将来更容易修改。

基本理念:

pattern = re.compile(r'\d{3}-\d{3}-\d{4}|\(\d{3}\) \d{3}-\d{4}|1-\d{3}-\d{3}-\d{4}')

为规范输出添加了分组

pattern = re.compile(r'(\d{3})-(\d{3})-(\d{4})|\((\d{3})\) (\d{3})-(\d{4})|1-(\d{3})-(\d{3})-(\d{4})')

然后只针对您的输入运行它,对于每个电话号码输入,您将有3个匹配的组,一个用于区号,一个用于前缀,一个用于后缀,您可以根据需要输出。你需要对正则表达式有一个基本的了解,但它不应该太难。