我正在阅读许多用户输入的数据,这些数据代表文件中的电话号码。它们的输入方式略有不同:
5555555555 555-555-5555 555-555/5555 1555-555-5555 etc...
如何在Python中轻松解析所有这些电话号码并生成规范输出,如: 555-555-5555?
答案 0 :(得分:9)
深入Python有一节解析电话号码
http://www.diveintopython.org/regular_expressions/phone_numbers.html
答案 1 :(得分:6)
我不是美国人,但这适用于俄罗斯电话号码......也许它也适用于美国电话号码?
答案 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个匹配的组,一个用于区号,一个用于前缀,一个用于后缀,您可以根据需要输出。你需要对正则表达式有一个基本的了解,但它不应该太难。