Python: trying to verify a valid phone number

I am trying to write a program that accepts a phone number in the format XXX-XXX-XXXX and translates any letters in the entry into the corresponding numbers.

Now I have this, and it will allow you to re-enter the correct number if it is not correct to start, but then it translates the entered original number. How to fix it?

 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
source share
5 answers

If you don't want to use regular expressions: you can use isalnum to check if something is a number or a letter. You can access the n character in a string using mystr[n] , so you can try:

 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 

To find out what phone_number[i] does, try the following:

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

Using 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 

Once you earn it, you should use it later (inside main ), for example:

 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
source
 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 
+9
source
  • You must use a regular expression to match the text.
  • the string module has a translate function that will replace most of your logic

Sample code below. notice how I do everything in lower case to simplify regex and translation.

 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() 
+2
source

You can go: -

 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 
+1
source

This is a pretty Putin way to do this, in my opinion,

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

It breaks the input into "-", checks that each remaining element is a number, and returns a single True or False value.

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

0
source

All Articles