5

我正在尝试编写一个程序,该程序接受格式中的电话号码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)
4

6 回答 6

12
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
于 2013-03-06T21:51:18.330 回答
4

如果您不想使用正则表达式:您可以使用isalnum来检查某事物是数字还是字母。您可以n使用 so 访问字符串中的第 th 个字符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)
于 2013-03-06T21:55:28.570 回答
3
  1. 您应该使用正则表达式来匹配文本。
  2. string 模块有一个translate函数可以替换你的大部分逻辑

下面的代码示例。请注意我如何将所有内容转换为小写以简化正则表达式和翻译。

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()
于 2013-03-06T22:04:19.383 回答
0

你可以去:-

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
于 2017-12-07T08:03:46.233 回答
0

我认为这可能会有所帮助

def checkvalidNumber(phone_number):
        T={"-":0,"+":0,"_":0}
        for i in str(phone_number):
            if i in list(T.keys()):
                if (i=="_" or i=="-") and (T["-"]>=1 or T['_']>=1):
                    return False
                elif i=="+" and T[i]>=1:
                    return False
                else:
                    T[i]+=1
           elif not i.isdigit():
                return False
        return True
于 2020-01-14T17:40:01.487 回答
-1

在我看来,这是一种相当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

于 2013-03-06T22:37:38.970 回答