Python: 检查有效电话号

5 投票
6 回答
40343 浏览
提问于 2025-04-17 18:11

我正在尝试写一个程序,能够接受格式为 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 个回答

3
  1. 你应该使用正则表达式来匹配文本。
  2. 字符串模块里有一个 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()
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

好的,下面是你提供的内容的通俗易懂的中文解释:

这段代码主要是用来处理一些特定的任务。它可能涉及到数据的获取、处理和展示。具体来说,代码块中的每一部分都有它自己的功能,比如说读取文件、计算数据、或者是输出结果。

如果你是编程小白,可以把这段代码想象成一个食谱。每一步都是为了完成一道菜,而最终的结果就是你想要的美味。代码的每一行就像是食谱中的每一步,缺一不可。

总之,这段代码的目的是为了让计算机完成一些自动化的工作,减少我们手动操作的麻烦。

希望这个解释能帮助你更好地理解代码的作用!

4

如果你不想使用正则表达式的话,可以用 isalnum 来检查某个东西是不是数字或者字母。你可以通过 mystr[n] 来访问字符串中的第 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)

撰写回答