This is a Python port of libphonenumber, originally from: http://code.google.com/p/libphonenumber/.
Original Java code is Copyright (C) 2009-2011 The Libphonenumber Authors
The main object that the library deals with is a PhoneNumber
object. You can create this from a string
representing a phone number using the parse
function, but you normally also need to specify the country
that the phone number is from (unless the number is in E.164 format).
>>> import phonenumbers
>>> x = phonenumbers.parse("+442083661177", None)
>>> print x
Country Code: 44 National Number: 2083661177 Leading Zero: False
>>> type(x)
<class 'phonenumbers.phonenumber.PhoneNumber'>
>>> y = phonenumbers.parse("020 8366 1177", "GB")
>>> print y
Country Code: 44 National Number: 2083661177 Leading Zero: False
>>> x == y
True
Once you've got a phone number, a common task is to format it in a standardized format. There are a few
formats available (under PhoneNumberFormat
), and the format_number
function does the formatting.
>>> phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.NATIONAL)
u'020 8366 1177'
>>> phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
u'+44 20 8366 1177'
>>> phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.E164)
u'+442083661177'
If your application has a UI that allows the user to type in a phone number, it's nice to get the formatting
applied as the user types. The AsYouTypeFormatter
object allows this.
>>> formatter = phonenumbers.AsYouTypeFormatter("US")
>>> print formatter.input_digit("6")
6
>>> print formatter.input_digit("5")
65
>>> print formatter.input_digit("0")
(650
>>> print formatter.input_digit("2")
(650) 2
>>> print formatter.input_digit("5")
(650) 25
>>> print formatter.input_digit("3")
(650) 253
>>> print formatter.input_digit("2")
650-2532
>>> print formatter.input_digit("2")
(650) 253-22
>>> print formatter.input_digit("2")
(650) 253-222
>>> print formatter.input_digit("2")
(650) 253-2222
Sometimes, you've got a larger block of text that may or may not have some phone numbers inside it. For this,
the PhoneNumberMatcher
object provides the relevant functionality; you can iterate over it to retrieve a
sequence of PhoneNumberMatch
objects. Each of these match objects holds a PhoneNumber
object together
with information about where the match occurred in the original string.
>>> text = "Call me at 510-748-8230 if it's before 9:30, or on 703-4800500 after 10am."
>>> for match in phonenumbers.PhoneNumberMatcher(text, "US"):
... print match
...
PhoneNumberMatch [11,23) 510-748-8230
PhoneNumberMatch [51,62) 703-4800500
>>> for match in phonenumbers.PhoneNumberMatcher(text, "US"):
... print phonenumbers.format_number(match.number, phonenumbers.PhoneNumberFormat.E164)
...
+15107488230
+17034800500
Finally, you might want to get some information about the location that corresponds to a phone number. The
geocoder.area_description_for_number
does this, when possible.
>>> from phonenumbers.geocoder import area_description_for_number
>>> ch_number = phonenumbers.parse("0431234567", "CH")
>>> print repr(area_description_for_number(ch_number, "de"))
u'Z\\xfcrich'
>>> print repr(area_description_for_number(ch_number, "en"))
u'Zurich'
>>> print repr(area_description_for_number(ch_number, "fr"))
u'Zurich'
>>> print repr(area_description_for_number(ch_number, "it"))
u'Zurigo'
For more information about the other functionality available from the library, look in the unit tests or in the original libphonenumber project.
- The
python/
directory holds the Python code. - The
resources/
directory is a copy of theresources/
directory from libphonenumber. This is not needed to run the Python code, but is needed when upstream changes to the master XML metadata need to be incorporated.