2013-03-06 72 views
4

我正在嘗試編寫一個程序,接受XXX-XXX-XXXX格式的電話號碼,並將條目中的任何字母轉換爲相應的數字。Python:試圖檢查一個有效的電話號碼

現在我有了這個,它將允許您重新輸入正確的數字,如果它不正確啓動,但它會翻譯輸入的原始數字。我該如何解決?

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) 

回答

2

如果你不想使用正則表達式:您可以使用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) 
+0

謝謝!你能詳細解釋一下訪問第n個字符嗎?我從來沒有這樣做過 – tinydancer9454 2013-03-06 22:21:13

+0

對不起,我的代碼中有一個錯字:'enumerate'返回'phone_number'的所有值,但也返回它們的位置編號'i'好吧,現在有效,非常感謝! – askewchan 2013-03-06 22:22:51

+0

我剛剛添加了一個長度爲 – askewchan 2013-03-06 22:30:29

9
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

你爲什麼接受'-'的電話號碼的一部分? – hughdbrown 2013-03-06 22:13:13

+0

因爲有些人把'-'放在他們的號碼中,比如'00-000-0000' – FabianCook 2013-09-01 20:23:28

2
  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() 
0

這是爲了做到這一點,我認爲相當pythonic的方法

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

它會把輸入的「 - 」,將檢查每個剩餘項目是一個數字,並返回一個真或假值。

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

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