227 lines
9.6 KiB
Python
227 lines
9.6 KiB
Python
"""Python phone number parsing and formatting library
|
|
|
|
Examples of use:
|
|
|
|
>>> import phonenumbers
|
|
>>> from phonenumbers.util import prnt # equivalent to Py3k print()
|
|
>>> x = phonenumbers.parse("+442083661177", None)
|
|
>>> prnt(x)
|
|
Country Code: 44 National Number: 2083661177
|
|
>>> type(x)
|
|
<class 'phonenumbers.phonenumber.PhoneNumber'>
|
|
>>> str(phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.NATIONAL))
|
|
'020 8366 1177'
|
|
>>> str(phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.INTERNATIONAL))
|
|
'+44 20 8366 1177'
|
|
>>> str(phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.E164))
|
|
'+442083661177'
|
|
>>> y = phonenumbers.parse("020 8366 1177", "GB")
|
|
>>> prnt(y)
|
|
Country Code: 44 National Number: 2083661177
|
|
>>> x == y
|
|
True
|
|
>>>
|
|
>>> formatter = phonenumbers.AsYouTypeFormatter("US")
|
|
>>> prnt(formatter.input_digit("6"))
|
|
6
|
|
>>> prnt(formatter.input_digit("5"))
|
|
65
|
|
>>> prnt(formatter.input_digit("0"))
|
|
650
|
|
>>> prnt(formatter.input_digit("2"))
|
|
650-2
|
|
>>> prnt(formatter.input_digit("5"))
|
|
650-25
|
|
>>> prnt(formatter.input_digit("3"))
|
|
650-253
|
|
>>> prnt(formatter.input_digit("2"))
|
|
650-2532
|
|
>>> prnt(formatter.input_digit("2"))
|
|
(650) 253-22
|
|
>>> prnt(formatter.input_digit("2"))
|
|
(650) 253-222
|
|
>>> prnt(formatter.input_digit("2"))
|
|
(650) 253-2222
|
|
>>>
|
|
>>> 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"):
|
|
... prnt(match)
|
|
...
|
|
PhoneNumberMatch [11,23) 510-748-8230
|
|
PhoneNumberMatch [51,62) 703-4800500
|
|
>>> for match in phonenumbers.PhoneNumberMatcher(text, "US"):
|
|
... prnt(phonenumbers.format_number(match.number, phonenumbers.PhoneNumberFormat.E164))
|
|
...
|
|
+15107488230
|
|
+17034800500
|
|
>>>
|
|
"""
|
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
# 'Some people, when confronted with a problem, think "I know,
|
|
# I'll use regular expressions." Now they have two problems.'
|
|
# -- jwz 1997-08-12
|
|
|
|
# Data class definitions
|
|
from .phonenumber import PhoneNumber, CountryCodeSource, FrozenPhoneNumber
|
|
from .phonemetadata import REGION_CODE_FOR_NON_GEO_ENTITY, NumberFormat, PhoneNumberDesc, PhoneMetadata
|
|
# Functionality
|
|
from .asyoutypeformatter import AsYouTypeFormatter
|
|
from .phonenumberutil import (COUNTRY_CODE_TO_REGION_CODE, SUPPORTED_REGIONS,
|
|
UNKNOWN_REGION, COUNTRY_CODES_FOR_NON_GEO_REGIONS,
|
|
NON_DIGITS_PATTERN,
|
|
MatchType, NumberParseException, PhoneNumberFormat,
|
|
PhoneNumberType, ValidationResult,
|
|
can_be_internationally_dialled,
|
|
convert_alpha_characters_in_number,
|
|
country_code_for_region,
|
|
country_code_for_valid_region,
|
|
country_mobile_token,
|
|
example_number,
|
|
example_number_for_type,
|
|
example_number_for_non_geo_entity,
|
|
format_by_pattern,
|
|
format_in_original_format,
|
|
format_national_number_with_carrier_code,
|
|
format_national_number_with_preferred_carrier_code,
|
|
format_number_for_mobile_dialing,
|
|
format_number,
|
|
format_out_of_country_calling_number,
|
|
format_out_of_country_keeping_alpha_chars,
|
|
invalid_example_number,
|
|
is_alpha_number,
|
|
is_nanpa_country,
|
|
is_number_match,
|
|
is_number_geographical,
|
|
is_number_type_geographical,
|
|
is_possible_number,
|
|
is_possible_number_for_type,
|
|
is_possible_number_for_type_with_reason,
|
|
is_possible_number_string,
|
|
is_possible_number_with_reason,
|
|
is_valid_number,
|
|
is_valid_number_for_region,
|
|
length_of_geographical_area_code,
|
|
length_of_national_destination_code,
|
|
national_significant_number,
|
|
ndd_prefix_for_region,
|
|
normalize_digits_only,
|
|
normalize_diallable_chars_only,
|
|
number_type,
|
|
parse,
|
|
region_code_for_country_code,
|
|
region_codes_for_country_code,
|
|
region_code_for_number,
|
|
supported_calling_codes,
|
|
supported_types_for_region,
|
|
supported_types_for_non_geo_entity,
|
|
truncate_too_long_number,
|
|
is_mobile_number_portable_region,)
|
|
from .shortnumberinfo import (SUPPORTED_SHORT_REGIONS,
|
|
ShortNumberCost,
|
|
is_possible_short_number_for_region,
|
|
is_possible_short_number,
|
|
is_valid_short_number_for_region,
|
|
is_valid_short_number,
|
|
expected_cost_for_region,
|
|
expected_cost,
|
|
connects_to_emergency_number,
|
|
is_emergency_number,
|
|
is_carrier_specific,
|
|
is_carrier_specific_for_region,
|
|
is_sms_service_for_region)
|
|
from .phonenumbermatcher import PhoneNumberMatch, PhoneNumberMatcher, Leniency
|
|
|
|
|
|
# Version number is taken from the upstream libphonenumber version
|
|
# together with an indication of the version of the Python-specific code.
|
|
__version__ = "8.12.13"
|
|
|
|
__all__ = ['PhoneNumber', 'CountryCodeSource', 'FrozenPhoneNumber',
|
|
'REGION_CODE_FOR_NON_GEO_ENTITY', 'NumberFormat', 'PhoneNumberDesc', 'PhoneMetadata',
|
|
'AsYouTypeFormatter',
|
|
# items from phonenumberutil.py
|
|
'COUNTRY_CODE_TO_REGION_CODE', 'SUPPORTED_REGIONS',
|
|
'UNKNOWN_REGION', 'COUNTRY_CODES_FOR_NON_GEO_REGIONS',
|
|
'NON_DIGITS_PATTERN',
|
|
'MatchType', 'NumberParseException', 'PhoneNumberFormat',
|
|
'PhoneNumberType', 'ValidationResult',
|
|
'can_be_internationally_dialled',
|
|
'convert_alpha_characters_in_number',
|
|
'country_code_for_region',
|
|
'country_code_for_valid_region',
|
|
'country_mobile_token',
|
|
'example_number',
|
|
'example_number_for_type',
|
|
'example_number_for_non_geo_entity',
|
|
'format_by_pattern',
|
|
'format_in_original_format',
|
|
'format_national_number_with_carrier_code',
|
|
'format_national_number_with_preferred_carrier_code',
|
|
'format_number_for_mobile_dialing',
|
|
'format_number',
|
|
'format_out_of_country_calling_number',
|
|
'format_out_of_country_keeping_alpha_chars',
|
|
'invalid_example_number',
|
|
'is_alpha_number',
|
|
'is_nanpa_country',
|
|
'is_number_geographical',
|
|
'is_number_type_geographical',
|
|
'is_number_match',
|
|
'is_possible_number',
|
|
'is_possible_number_for_type',
|
|
'is_possible_number_for_type_with_reason',
|
|
'is_possible_number_string',
|
|
'is_possible_number_with_reason',
|
|
'is_valid_number',
|
|
'is_valid_number_for_region',
|
|
'length_of_geographical_area_code',
|
|
'length_of_national_destination_code',
|
|
'national_significant_number',
|
|
'ndd_prefix_for_region',
|
|
'normalize_digits_only',
|
|
'normalize_diallable_chars_only',
|
|
'number_type',
|
|
'parse',
|
|
'region_code_for_country_code',
|
|
'region_codes_for_country_code',
|
|
'region_code_for_number',
|
|
'supported_calling_codes',
|
|
'supported_types_for_region',
|
|
'supported_types_for_non_geo_entity',
|
|
'truncate_too_long_number',
|
|
'is_mobile_number_portable_region',
|
|
# end of items from phonenumberutil.py
|
|
# items from shortnumberinfo.py
|
|
'SUPPORTED_SHORT_REGIONS',
|
|
'ShortNumberCost',
|
|
'is_possible_short_number_for_region',
|
|
'is_possible_short_number',
|
|
'is_valid_short_number_for_region',
|
|
'is_valid_short_number',
|
|
'expected_cost_for_region',
|
|
'expected_cost',
|
|
'connects_to_emergency_number',
|
|
'is_emergency_number',
|
|
'is_carrier_specific',
|
|
'is_carrier_specific_for_region',
|
|
'is_sms_service_for_region',
|
|
# end of items from shortnumberinfo.py
|
|
'PhoneNumberMatch', 'PhoneNumberMatcher', 'Leniency',
|
|
]
|
|
|
|
if __name__ == '__main__': # pragma no cover
|
|
import doctest
|
|
doctest.testmod()
|