2013-03-06 4 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, чтобы проверить, если что-то число или буква. Вы можете получить доступ к 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) 
+0

Спасибо! Не могли бы вы подробнее рассказать о доступе к n-му персонажу? Я никогда не делал этого до – tinydancer9454

+0

Извините, у меня была опечатка в моем коде: 'enumerate' возвращает все значения' phone_number', но также возвращает их позиционный номер 'i' – askewchan

+0

Хорошо, что работает сейчас, спасибо огромное! – tinydancer9454

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

+0

Потому что некоторые люди положили '-' в свои номера, как' 00-000-0000' – FabianCook

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

Это довольно вещий способ сделать это, на мой взгляд

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 
Смежные вопросы