Guest User

Convert an Indian mobile number to a canonical format

a guest
Nov 25th, 2010
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.42 KB | None | 0 0
  1. import re
  2.  
  3. number_punct_re = re.compile(r'[\s,.\-\(\)\[\]\{\}_]')
  4. digits_re = re.compile(r'^\d+$')
  5.  
  6. class Error(Exception): pass
  7.  
  8. class MobileFormatError(Error): pass
  9. class WrongCountryCodeError(MobileFormatError): pass
  10. class WrongCountryCodeOrNumberTooLongError(WrongCountryCodeError): pass
  11. class NumberTooShortError(MobileFormatError): pass
  12. class IllegalCharactersError(MobileFormatError): pass
  13.  
  14. def canonical_number(number):
  15.     '''Take a user entered mobile number and return a canonical number
  16.    
  17.    remove punctuation, and spaces.
  18.    remove leading 91 or +91
  19.    might raise Error
  20.  
  21.    Usage:
  22.    >>> import sms
  23.    >>> sms.Sender.canonical_number('9822020096')
  24.    '919822020096'
  25.    >>> sms.Sender.canonical_number('09822020096')
  26.    '919822020096'
  27.    >>> sms.Sender.canonical_number(' 098220 20096')
  28.    '919822020096'
  29.    >>> sms.Sender.canonical_number('919822020096')
  30.    '919822020096'
  31.    >>> sms.Sender.canonical_number('+919822020096')
  32.    '919822020096'
  33.    >>> sms.Sender.canonical_number('+91 9822020096')
  34.    '919822020096'
  35.    >>> sms.Sender.canonical_number('+91 98220 20096')
  36.    '919822020096'
  37.    >>> sms.Sender.canonical_number('+91-98220-20096')
  38.    '919822020096'
  39.    >>> sms.Sender.canonical_number(' 982 202 0096 ')
  40.    '919822020096'
  41.    >>> sms.Sender.canonical_number(' (982)202-0096 ')
  42.    '919822020096'
  43.    >>> sms.Sender.canonical_number('+91 (982)202-0096 ')
  44.    '919822020096'
  45.    >>> sms.Sender.canonical_number(None)
  46.    >>> sms.Sender.canonical_number('')
  47.    >>> sms.Sender.canonical_number(' ')
  48.    >>> sms.Sender.canonical_number('+91 (982)202-0096 x')
  49.    Traceback (most recent call last):
  50.    ...
  51.    IllegalCharactersError: 9822020096x
  52.    >>> sms.Sender.canonical_number('xakljkl;a;lx[x!')
  53.    Traceback (most recent call last):
  54.    ...
  55.    IllegalCharactersError: xakljkl;a;lxx!
  56.    >>> sms.Sender.canonical_number(' (982)202-009 ')
  57.    Traceback (most recent call last):
  58.    ...
  59.    NumberTooShortError: 982202009
  60.    >>> sms.Sender.canonical_number('982202009 ')
  61.    Traceback (most recent call last):
  62.    ...
  63.    NumberTooShortError: 982202009
  64.    >>> sms.Sender.canonical_number('982202009x')
  65.    Traceback (most recent call last):
  66.    ...
  67.    IllegalCharactersError: 982202009x
  68.    >>> sms.Sender.canonical_number('98220200961')
  69.    Traceback (most recent call last):
  70.    ...
  71.    WrongCountryCodeOrNumberTooLongError: 98220200961
  72.    >>> sms.Sender.canonical_number('9198220200961')
  73.    Traceback (most recent call last):
  74.    ...
  75.    WrongCountryCodeOrNumberTooLongError: 9198220200961
  76.    '''
  77.     if not number: return None
  78.     number = number_punct_re.sub('', number) # remove punctuation
  79.     if not number: return None
  80.  
  81.     if number[0:1] == '+':
  82.         if number[0:3] == '+91':
  83.             number = number[3:] # remove country code
  84.         else:
  85.             raise WrongCountryCodeError(number)
  86.  
  87.     if number [0] == '0':
  88.         number = number[1:]
  89.  
  90.     if not digits_re.match(number):
  91.         raise IllegalCharactersError(number)
  92.     digits = len(number)
  93.     if digits > 10:
  94.         if digits == 12 and number[0:2] == '91':
  95.             number = number[2:]
  96.         else:
  97.             raise WrongCountryCodeOrNumberTooLongError(number)
  98.     elif digits < 10:
  99.         raise NumberTooShortError(number)
  100.     return '91'+number
  101.  
  102. def mobile_no(text):
  103.     try:
  104.         return canonical_number(text)
  105.     except Error:
  106.         return None
Advertisement
Add Comment
Please, Sign In to add comment