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