diff --git a/python/phonenumbers/__init__.py b/python/phonenumbers/__init__.py
index 6fe916b9..dddc1189 100644
--- a/python/phonenumbers/__init__.py
+++ b/python/phonenumbers/__init__.py
@@ -146,7 +146,7 @@
# Version number is taken from the upstream libphonenumber version
# together with an indication of the version of the Python-specific code.
-__version__ = "9.0.27"
+__version__ = "9.0.28"
__all__ = ['PhoneNumber', 'CountryCodeSource', 'FrozenPhoneNumber',
'REGION_CODE_FOR_NON_GEO_ENTITY', 'NumberFormat', 'PhoneNumberDesc', 'PhoneMetadata',
diff --git a/python/phonenumbers/carrierdata/data0.py b/python/phonenumbers/carrierdata/data0.py
index 0f8a8f01..195d9ac7 100644
--- a/python/phonenumbers/carrierdata/data0.py
+++ b/python/phonenumbers/carrierdata/data0.py
@@ -1580,6 +1580,8 @@
'267778':{'en': 'Mascom'},
'267779':{'en': 'Orange'},
'26778':{'en': 'Orange'},
+ '267790':{'en': 'Orange'},
+ '267793':{'en': 'Orange'},
'26875':{'en': 'Eswatini Mobile'},
'26876':{'en': 'Swazi MTN'},
'26877':{'en': 'SPTC'},
@@ -2439,9 +2441,10 @@
'346112':{'en': 'Yoigo'},
'346113':{'en': 'Yoigo'},
'34612':{'en': 'Syma'},
- '346122':{'en': 'Lycamobile'},
- '346124':{'en': 'Lycamobile'},
- '346125':{'en': 'Lycamobile'},
+ '346122':{'en': 'Yoigo'},
+ '346124':{'en': 'Yoigo'},
+ '346125':{'en': 'Yoigo'},
+ '346126':{'en': 'Sarenet'},
'34613':{'en': 'Yoigo'},
'34614':{'en': 'DigiMobil'},
'34615':{'en': 'Orange'},
@@ -2891,15 +2894,15 @@
'35850':{'en': 'Elisa'},
'35987':{'en': 'Vivacom'},
'35988':{'en': 'A1'},
- '35989':{'en': 'Telenor'},
+ '35989':{'en': 'Yettel'},
'359988':{'en': 'Bob'},
'359989':{'en': 'A1'},
'3599960':{'en': 'A1'},
'3599961':{'en': 'A1'},
'3599962':{'en': 'A1'},
- '3599964':{'en': 'Telenor'},
- '3599965':{'en': 'Telenor'},
- '3599966':{'en': 'Telenor'},
+ '3599964':{'en': 'Yettel'},
+ '3599965':{'en': 'Yettel'},
+ '3599966':{'en': 'Yettel'},
'3599967':{'en': 'Vivacom'},
'3599968':{'en': 'Vivacom'},
'3599969':{'en': 'Vivacom'},
@@ -2907,8 +2910,8 @@
'3599991':{'en': 'A1'},
'3599992':{'en': 'A1'},
'3599993':{'en': 'A1'},
- '3599994':{'en': 'Telenor'},
- '3599995':{'en': 'Telenor'},
+ '3599994':{'en': 'Yettel'},
+ '3599995':{'en': 'Yettel'},
'3599996':{'en': 'Vivacom'},
'3599997':{'en': 'Vivacom'},
'3599998':{'en': 'Vivacom'},
@@ -10016,7 +10019,4 @@
'553199745':{'en': 'Telemig Celular'},
'553199746':{'en': 'Telemig Celular'},
'553199747':{'en': 'Telemig Celular'},
- '553199748':{'en': 'Telemig Celular'},
- '553199749':{'en': 'Telemig Celular'},
- '553199751':{'en': 'Telemig Celular'},
}
diff --git a/python/phonenumbers/carrierdata/data1.py b/python/phonenumbers/carrierdata/data1.py
index 34861564..60b5d4c1 100644
--- a/python/phonenumbers/carrierdata/data1.py
+++ b/python/phonenumbers/carrierdata/data1.py
@@ -19,6 +19,9 @@
# limitations under the License.
data = {
+ '553199748':{'en': 'Telemig Celular'},
+ '553199749':{'en': 'Telemig Celular'},
+ '553199751':{'en': 'Telemig Celular'},
'553199752':{'en': 'Telemig Celular'},
'553199753':{'en': 'Telemig Celular'},
'553199755':{'en': 'Telemig Celular'},
@@ -10016,7 +10019,4 @@
'57305266':{'en': 'Tigo'},
'573052670':{'en': 'Tigo'},
'573052671':{'en': 'Tigo'},
- '5730527':{'en': 'Tigo'},
- '5730528':{'en': 'Tigo'},
- '5730529':{'en': 'Tigo'},
}
diff --git a/python/phonenumbers/carrierdata/data2.py b/python/phonenumbers/carrierdata/data2.py
index 6f47e301..d98ee683 100644
--- a/python/phonenumbers/carrierdata/data2.py
+++ b/python/phonenumbers/carrierdata/data2.py
@@ -19,6 +19,9 @@
# limitations under the License.
data = {
+ '5730527':{'en': 'Tigo'},
+ '5730528':{'en': 'Tigo'},
+ '5730529':{'en': 'Tigo'},
'573053':{'en': 'Tigo'},
'5730540':{'en': 'Movil Exito'},
'5730541':{'en': 'Movil Exito'},
@@ -8422,7 +8425,10 @@
'9725531':{'en': '019mobile'},
'9725532':{'en': 'Free Telecom'},
'9725533':{'en': 'Free Telecom'},
- '9725540':{'en': 'Rami Levy'},
+ '97255400':{'en': 'Rami Levy'},
+ '97255401':{'en': 'Rami Levy'},
+ '97255402':{'en': 'Rami Levy'},
+ '97255403':{'en': 'Yossi'},
'9725541':{'en': 'Merkaziya'},
'9725543':{'en': 'Maskyoo'},
'9725544':{'en': 'Cellran Cellular Communications'},
@@ -8519,7 +8525,16 @@
'976507':{'en': 'Mobicom'},
'976508':{'en': 'Mobicom'},
'976509':{'en': 'Mobicom'},
- '97655':{'en': 'Unitel'},
+ '976550':{'en': 'Unitel'},
+ '976551':{'en': 'Unitel'},
+ '976552':{'en': 'Unitel'},
+ '976553':{'en': 'Unitel'},
+ '976554':{'en': 'Unitel'},
+ '976555':{'en': 'Mobicom'},
+ '976556':{'en': 'Mobicom'},
+ '976557':{'en': 'Mobicom'},
+ '976558':{'en': 'Mobicom'},
+ '976559':{'en': 'Mobicom'},
'97660':{'en': 'ONDO'},
'97666':{'en': 'ONDO'},
'97669':{'en': 'Skytel'},
@@ -8530,6 +8545,7 @@
'97683':{'en': 'G-Mobile'},
'97685':{'en': 'Mobicom'},
'97686':{'en': 'Unitel'},
+ '97687':{'en': 'G-Mobile'},
'97688':{'en': 'Unitel'},
'97689':{'en': 'Unitel'},
'97690':{'en': 'Skytel'},
diff --git a/python/phonenumbers/data/region_BW.py b/python/phonenumbers/data/region_BW.py
index 811a5de1..1be4957e 100644
--- a/python/phonenumbers/data/region_BW.py
+++ b/python/phonenumbers/data/region_BW.py
@@ -4,7 +4,7 @@
PHONE_METADATA_BW = PhoneMetadata(id='BW', country_code=267, international_prefix='00',
general_desc=PhoneNumberDesc(national_number_pattern='(?:0800|(?:[37]|800)\\d)\\d{6}|(?:[2-6]\\d|90)\\d{5}', possible_length=(7, 8, 10)),
fixed_line=PhoneNumberDesc(national_number_pattern='(?:2(?:4[0-48]|6[0-24]|9[0578])|3(?:1[0-35-9]|55|[69]\\d|7[013]|81)|4(?:6[03]|7[1267]|9[0-5])|5(?:3[03489]|4[0489]|7[1-47]|88|9[0-49])|6(?:2[1-35]|5[149]|8[013467]))\\d{4}', example_number='2401234', possible_length=(7,)),
- mobile=PhoneNumberDesc(national_number_pattern='(?:321|7[1-8]\\d)\\d{5}', example_number='71123456', possible_length=(8,)),
+ mobile=PhoneNumberDesc(national_number_pattern='(?:321|7(?:[1-8]\\d|9[03]))\\d{5}', example_number='71123456', possible_length=(8,)),
toll_free=PhoneNumberDesc(national_number_pattern='(?:0800|800\\d)\\d{6}', example_number='0800012345', possible_length=(10,)),
premium_rate=PhoneNumberDesc(national_number_pattern='90\\d{5}', example_number='9012345', possible_length=(7,)),
voip=PhoneNumberDesc(national_number_pattern='79(?:1(?:[0-2]\\d|3[0-8])|2[0-7]\\d)\\d{3}', example_number='79101234', possible_length=(8,)),
diff --git a/python/phonenumbers/data/region_IL.py b/python/phonenumbers/data/region_IL.py
index fe4ca47c..15917d59 100644
--- a/python/phonenumbers/data/region_IL.py
+++ b/python/phonenumbers/data/region_IL.py
@@ -4,9 +4,9 @@
PHONE_METADATA_IL = PhoneMetadata(id='IL', country_code=972, international_prefix='0(?:0|1[2-9])',
general_desc=PhoneNumberDesc(national_number_pattern='1\\d{6}(?:\\d{3,5})?|[57]\\d{8}|[1-489]\\d{7}', possible_length=(7, 8, 9, 10, 11, 12)),
fixed_line=PhoneNumberDesc(national_number_pattern='153\\d{8,9}|29[1-9]\\d{5}|(?:2[0-8]|[3489]\\d)\\d{6}', example_number='21234567', possible_length=(8, 11, 12), possible_length_local_only=(7,)),
- mobile=PhoneNumberDesc(national_number_pattern='55(?:4(?:0[0-2]|[16]0)|57[0-289])\\d{4}|5(?:(?:[0-2][02-9]|[36]\\d|[49][2-9]|8[3-7])\\d|5(?:01|2\\d|3[0-3]|4[3-5]|5[0-25689]|6[6-8]|7[0-267]|8[7-9]|9[1-9]))\\d{5}', example_number='502345678', possible_length=(9,)),
+ mobile=PhoneNumberDesc(national_number_pattern='55(?:4(?:0[0-3]|[16]0)|57[0-289])\\d{4}|5(?:(?:[0-2][02-9]|[36]\\d|[49][2-9]|8[3-7])\\d|5(?:01|2\\d|3[0-3]|4[3-5]|5[0-25689]|6[6-8]|7[0-267]|8[7-9]|9[1-9]))\\d{5}', example_number='502345678', possible_length=(9,)),
toll_free=PhoneNumberDesc(national_number_pattern='1(?:255|80[019]\\d{3})\\d{3}', example_number='1800123456', possible_length=(7, 10)),
- premium_rate=PhoneNumberDesc(national_number_pattern='1212\\d{4}|1(?:200|9(?:0[0-2]|19))\\d{6}', example_number='1919123456', possible_length=(8, 10)),
+ premium_rate=PhoneNumberDesc(national_number_pattern='1212\\d{4}|1(?:200|9(?:0[0-2]|19|9\\d))\\d{6}', example_number='1919123456', possible_length=(8, 10)),
shared_cost=PhoneNumberDesc(national_number_pattern='1700\\d{6}', example_number='1700123456', possible_length=(10,)),
voip=PhoneNumberDesc(national_number_pattern='7(?:38(?:[05]\\d|8[0138])|8(?:33|55|77|81)\\d)\\d{4}|7(?:18|2[23]|3[237]|47|6[258]|7\\d|82|9[2-9])\\d{6}', example_number='771234567', possible_length=(9,)),
uan=PhoneNumberDesc(national_number_pattern='1599\\d{6}', example_number='1599123456', possible_length=(10,)),
diff --git a/python/phonenumbers/data/region_MN.py b/python/phonenumbers/data/region_MN.py
index fa7cdc95..55fd6184 100644
--- a/python/phonenumbers/data/region_MN.py
+++ b/python/phonenumbers/data/region_MN.py
@@ -3,12 +3,12 @@
PHONE_METADATA_MN = PhoneMetadata(id='MN', country_code=976, international_prefix='001',
general_desc=PhoneNumberDesc(national_number_pattern='[12]\\d{7,9}|[5-9]\\d{7}', possible_length=(8, 9, 10), possible_length_local_only=(4, 5, 6)),
- fixed_line=PhoneNumberDesc(national_number_pattern='[12]2[1-3]\\d{5,6}|(?:(?:[12](?:1|27)|5[368])\\d\\d|7(?:0(?:[0-5]\\d|7[078]|80)|128))\\d{4}|[12](?:3[2-8]|4[2-68]|5[1-4689])\\d{6,7}', example_number='53123456', possible_length=(8, 9, 10), possible_length_local_only=(4, 5, 6)),
- mobile=PhoneNumberDesc(national_number_pattern='92[0139]\\d{5}|(?:5[05]|6[069]|7[28]|8[0135689]|9[013-9])\\d{6}', example_number='88123456', possible_length=(8,)),
+ fixed_line=PhoneNumberDesc(national_number_pattern='[12](?:2[1-3]|(?:3[2-8]|4[2-68]|5[1-4689])\\d)\\d{5,6}|7(?:0(?:[0-5]\\d|7[078]|80)|128)\\d{4}|[12]27\\d{6}|(?:11|2[16]|5[368])\\d{6}', example_number='53123456', possible_length=(8, 9, 10), possible_length_local_only=(4, 5, 6)),
+ mobile=PhoneNumberDesc(national_number_pattern='(?:87[01]|92[0139])\\d{5}|(?:5[05]|6[069]|7[28]|8[0135689]|9[013-9])\\d{6}', example_number='88123456', possible_length=(8,)),
voip=PhoneNumberDesc(national_number_pattern='712[0-79]\\d{4}|7(?:1[013-9]|[5-79]\\d)\\d{5}', example_number='75123456', possible_length=(8,)),
national_prefix='0',
national_prefix_for_parsing='0',
- number_format=[NumberFormat(pattern='(\\d{2})(\\d{2})(\\d{4})', format='\\1 \\2 \\3', leading_digits_pattern=['[12]1'], national_prefix_formatting_rule='0\\1'),
+ number_format=[NumberFormat(pattern='(\\d{2})(\\d{2})(\\d{4})', format='\\1 \\2 \\3', leading_digits_pattern=['11|2[16]'], national_prefix_formatting_rule='0\\1'),
NumberFormat(pattern='(\\d{4})(\\d{4})', format='\\1 \\2', leading_digits_pattern=['[5-9]']),
NumberFormat(pattern='(\\d{3})(\\d{5,6})', format='\\1 \\2', leading_digits_pattern=['[12]2[1-3]'], national_prefix_formatting_rule='0\\1'),
NumberFormat(pattern='(\\d{4})(\\d{5,6})', format='\\1 \\2', leading_digits_pattern=['[12](?:27|3[2-8]|4[2-68]|5[1-4689])', '[12](?:27|3[2-8]|4[2-68]|5[1-4689])[0-3]'], national_prefix_formatting_rule='0\\1'),
diff --git a/python/phonenumbers/data/region_RE.py b/python/phonenumbers/data/region_RE.py
index 03c2a976..d3722088 100644
--- a/python/phonenumbers/data/region_RE.py
+++ b/python/phonenumbers/data/region_RE.py
@@ -3,7 +3,7 @@
PHONE_METADATA_RE = PhoneMetadata(id='RE', country_code=262, international_prefix='00',
general_desc=PhoneNumberDesc(national_number_pattern='709\\d{6}|(?:26|[689]\\d)\\d{7}', possible_length=(9,)),
- fixed_line=PhoneNumberDesc(national_number_pattern='26(?:2\\d\\d|3(?:0\\d|1[0-6]))\\d{4}', example_number='262161234', possible_length=(9,)),
+ fixed_line=PhoneNumberDesc(national_number_pattern='2631[0-6]\\d{4}|26(?:2\\d|30|88)\\d{5}', example_number='262161234', possible_length=(9,)),
mobile=PhoneNumberDesc(national_number_pattern='(?:69(?:2\\d\\d|3(?:[06][0-6]|1[0-3]|2[0-2]|3[0-39]|4\\d|5[0-5]|7[0-37]|8[0-8]|9[0-479]))|7092[0-3])\\d{4}', example_number='692123456', possible_length=(9,)),
toll_free=PhoneNumberDesc(national_number_pattern='80\\d{7}', example_number='801234567', possible_length=(9,)),
premium_rate=PhoneNumberDesc(national_number_pattern='89[1-37-9]\\d{6}', example_number='891123456', possible_length=(9,)),
diff --git a/python/phonenumbers/data/region_SR.py b/python/phonenumbers/data/region_SR.py
index adf838d9..15a5512d 100644
--- a/python/phonenumbers/data/region_SR.py
+++ b/python/phonenumbers/data/region_SR.py
@@ -2,12 +2,12 @@
from ..phonemetadata import NumberFormat, PhoneNumberDesc, PhoneMetadata
PHONE_METADATA_SR = PhoneMetadata(id='SR', country_code=597, international_prefix='00',
- general_desc=PhoneNumberDesc(national_number_pattern='(?:[2-5]|[6-8]\\d|90)\\d{5}', possible_length=(6, 7)),
- fixed_line=PhoneNumberDesc(national_number_pattern='(?:2[1-3]|3[0-7]|4\\d|5[2-58])\\d{4}', example_number='211234', possible_length=(6,)),
+ general_desc=PhoneNumberDesc(national_number_pattern='(?:[2-5]|[6-9]\\d)\\d{5}', possible_length=(6, 7)),
+ fixed_line=PhoneNumberDesc(national_number_pattern='(?:2[1-3]|3[0-7]|4\\d|5[2-578])\\d{4}', example_number='211234', possible_length=(6,)),
mobile=PhoneNumberDesc(national_number_pattern='(?:6[08]|7[124-7]|8[1-9])\\d{5}', example_number='7412345', possible_length=(7,)),
toll_free=PhoneNumberDesc(national_number_pattern='80\\d{5}', example_number='8012345', possible_length=(7,)),
premium_rate=PhoneNumberDesc(national_number_pattern='90\\d{5}', example_number='9012345', possible_length=(7,)),
- voip=PhoneNumberDesc(national_number_pattern='56\\d{4}', example_number='561234', possible_length=(6,)),
+ voip=PhoneNumberDesc(national_number_pattern='(?:56|91\\d)\\d{4}', example_number='561234', possible_length=(6, 7)),
number_format=[NumberFormat(pattern='(\\d{2})(\\d{2})(\\d{2})', format='\\1-\\2-\\3', leading_digits_pattern=['56']),
NumberFormat(pattern='(\\d{3})(\\d{3})', format='\\1-\\2', leading_digits_pattern=['[2-5]']),
NumberFormat(pattern='(\\d{3})(\\d{4})', format='\\1-\\2', leading_digits_pattern=['[6-9]'])])
diff --git a/python/phonenumbers/data/region_YT.py b/python/phonenumbers/data/region_YT.py
index 40d7ab01..c674e90d 100644
--- a/python/phonenumbers/data/region_YT.py
+++ b/python/phonenumbers/data/region_YT.py
@@ -2,8 +2,8 @@
from ..phonemetadata import NumberFormat, PhoneNumberDesc, PhoneMetadata
PHONE_METADATA_YT = PhoneMetadata(id='YT', country_code=262, international_prefix='00',
- general_desc=PhoneNumberDesc(national_number_pattern='7093\\d{5}|(?:80|9\\d)\\d{7}|(?:26|63)9\\d{6}', possible_length=(9,)),
- fixed_line=PhoneNumberDesc(national_number_pattern='269(?:0[0-467]|15|5[0-4]|6\\d|[78]0)\\d{4}', example_number='269601234', possible_length=(9,)),
+ general_desc=PhoneNumberDesc(national_number_pattern='(?:639\\d|7093)\\d{5}|(?:26|80|9\\d)\\d{7}', possible_length=(9,)),
+ fixed_line=PhoneNumberDesc(national_number_pattern='26(?:89\\d|9(?:0[0-467]|15|5[0-4]|6\\d|[78]0))\\d{4}', example_number='269601234', possible_length=(9,)),
mobile=PhoneNumberDesc(national_number_pattern='(?:639(?:0[0-79]|1[019]|[267]\\d|3[09]|40|5[05-9]|9[04-79])|7093[5-7])\\d{4}', example_number='639012345', possible_length=(9,)),
toll_free=PhoneNumberDesc(national_number_pattern='80\\d{7}', example_number='801234567', possible_length=(9,)),
voip=PhoneNumberDesc(national_number_pattern='9(?:(?:39|47)8[01]|769\\d)\\d{4}', example_number='939801234', possible_length=(9,)),
diff --git a/python/phonenumbers/phonenumberutil.py b/python/phonenumbers/phonenumberutil.py
index ff9a17a4..e95b3685 100644
--- a/python/phonenumbers/phonenumberutil.py
+++ b/python/phonenumbers/phonenumberutil.py
@@ -1485,14 +1485,15 @@ def format_in_original_format(numobj, region_calling_from):
Returns the formatted phone number in its original number format.
"""
- if (numobj.raw_input is not None and not _has_formatting_pattern_for_number(numobj)):
+ format_rule = _choose_formatting_pattern_for_numobj(numobj)
+ if (numobj.raw_input is not None and format_rule is None):
# We check if we have the formatting pattern because without that, we
# might format the number as a group without national prefix.
return numobj.raw_input
if numobj.country_code_source is CountryCodeSource.UNSPECIFIED:
return format_number(numobj, PhoneNumberFormat.NATIONAL)
- formatted_number = _format_original_allow_mods(numobj, region_calling_from)
+ formatted_number = _format_original_allow_mods(numobj, region_calling_from, format_rule)
num_raw_input = numobj.raw_input
# If no digit is inserted/removed/modified as a result of our formatting,
# we return the formatted phone number; otherwise we return the raw input
@@ -1505,7 +1506,7 @@ def format_in_original_format(numobj, region_calling_from):
return formatted_number
-def _format_original_allow_mods(numobj, region_calling_from):
+def _format_original_allow_mods(numobj, region_calling_from, format_rule):
if (numobj.country_code_source == CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN):
return format_number(numobj, PhoneNumberFormat.INTERNATIONAL)
elif numobj.country_code_source == CountryCodeSource.FROM_NUMBER_WITH_IDD:
@@ -1527,12 +1528,6 @@ def _format_original_allow_mods(numobj, region_calling_from):
if (_raw_input_contains_national_prefix(numobj.raw_input, national_prefix, region_code)):
# If so, we can safely return the national format.
return national_format
- # Metadata cannot be None here because ndd_prefix_for_region() (above) returns None if
- # there is no metadata for the region.
- metadata = PhoneMetadata.metadata_for_region(region_code)
- assert metadata is not None
- national_number = national_significant_number(numobj)
- format_rule = _choose_formatting_pattern_for_number(metadata.number_format, national_number)
# The format rule could still be null here if the national number was
# 0 and there was no raw input (this should not be possible for
# numbers generated by the phonenumber library as they would also not
@@ -1578,15 +1573,28 @@ def _raw_input_contains_national_prefix(raw_input, national_prefix, region_code)
return False
-def _has_formatting_pattern_for_number(numobj):
+def _choose_formatting_pattern_for_numobj(numobj):
country_code = numobj.country_code
phone_number_region = region_code_for_country_code(country_code)
metadata = PhoneMetadata.metadata_for_region_or_calling_code(country_code, phone_number_region)
if metadata is None:
- return False
+ return None
national_number = national_significant_number(numobj)
- format_rule = _choose_formatting_pattern_for_number(metadata.number_format, national_number)
- return format_rule is not None
+ return _choose_formatting_pattern_for_number(metadata.number_format, national_number)
+
+
+def _choose_formatting_pattern_for_number(available_formats, national_number):
+ for num_format in available_formats:
+ size = len(num_format.leading_digits_pattern)
+ # We always use the last leading_digits_pattern, as it is the most detailed.
+ if size > 0:
+ ld_pattern = re.compile(num_format.leading_digits_pattern[-1])
+ ld_match = ld_pattern.match(national_number)
+ if size == 0 or ld_match:
+ format_pattern = re.compile(num_format.pattern)
+ if fullmatch(format_pattern, national_number):
+ return num_format
+ return None
def format_out_of_country_keeping_alpha_chars(numobj, region_calling_from):
@@ -1769,20 +1777,6 @@ def _format_nsn(number, metadata, num_format, carrier_code=None):
return _format_nsn_using_pattern(number, formatting_pattern, num_format, carrier_code)
-def _choose_formatting_pattern_for_number(available_formats, national_number):
- for num_format in available_formats:
- size = len(num_format.leading_digits_pattern)
- # We always use the last leading_digits_pattern, as it is the most detailed.
- if size > 0:
- ld_pattern = re.compile(num_format.leading_digits_pattern[-1])
- ld_match = ld_pattern.match(national_number)
- if size == 0 or ld_match:
- format_pattern = re.compile(num_format.pattern)
- if fullmatch(format_pattern, national_number):
- return num_format
- return None
-
-
def _format_nsn_using_pattern(national_number, formatting_pattern, number_format,
carrier_code=None):
# Note that carrier_code is optional - if None or an empty string, no
diff --git a/python/phonenumbers/phonenumberutil.pyi b/python/phonenumbers/phonenumberutil.pyi
index e3fb34cb..48f63801 100644
--- a/python/phonenumbers/phonenumberutil.pyi
+++ b/python/phonenumbers/phonenumberutil.pyi
@@ -152,14 +152,14 @@ def format_national_number_with_preferred_carrier_code(numobj: PhoneNumber, fall
def format_number_for_mobile_dialing(numobj: PhoneNumber, region_calling_from: str, with_formatting: bool) -> str: ...
def format_out_of_country_calling_number(numobj: PhoneNumber, region_calling_from: str) -> str: ...
def format_in_original_format(numobj: PhoneNumber, region_calling_from: str) -> str: ...
-def _format_original_allow_mods(numobj: PhoneNumber, region_calling_from: str) -> str: ...
+def _format_original_allow_mods(numobj: PhoneNumber, region_calling_from: str, format_rule: NumberFormat) -> str: ...
def _raw_input_contains_national_prefix(raw_input: str, national_prefix: str, region_code: str) -> bool: ...
-def _has_formatting_pattern_for_number(numobj: PhoneNumber) -> bool: ...
+def _choose_formatting_pattern_for_numobj(numobj: PhoneNumber) -> NumberFormat: ...
+def _choose_formatting_pattern_for_number(available_formats: list[NumberFormat], national_number: str) -> NumberFormat | None: ...
def format_out_of_country_keeping_alpha_chars(numobj: PhoneNumber, region_calling_from: str) -> str: ...
def national_significant_number(numobj: PhoneNumber) -> str: ...
def _prefix_number_with_country_calling_code(country_code: int, num_format: int, formatted_number: str) -> str: ...
def _format_nsn(number: str, metadata: PhoneMetadata, num_format: int, carrier_code: str | None = ...) -> str: ...
-def _choose_formatting_pattern_for_number(available_formats: list[NumberFormat], national_number: str) -> NumberFormat | None: ...
def _format_nsn_using_pattern(national_number: str, formatting_pattern: NumberFormat, number_format: int, carrier_code: str | None = ...) -> str: ...
def example_number(region_code: str) -> PhoneNumber | None: ...
def invalid_example_number(region_code: str) -> PhoneNumber | None: ...
diff --git a/python/phonenumbers/tzdata/data0.py b/python/phonenumbers/tzdata/data0.py
index 68f815aa..fc54d21b 100644
--- a/python/phonenumbers/tzdata/data0.py
+++ b/python/phonenumbers/tzdata/data0.py
@@ -2123,6 +2123,8 @@
'262':('Indian/Mayotte', 'Indian/Reunion'),
'262262':('Indian/Reunion',),
'262263':('Indian/Reunion',),
+ '2622688':('Indian/Reunion',),
+ '2622689':('Indian/Mayotte',),
'262269':('Indian/Mayotte',),
'26263':('Indian/Mayotte',),
'26269':('Indian/Reunion',),
@@ -3297,6 +3299,7 @@
'97624':('Asia/Hovd',),
'97625':('Asia/Ulaanbaatar',),
'976258':('Asia/Choibalsan',),
+ '97626':('Asia/Ulaanbaatar',),
'9765':('Asia/Ulaanbaatar',),
'9766':('Asia/Ulaanbaatar',),
'9767':('Asia/Ulaanbaatar',),
diff --git a/resources/PhoneNumberMetadata.xml b/resources/PhoneNumberMetadata.xml
index 5c9fbf8e..5ada1a1d 100644
--- a/resources/PhoneNumberMetadata.xml
+++ b/resources/PhoneNumberMetadata.xml
@@ -5088,7 +5088,10 @@
(?:
321|
- 7[1-8]\d
+ 7(?:
+ [1-8]\d|
+ 9[03]
+ )
)\d{5}
@@ -14352,7 +14355,7 @@
-
+
@@ -14440,7 +14443,7 @@
55(?:
4(?:
- 0[0-2]|
+ 0[0-3]|
[16]0
)|
57[0-289]
@@ -14490,7 +14493,8 @@
200|
9(?:
0[0-2]|
- 19
+ 19|
+ 9\d
)
)\d{6}
@@ -21307,7 +21311,10 @@
area code until now. Grouping access code and area code, this is why first two
digits are grouped. -->
- [12]1
+
+ 11|
+ 2[16]
+
$1 $2 $3