Python:尝试检查有效的电话号码

时间:2013-03-06 21:45:36

标签: python

我正在尝试编写一个程序,该程序接受XXX-XXX-XXXX格式的电话号码,并将条目中的任何字母翻译为相应的数字。

现在我有了这个,如果开始不正确,它会允许你重新输入正确的数字,但它会翻译输入的原始数字。我该如何解决这个问题?

def main():
    phone_number= input('Please enter a phone number in the format XXX-XXX-XXXX: ')
    validNumber(phone_number)
    translateNumber(phone_number)

def validNumber(phone_number):
for i,c in enumerate(phone_number):
    if i in [3,7]:
        if c != '-':
            phone_number=input('Please enter a valid phone number: ')
        return phone_number
    elif not c.isalnum():
        phone_number=input('Please enter a valid phone number: ')
        return phone_number
return phone_number


def translateNumber(phone_number):
    s=""
    for char in phone_number:
        if char is '1':
            x1='1'
            s= s + x1
        elif char is '-':
            x2='-'
            s= s + x2
        elif char in 'ABCabc':
            x3='2'
            s= s + x3
        elif char in 'DEFdef':
            x4='3'
            s= s + x4
        elif char in 'GHIghi':
            x5='4'
            s= s + x5
        elif char in 'JKLjkl':
            x6='5'
            s= s + x6
        elif char in 'MNOmno':
            x7='6'
            s= s + x7
        elif char in 'PQRSpqrs':
            x8='7'
            s= s + x8
        elif char in 'TUVtuv':
            x9='8'
            s= s + x9
        elif char in 'WXYZwxyz':
            x10='9'
            s= s + x10
    print(s)

6 个答案:

答案 0 :(得分:11)

import re

def validNumber(phone_nuber):
    pattern = re.compile("^[\dA-Z]{3}-[\dA-Z]{3}-[\dA-Z]{4}$", re.IGNORECASE)
    return pattern.match(phone_nuber) is not None

答案 1 :(得分:3)

如果您不想使用正则表达式:您可以使用isalnum检查某些内容是否为数字或字母。您可以使用n访问字符串中的mystr[n]字符,因此您可以尝试:

def validNumber(phone_number):
    if len(phone_number) != 12:
        return False
    for i in range(12):
        if i in [3,7]:
            if phone_number[i] != '-':
                return False
        elif not phone_number[i].isalnum():
            return False
    return True

要了解phone_number[i]正在做什么,请尝试以下方法:

for i in range(len(phone_number)):
    print i, phone_number[i]

使用enumerate

def validNumber(phone_number):
    for i,c in enumerate(phone_number):
        if i in [3,7]:
            if c != '-':
                return False
        elif not c.isalnum():
            return False
    return True

一旦你有了它,你应该稍后使用它(在main内),如:

def main():
    phone_number = '' # an invalid number to initiate while loop
    while not validNumber(phone_number):
        phone_number = input('Please enter a phone number in the format XXX-XXX-XXXX: ')
    translated_number = translateNumber(phone_number)

答案 2 :(得分:2)

  1. 您应该使用正则表达式来匹配文本。
  2. 字符串模块具有translate功能,可替换大部分逻辑
  3. 下面的代码示例。请注意我如何将所有内容都转换为小写以简化正则表达式和翻译。

    import string
    import re
    
    RE_phone = re.compile("^[a-z0-9]{3}-[a-z0-9]{3}-[a-z0-9]{4}$")
    
    map_in  = 'abcdefghijklmnprstuvwxyz'
    map_out = '222333444555667778889999'
    mapped = string.maketrans( map_in , map_out )
    
    
    def main():
        while True:
            phone_number= raw_input('Please enter a phone number in the format XXX-XXX-XXXX: ')
            phone_number = phone_number.lower()
            if RE_phone.match(phone_number):
                break
            print "Error. Please try again"
        print translateNumber(phone_number)
    
    def translateNumber(phone_number):
        return phone_number.translate( mapped )
    
    main()
    

答案 3 :(得分:1)

你可以去找: -

def contact_validate(s):
    try: 
        int(s)
        return True
    except ValueError:
        return False

>>> print contact_validate("+12345")
True
>>> print contact_validate("75.0")
False
>>> print contact_validate("hello")
False

答案 4 :(得分:0)

在我看来,这是一种相当pythonic的方式

def validNumber(phone_number):
    return all([x.isdigit() for x in phone_number.split("-")])

它将输入拆分为“ - ”,检查每个剩余项是否为数字并返回单个True或False值。

all() - returns True if bool(x) is True for all x in iterable

答案 5 :(得分:0)

我认为这会有所帮助

ProjectEmployee