Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python代码接受多种不同格式的美国电话号码?_Python - Fatal编程技术网

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

Python代码接受多种不同格式的美国电话号码?,python,Python,我从文件中读取了大量用户输入的代表电话号码的数据。它们的输入方式略有不同: 5555555555 555-555-5555 555-555/5555 1555-555-5555 etc... 5555555555 555-555-5555 555-555/5555 1555-555-5555 等 我如何在Python中轻松解析所有这些电话号码并生成规范输出,如: 555-555-5555?我不是美国人,但这适用于俄罗斯电话号码。。。也许这也适用于美国的 放弃所有非数字字符 验证剩余的数字量 在适

我从文件中读取了大量用户输入的代表电话号码的数据。它们的输入方式略有不同:

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

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

  • 放弃所有非数字字符
  • 验证剩余的数字量
  • 在适当的位置插入几条破折号

  • 只取带有正则表达式的数字。然后找出他们是否附加了1(没有以1开头的区号)。如果它在那里,请删除它,否则,按您想要的方式格式化10位数字

    import re
    pnumber = re.sub("[^0-9]", "", input_number)
    if pnumber[0] == 1:
        pnumber = pnumber[1:] #strip 1st char if 1
    
    #insert the dashes
    if len(pnumber) == 10:
        pnumber = "%s-%s-%s" % (pnumber[:3],pnumber[3:6],pnumber[6:])
    else:
        #throw error
    

    深入Python有一节是关于解析电话号码的


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

    例如:

    相配

    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个匹配组,一个用于区号,一个用于前缀,一个用于后缀,您可以根据需要输出。您需要对正则表达式有一个基本的了解,但这应该不会太难。

    经过一点准备,strings的方法提供了非常快速和简单的操作。我给出了用于普通字符串的Python 2代码(Python 3和Python 2中的Unicode字符串有点不同——询问这是否是您所需要的):

    准备(一次性完成,例如在模块加载时):

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


    当然,当
    len(y)
    等于10时,您需要决定要做什么(只需像我在这里所做的那样引发一个异常,或者,还有什么)。但是,这对于任何其他形式的处理(regex或其他任何形式)都是必要的。
    translate
    方法非常快速和简单

    您可能还想了解北美的编号计划。这不仅是一个彻底的答案,而且还注意到,即使是电话号码在解析时也会出现转角情况。
    pattern = re.compile(r'(\d{3})-(\d{3})-(\d{4})|\((\d{3})\) (\d{3})-(\d{4})|1-(\d{3})-(\d{3})-(\d{4})')
    
    >>> 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