Номера телефонов часть 2 python

Здравствуйте, помогите решить задачу (Питон 3.3):

Телефонные номера в адресной книге мобильного телефона имеют один из следующих форматов:

+7<код><номер>

8<код><номер>

<номер>

где <номер> — это семь цифр, а <код> — это три цифры или три цифры в круглых скобках. Если код не указан, то считается, что он равен 495. Кроме того, в записи телефонного номера может стоять знак “-” между любыми двумя цифрами.
На данный момент в адресной книге телефона Васи записано всего три телефонных номера, и он хочет записать туда еще один. Но он не может понять, не записан ли уже такой номер в телефонной книге. Помогите ему!
Два телефонных номера совпадают, если у них равны коды и равны номера. Например, +7(916)0123456 и 89160123456 — это один и тот же номер.

Входные данные
В первой строке входных данных записан номер телефона, который Вася хочет добавить в адресную книгу своего телефона. В следующих трех строках записаны три номера телефонов, которые уже находятся в адресной книге телефона Васи. Гарантируется, что каждая из записей соответствует одному из трех приведенных в условии форматов.

Выходные данные
Для каждого телефонного номера в адресной книге выведите YES (заглавными буквами), если он совпадает с тем телефонным номером, который Вася хочет добавить в адресную книгу или NO (заглавными буквами) в противном случае.

Пример

Ввод
8(495)430-23-97
+7-4-9-5-43-023-97
4-3-0-2-3-9-7
8-495-430

Вывод
YES
YES
NO

Помогите пожалуйста решить эту задачу, весь день пытался, но так ничего и не получилось

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

Система проверки сайта не принимает решение, пожалуйста подскажите где ошибка.

Собственно задача:

1002.Телефонные номера

Ограничение времени: 2.0 секунды
Ограничение памяти: 64 МБ

В современном мире вы встречаетесь с огромным количеством телефонных номеров,
которые со временем становятся всё длиннее и длиннее. И вам приходится
запоминать эти номера. Одним из простых способов запоминания является сопоставление
букв каждой цифре, как показано на следующем рисунке:

1 ij    2 abc   3 def
4 gh    5 kl    6 mn
7 prs   8 tuv   9 wxy
        0 oqz

Таким образом, каждому слову или группе слов может быть сопоставлен уникальный номер,
так что можно запоминать слова вместо телефонных номеров. Очевидно, есть особый шарм в том,
чтобы найти простую взаимосвязь между словом, используемым для запоминания телефонного номера,
и владельцем этого номера. Так, телефонный номер 941837296 вашего друга, играющего в шахматы,
может быть прочитан как WHITEPAWN (белая пешка), а номер 2855304 Вашего любимого учителя
может быть прочитан как BULLDOG (бульдог).

Напишите программу, находящую самую короткую последовательность слов
(имеющую наименьшее количество слов), которая соответствует заданному номеру телефона и
заданному списку слов. Соответствие описано на рисунке выше.

Исходные данные

Ввод состоит из набора тестов. Первая строка каждого теста содержит номер телефона,
к которому нужно подобрать мнемонику. Номер состоит не более чем из 100 цифр.
Вторая строка содержит общее количество слов в словаре (максимум 50 000).
Каждая из оставшихся строк содержит одно слово,
состоящее не более чем из 50 строчных латинских букв.
Общий размер ввода не превосходит 300 килобайт.
Последняя строка ввода содержит число −1.

Результат

Каждая строка вывода должна содержать кратчайшую последовательность слов, найденную вашей программой.
Слова должны быть разделены одиночными пробелами. Если для входных данных нет решения, соответствующая
строка вывода должна содержать текст No solution..
Если существует несколько решений, имеющих одинаковое количество слов, можете выбрать любое из них.


Ввод и вывод данные авторами для примера:

7325189087
5
it
your
reality
real
our
4294967296
5
it
your
reality
real
our
-1
# Ожидаемый результат  
reality our
No solution.

Мои вводные для теста:

2272583262772
11
ba
ra
ku
k
ss
u
ma
da
m
a
ssa
-1

По логике ответ должен быть

ba ra ku da ma ssa

Но это решение почему-то в список возможных не попадает.
Причем если ma расположить после da то это решение находится.
Вот список решений из которых идет выбор оптимального:

['ba', 'ra', 'ku', 'da', 'm', 'a', 'ss', 'a']
['a', 'a', 'ra', 'ku', 'da', 'm', 'a', 'ss', 'a']

И соответственно оптимальным код считает:

ba ra ku da m a ss a

Ну и соответственно валидатор не принимает это решение.
Подскажите пожалуйста где косяк

Мое решение:

keyboard = {'1': 'ij', '2': 'abc', '3': 'def',
            '4': 'gh', '5': 'kl', '6': 'mn',
            '7': 'prs', '8': 'tuv', '9': 'wxy',
            '0': 'oqz'}

while True:
    phone_num = input()
    solutions = []
    if phone_num == '-1':
        break
    phone_len = len(phone_num)
    words = [input() for _ in range(int(input()))]
    collector = []
    for word in words:
        if len(word) > phone_len:
            continue

        solution = []
        for i in range(len(word)):
            if word[i] not in keyboard[phone_num[i]]:
                break

        else:
            solution.append(word)
            test_solution = []

            while test_solution != solution:
                test_solution = solution.copy()
                raw_solution = ''.join(solution)
                len_solution = len(raw_solution)
                new_words = [item for item in words if len(item) <= phone_len - len_solution]
                if new_words:
                    for item in new_words:
                        raw_solution = ''.join(solution)
                        len_solution = len(raw_solution)
                        test_string = raw_solution + item
                        len_test_string = len(test_string)
                        if len_test_string > phone_len:
                            continue
                        for s in range(len_solution, len_test_string):
                            if test_string[s] not in keyboard[phone_num[s]]:
                                break
                        else:
                            solution.append(item)

            solutions.append(solution)

    if solutions:
        solutions.sort(key=lambda g: len(g))
        print(*solutions[0])
    else:
        print('No solution.')

Вступление

Проверка телефонных номеров может быть очень сложной задачей. Формат
номера телефона может отличаться от страны к стране. Черт возьми, это
может также отличаться в пределах одной страны! Некоторые страны
используют один и тот же код страны, в то время как некоторые другие
страны используют более одного кода страны. Согласно примеру из
репозитория Google
libphonenumber
GitHub, США, Канада и Карибские острова имеют один и тот же код страны (
+1 ). С другой стороны, на телефонные номера из Косово можно звонить
по сербскому, словенскому и марокканскому кодам стран.

Это лишь некоторые из проблем, связанных с идентификацией или проверкой
телефонных номеров. На первый взгляд, можно хотя бы проверить код страны
телефонного номера с помощью
RegEx . Однако это
означает, что вам нужно будет написать собственное правило RegEx для
каждой страны мира, просто чтобы проверить код страны. Кроме того, у
некоторых операторов мобильной связи есть свои правила (например, для
определенных цифр можно использовать только определенный диапазон
номеров). Вы можете видеть, что ситуация может быстро выйти из-под
контроля и сделать для нас практически невозможным проверку ввода номера
телефона самостоятельно.

К счастью, есть библиотека Python, которая может помочь нам легко и
эффективно пройти процесс проверки. Библиотека Python Phonenumbers
является производным от библиотеки Google libphonenumber , которая
также доступна для других языков программирования, таких как C ++, Java
и JavaScript.

В этом руководстве мы узнаем, как анализировать, проверять и извлекать
телефонные номера, а также как извлекать дополнительную информацию из
телефонных номеров, таких как данные оператора связи, часового пояса или
геокодера.

Использовать библиотеку очень просто, и обычно она используется
следующим образом:

 import phonenumbers 
 from phonenumbers import carrier, timezone, geocoder 
 
 my_number = phonenumbers.parse("+447986123456", "GB") 
 
 print(phonenumbers.is_valid_number(my_number)) 
 print(carrier.name_for_number(my_number, "en")) 
 print(timezone.time_zones_for_number(my_number)) 
 print(geocoder.description_for_number(my_number, 'en')) 

И вот результат:

 True 
 EE 
 ('Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London') 
 United Kingdom 

Начнем с настройки нашей среды и установки библиотеки.

Установка телефонных номеров

Сначала давайте создадим и активируем нашу виртуальную среду:

 $ mkdir phonenumbers && cd phonenumbers 
 $ python3 -m venv venv 
 $ . venv/bin/active # venvScriptsactivate.bat on Windows 

Затем устанавливаем библиотеку Python Phonenumbers:

 $ pip3 install Phonenumbers 

В этом руководстве будет использоваться библиотека Phonenumbers версии
8.12.19 .

Теперь мы готовы начать знакомство с библиотекой Phonenumbers.

Разбор номера телефонов номера телефонов Python

Независимо от того, получаете ли вы ввод пользователя из веб-формы или
из других источников, например извлекаете из некоторого текста
(подробнее об этом позже в этом руководстве), входящий номер телефона,
скорее всего, будет строкой. В качестве первого шага, мы должны
разобрать его , используя phonenumbers , и превратить его в
PhoneNumber , например , так , что мы можем использовать его для
проверки и других функций.

Мы можем разобрать номер телефона с помощью метода parse()

 import phonenumbers 
 
 my_string_number = "+40721234567" 
 my_number = phonenumbers.parse(my_string_number) 

Метод phonenumbers.parse() принимает строку номера телефона в качестве
обязательного аргумента. Вы также можете передать информацию о стране в
формате ISO Alpha-2 в качестве необязательного аргумента. Рассмотрим,
например, следующий код:

 my_number = phonenumbers.parse(my_string_number, "RO") 

«RO» означает Румынию в формате ISO Alpha-2. Вы можете проверить другие
коды стран Alpha-2 и цифровые коды на этом
веб-сайте . В этом руководстве для простоты я
буду опускать код страны ISO Alpha-2 для большинства случаев и включать
его только тогда, когда это строго необходимо.

В phonenumbers.parse() уже есть некоторые встроенные базовые правила
проверки, такие как длина числовой строки, проверка нуля в начале или
знак + Обратите внимание, что этот метод вызовет исключение, если
какое-либо из необходимых правил не выполнено. Поэтому не забудьте
использовать его в блоке try / catch в своем приложении .

Теперь, когда мы правильно проанализировали номер телефона, приступим к
проверке.

Подтверждение телефонных номеров с помощью телефонных номеров Python

Phonenumbers имеет два метода проверки действительности телефонного
номера. Основное отличие этих методов — скорость и точность.

Чтобы уточнить, начнем с is_possible_number() :

 import phonenumbers 
 
 my_string_number = "+40021234567" 
 my_number = phonenumbers.parse(my_string_number) 
 print(phonenumbers.is_possible_number(my_number)) 

И результат будет:

 True 

Теперь давайте воспользуемся тем же числом, но на этот раз с методом
is_valid_number()

 import phonenumbers 
 
 my_string_number = "+40021234567" 
 my_number = phonenumbers.parse(my_string_number) 
 print(phonenumbers.is_valid_number(my_number)) 

Несмотря на то, что ввод был таким же, результат был бы другим:

 False 

Причина в том, что метод is_possible_number() быстро угадывает
действительность телефонного номера, проверяя длину проанализированного
номера, в то время как метод is_valid_number() выполняет полную
проверку, проверяя длину, префикс телефонного номера и регион.

При переборе большого списка телефонных номеров использование
phonenumbers.is_possible_number() обеспечит более быстрые результаты
по сравнению с phonenumbers.is_valid_number() . Но, как мы видим
здесь, эти результаты не всегда могут быть точными. Это может быть
полезно для быстрого удаления телефонных номеров, не соответствующих
длине. Так что используйте это на свой страх и риск.

Извлечение и форматирование телефонных номеров с помощью телефонных номеров Python

Пользовательский ввод — не единственный способ получить или собрать
телефонные номера. Например, у вас может быть паук / краулер, который
будет читать определенные страницы с веб-сайта или документа и извлекать
номера телефонов из текстовых блоков. Это звучит как сложная проблема,
но, к счастью, библиотека Phonenumbers предоставляет нам только
необходимые функции с помощью PhoneNumberMatcher(text, region) .

PhoneNumberMatcher принимает текстовый блок и область в качестве
аргумента, а затем выполняет PhoneNumberMatch чтобы вернуть
соответствующие результаты в виде объектов PhoneNumberMatch.

Давайте использовать PhoneNumberMatcher со случайным текстом:

 import phonenumbers 
 
 text_block = "Our services will cost about 2,200 USD and we will deliver the product by the 10.10.2021. For more information, you can call us at +44 7986 123456 or send an e-mail to [email protected] " 
 
 for match in phonenumbers.PhoneNumberMatcher(text_block, "GB"): 
 print(match) 

Это напечатает совпадающие телефонные номера вместе с их индексом в
строке:

 PhoneNumberMatch [131,146) +44 7986 123456 

Возможно, вы заметили, что наш номер отформатирован в стандартизованном
международном формате и разделен пробелами. Это может быть не всегда так
в реальных сценариях. Вы можете получить свой номер в других форматах,
например, разделенный тире или отформатированный в национальном (вместо
международного) формате.

Давайте PhoneNumberMatcher() с другими форматами телефонных номеров:

 import phonenumbers 
 
 text_block = "Our services will cost about 2,200 USD and we will deliver the product by the 10.10.2021. For more information you can call us at +44-7986-123456 or 020 8366 1177 send an e-mail to [email protected] " 
 
 for match in phonenumbers.PhoneNumberMatcher(text_block, "GB"): 
 print(match) 

Это выведет:

 PhoneNumberMatch [130,145) +44-7986-123456 
 PhoneNumberMatch [149,162) 020 8366 1177 

Несмотря на то, что номера телефонов встроены глубоко в текст с
различными форматами с другими номерами, PhoneNumberMatcher успешно
возвращает номера телефонов с большой точностью.

Помимо извлечения данных из текста, мы также можем захотеть получить
цифры по одной от пользователя. Представьте, что пользовательский
интерфейс вашего приложения работает аналогично современным мобильным
телефонам и форматирует номера телефонов по мере ввода. Например, на
своей веб-странице вы можете передавать данные в свой API с каждым
onkeyup и использовать AsYouTypeFormatter() для форматируйте
телефонный номер с каждой входящей цифрой.

Поскольку часть пользовательского интерфейса выходит за рамки этой
статьи, мы будем использовать базовый пример для AsYouTypeFormatter .
Чтобы смоделировать форматирование на лету, давайте перейдем к
интерпретатору Python:

 >>> import phonenumbers 
 >>> formatter = phonenumbers.AsYouTypeFormatter("TR") 
 >>> formatter.input_digit("3") 
 '3' 
 >>> formatter.input_digit("9") 
 '39' 
 >>> formatter.input_digit("2") 
 '392' 
 >>> formatter.input_digit("2") 
 '392 2' 
 >>> formatter.input_digit("2") 
 '392 22' 
 >>> formatter.input_digit("1") 
 '392 221' 
 >>> formatter.input_digit("2") 
 '392 221 2' 
 >>> formatter.input_digit("3") 
 '392 221 23' 
 >>> formatter.input_digit("4") 
 '392 221 23 4' 
 >>> formatter.input_digit("5") 
 '392 221 23 45' 

Не весь пользовательский ввод происходит по мере ввода. В некоторых
формах есть простые поля для ввода текста для телефонных номеров. Однако
это не обязательно означает, что мы будем вводить данные в стандартном
формате.

Библиотека Phonenumbers также предоставила нам format_number() . Этот
метод позволяет нам преобразовать телефонные номера в три хорошо
известных стандартизованных формата. Национальный, Международный и E164.
Национальные и международные форматы говорят сами за себя, в то время
как формат E164 — это международный формат телефонных номеров, который
гарантирует, что номера телефонов ограничены 15 цифрами и имеют формат
{+} {код страны} {номер с кодом города} . Для получения дополнительной
информации о E164 вы можете проверить эту страницу в
Википедии .

Начнем с национального форматирования:

 import phonenumbers 
 
 my_number = phonenumbers.parse("+40721234567") 
 national_f = phonenumbers.format_number(my_number, phonenumbers.PhoneNumberFormat.NATIONAL) 
 print(national_f) 

Это вернет строку номера телефона с красивым интервалом в национальном
формате:

 0721 234 567 

Теперь попробуем отформатировать национальный номер как международный:

 import phonenumbers 
 
 my_number = phonenumbers.parse("0721234567", "RO") # "RO" is ISO Alpha-2 code for Romania 
 international_f = phonenumbers.format_number(my_number, phonenumbers.PhoneNumberFormat.INTERNATIONAL) 
 print(international_f) 

Приведенный выше код вернет строку с номером телефона с аккуратным
интервалом:

 +40 721 234 567 

Обратите внимание, что мы передали "RO" в качестве второго параметра в
метод parse() . Поскольку введенный номер является национальным
номером, он не имеет префикса кода страны, который указывал бы на
страну. В этих случаях нам нужно указать страну с ее кодом ISO Alpha-2,
чтобы получить точный результат. Исключение числового кода страны и кода
страны ISO Alpha-2 вызовет исключение
NumberParseException: (0) Missing or invalid default region. .

Теперь попробуем E164 форматирования E164. В качестве входных данных
мы передадим национальную строку:

 import phonenumbers 
 
 my_number = phonenumbers.parse("0721234567", "RO") 
 e164_f=phonenumbers.format_number(my_number, phonenumbers.PhoneNumberFormat.E164) 
 print(e164_f) 

Результат будет очень похож на PhoneNumberFormat.INTERNATIONAL , за
исключением пробелов:

 +40721234567 

Это очень полезно, если вы хотите передать число в фоновый API.
API-интерфейсы нередко ожидают, что телефонные номера будут строками без
пробелов.

Получить дополнительную информацию о номере телефона

В телефонный номер загружены данные о пользователе, который может вас
заинтересовать. Вы можете использовать разные API или конечные точки API
в зависимости от оператора связи с конкретным номером телефона,
поскольку это играет роль в стоимости продукта. Возможно, вы захотите
отправить свои рекламные уведомления в зависимости от часового пояса
вашего клиента (номера телефона), чтобы вы не отправляли им сообщение
посреди ночи. Или вы можете захотеть получить информацию о
местонахождении номера телефона, чтобы вы могли предоставить
соответствующую информацию. Библиотека Phonenumbers предоставляет
необходимые инструменты для удовлетворения этих потребностей.

Для начала воспользуемся методом description_for_number() из класса
geocoder Этот метод принимает в качестве параметров проанализированный
номер телефона и короткое название языка.

Давайте попробуем это с нашим предыдущим фальшивым номером:

 import phonenumbers 
 from phonenumbers import geocoder 
 
 my_number = phonenumbers.parse("+447986123456") 
 print(geocoder.description_for_number(my_number, "en")) 

Это распечатает страну происхождения телефонного номера:

 United Kingdom 

Краткие названия языков довольно интуитивно понятны. Попробуем получить
вывод на русском языке:

 import phonenumbers 
 from phonenumbers import geocoder 
 
 my_number = phonenumbers.parse("+447986123456") 
 print(geocoder.description_for_number(my_number, "ru")) 

А вот результат, в котором по-русски написано Великобритания:

 Соединенное Королевство 

Вы можете попробовать его с другими языками по вашему выбору, такими как
«de», «fr», «zh» и т. Д.

Как упоминалось ранее, вы можете сгруппировать свои телефонные номера по
их операторам связи, поскольку в большинстве случаев это повлияет на
стоимость. Чтобы уточнить, библиотека Phonenumbers, вероятно,
предоставит большинство имен операторов точно, но не на 100%.

Сегодня в большинстве стран можно получить свой номер у одного оператора
связи, а затем перенести тот же номер на другого оператора, оставив при
этом номер телефона неизменным. Поскольку Phonenumbers — это просто
автономная библиотека Python, эти изменения невозможно обнаружить.
Поэтому лучше рассматривать названия операторов как справку, а не как
факт.

Мы будем использовать метод name_for_number() из класса carrier

 import phonenumbers 
 from phonenumbers import carrier 
 
 my_number = phonenumbers.parse("+40721234567") 
 print(carrier.name_for_number(my_number, "en")) 

Если возможно, отобразится исходный оператор телефонного номера:

 Vodafone 

Примечание . Как указано в исходных документах Python Phonenumbers,
информация о операторах связи доступна для мобильных номеров в некоторых
странах, а не во всех.

Еще одна важная информация о номере телефона — это часовой пояс. Метод
time_zones_for_number() вернет список часовых поясов, которым
принадлежит номер. Мы импортируем его из phonenumbers.timezone :

 import phonenumbers 
 from phonenumbers import timezone 
 
 my_number = phonenumbers.parse("+447986123456") 
 print(timezone.time_zones_for_number(my_number)) 

Это напечатает следующие часовые пояса:

 ('Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London') 

На этом мы завершаем наше руководство по телефонным номерам Python.

Заключение

Мы узнали, как анализировать телефонные номера с помощью parse() ,
извлекать числа из текстовых блоков с помощью PhoneNumberMatcher() ,
получать номера телефонов по цифрам и форматировать их с помощью
AsYouTypeFormatter() , использовать различные методы проверки с
is_possible_number() и is_possible_number() , форматируйте числа с
помощью NATIONAL , INTERNATIONAL и E164 и извлекайте
дополнительную информацию из номеров телефонов с помощью классов
geocoder , carrier и timezone

Не забудьте проверить исходный репозиторий библиотеки Phonenumbers на
GitHub . Также,
если у вас есть какие-либо вопросы, не стесняйтесь комментировать ниже.

Кодинг-марафон. Задача 6.

В БД некоего предприятия номера телефонов хранятся как попало и вам поручили написать функцию, которая приведёт их все к одному формату.

Функция должна называться format_numbers, она принимает на вход строку (исходный номер) и возвращает строку (номер в нужном формате).

Сигнатура def format_numbers(phone_number: str) -> str:

Особенности номеров в БД:

  • помимо цифр может содержать дефисы -, пробелы, скобки и знак + (но + только первым символом)
  • номер всегда валиден (содержит 11 цифр)
  • номер всегда начинается с 8 или +7, причем + может быть только в начале номера
  • не может быть 2 идущих подряд дефисов, скобок или пробелов

Необходимо, чтобы на выходе любой номер стал такого формата: +7(909)101-10-10

Примеры

format_numbers('+79091011010') == '+7(909)101-10-10'
format_numbers('8(909)1011010') == '+7(909)101-10-10'
format_numbers('+7 909 101-10-10') == '+7(909)101-10-10'

Варианты решений

def format_numbers(phone_number: str) -> str:
    return '+7({0}{1}{2}){3}{4}{5}-{6}{7}-{8}{9}'.format(*[i for i in phone_number if i.isdigit()][1:])
def format_numbers(phone_number: str) -> str:
    numbers = list(filter(str.isdigit, phone_number))[1:]
    return "+7({}{}{}){}{}{}-{}{}-{}{}".format(*numbers)

Задача

Создать телефонный справочник с возможностью импорта и экспорта данных в нескольких форматах. Под форматами понимаем структуру файлов, например, в файле на одной строке хранится одна часть записи, пустая строка — разделитель

Фамилия_1

Имя_1

Телефон_1

Описание_1

Фамилия_2

Имя_2

Телефон_2

Описание_2

и т.д.

В файле на одной строке хранится все записи, символ разделитель — ;

Фамилия_1;Имя_1;Телефон_1;Описание_1

Фамилия_2;Имя_2;Телефон_2;Описание_2

и т.д.

Решение

Структура проекта состоит из 4 модулей:

  • User_interface. Предоставляет пользователю возможность ввести данные для дальнейшого сохранения в телефонном справочнике. В данном модюле присутствует проверка на количество символов в номере телефона, и проверка на число.
    Все четыре категории данных, а именно фамилия, имя, номер телефона и описание, сохраняются в списке info.
  • CSV_creating. Модуль создает файл .csv и записывает в него шапку таблицы.
  • File_writing. Содержит два метода для записи файла csv и .txt. В первом данные сохраняются через ‘;‘, во втором — через пустую строку части записи, и через две пустые строки целые записи.
    +Main. Проверяет существует ли файл с расширением .csv. Если нет, то запускает модуль создания файла с шапкой таблицы. После этого вызываюся модуль записи, который в свою очередь забирает информацию из UI.

Автор оригинала: Ruslan Hasanov.

Вступление

Проверка телефонных номеров может быть очень сложной задачей. Формат телефонного номера может варьироваться в зависимости от страны. Черт возьми, она также может варьироваться в пределах одной и той же страны! Некоторые страны используют один и тот же код страны, в то время как некоторые другие страны используют более одного кода страны. Согласно примеру из репозитория Google libphonenumber GitHub , США, Канада и Карибские острова имеют один и тот же код страны ( +1 ). С другой стороны, можно звонить на телефонные номера из Косово по сербским, словенским и марокканским кодам стран.

Это лишь некоторые из проблем, связанных с идентификацией или проверкой телефонных номеров. На первый взгляд, можно, по крайней мере, проверить код страны телефонного номера с помощью регулярного выражения . Однако это означает, что вам придется написать собственное правило регулярных выражений для каждой страны мира, просто чтобы проверить код страны. Кроме того, некоторые операторы мобильной связи имеют свои собственные правила (например, определенные цифры могут использовать только определенный диапазон номеров). Вы можете видеть, что все может быстро выйти из-под контроля и сделать почти невозможным для нас проверить ввод номера телефона самостоятельно.

К счастью, существует библиотека Python, которая может помочь нам легко и эффективно пройти процесс проверки. Библиотека Python Phonenumbers является производной от библиотеки Google libphonenumber , которая также доступна для других языков программирования, таких как C++, Java и JavaScript.

В этом уроке мы узнаем, как анализировать, проверять и извлекать телефонные номера, а также как извлекать дополнительную информацию из телефонных номеров, например, информацию о носителе, часовом поясе или геокодере.

Использование библиотеки очень прямолинейно, и обычно она используется следующим образом:

import phonenumbers
from phonenumbers import carrier, timezone, geocoder

my_number = phonenumbers.parse("+447986123456", "GB")

print(phonenumbers.is_valid_number(my_number))
print(carrier.name_for_number(my_number, "en"))
print(timezone.time_zones_for_number(my_number))
print(geocoder.description_for_number(my_number, 'en'))

И вот результат:

True
EE
('Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London')
United Kingdom

Давайте начнем с настройки нашей среды и установки библиотеки.

Установка телефонных номеров

Во-первых, давайте создадим и активируем нашу виртуальную среду:

$ mkdir phonenumbers && cd phonenumbers
$ python3 -m venv venv
$ . venv/bin/active # venvScriptsactivate.bat on Windows

Затем мы устанавливаем библиотеку Python Phonenumbers:

$ pip3 install Phonenumbers

Этот учебник будет использовать версию библиотеки телефонных номеров 8.12.19 .

Теперь мы готовы начать знакомство с библиотекой телефонных номеров.

Разбор телефонных номеров с помощью Python phonenumbers

Независимо от того, получаете ли вы пользовательский ввод из веб-формы или других источников, например извлечение из какого-либо текста (подробнее об этом позже в этом учебнике), входной номер телефона, скорее всего, будет строкой. В качестве первого шага нам нужно будет разобрать его с помощью телефонных номеров и превратить в экземпляр Телефонного номера , чтобы мы могли использовать его для проверки и других функций.

Мы можем разобрать номер телефона с помощью метода parse() :

import phonenumbers

my_string_number = "+40721234567"
my_number = phonenumbers.parse(my_string_number)

Метод phonenumbers.parse() принимает строку телефонного номера в качестве обязательного аргумента. Вы также можете передать информацию о стране в формате ISO Alpha-2 в качестве необязательного аргумента. Возьмем, к примеру, следующий код:

my_number = phonenumbers.parse(my_string_number, "RO")

“RO” означает Румынию в формате ISO Alpha-2. Вы можете проверить другие альфа-2 и числовые коды стран с этого веб-сайта . В этом уроке для простоты я опущу код страны ISO Alpha-2 для большинства случаев и включу его только тогда, когда это строго необходимо.

Метод phonenumbers.parse() уже имеет некоторые встроенные базовые правила проверки, такие как длина числовой строки, проверка начального нуля или знака + . Обратите внимание, что этот метод вызовет исключение, когда какое-либо из необходимых правил не будет выполнено. Поэтому не забудьте использовать его в блоке try/catch в вашем приложении .

Теперь, когда мы правильно проанализировали наш номер телефона, давайте перейдем к проверке.

Проверка телефонных номеров с помощью Python Phonenumbers

Телефонные номера имеют два метода проверки действительности телефонного номера. Главное отличие этих методов-скорость и точность.

Чтобы уточнить, давайте начнем с is_possible_number() :

import phonenumbers

my_string_number = "+40021234567"
my_number = phonenumbers.parse(my_string_number)
print(phonenumbers.is_possible_number(my_number))

И выход будет таким:

Теперь давайте используем тот же номер, но на этот раз с помощью метода is_valid_number() :

import phonenumbers

my_string_number = "+40021234567"
my_number = phonenumbers.parse(my_string_number)
print(phonenumbers.is_valid_number(my_number))

Даже если входные данные были одинаковыми, результат будет другим:

Причина в том, что метод is_possible_number() быстро угадывает действительность телефонного номера, проверяя длину анализируемого номера, в то время как метод is_valid_number() выполняет полную проверку, проверяя длину, префикс телефонного номера и регион.

При итерации по большому списку телефонных номеров использование phone numbers.is_possible_number() даст более быстрые результаты по сравнению с phonenumbers.is_valid_number() . Но, как мы видим здесь, эти результаты не всегда могут быть точными. Это может быть полезно для быстрого устранения телефонных номеров, которые не соответствуют длине. Так что используйте его на свой страх и риск.

Извлечение и форматирование телефонных номеров с помощью Python Phonenumbers

Пользовательский ввод-это не единственный способ получить или собрать телефонные номера. Например, у вас может быть паук/искатель, который будет читать определенные страницы с веб-сайта или документа и извлекать телефонные номера из текстовых блоков. Это звучит как сложная проблема, но, к счастью, библиотека телефонных номеров предоставляет нам именно ту функциональность, которая нам нужна, с помощью метода PhoneNumberMatcher(text, region) .

PhoneNumberMatcher принимает текстовый блок и область в качестве аргумента, а затем повторяет итерацию, чтобы вернуть соответствующие результаты в виде объектов PhoneNumberMatch .

Давайте используем PhoneNumberMatcher со случайным текстом:

import phonenumbers

text_block = "Our services will cost about 2,200 USD and we will deliver the product by the 10.10.2021. For more information, you can call us at +44 7986 123456 or send an e-mail to [email protected]"

for match in phonenumbers.PhoneNumberMatcher(text_block, "GB"):
    print(match)

Это приведет к печати соответствующих телефонных номеров вместе с их индексом в строке:

PhoneNumberMatch [131,146) +44 7986 123456

Возможно, вы заметили, что наш номер отформатирован в стандартизированном международном формате и разделен пробелами. Это не всегда может быть так в реальных сценариях. Вы можете получить свой номер в других форматах, например, разделенный на тире или отформатированный в национальном (а не международном) формате.

Давайте проверим метод PhoneNumberMatcher() с другими форматами телефонных номеров:

import phonenumbers

text_block = "Our services will cost about 2,200 USD and we will deliver the product by the 10.10.2021. For more information you can call us at +44-7986-123456 or 020 8366 1177 send an e-mail to [email protected]"

for match in phonenumbers.PhoneNumberMatcher(text_block, "GB"):
    print(match)

Это привело бы к выходу:

PhoneNumberMatch [130,145) +44-7986-123456
PhoneNumberMatch [149,162) 020 8366 1177

Несмотря на то, что телефонные номера встроены глубоко в текст с различными форматами с другими номерами, PhoneNumberMatcher успешно возвращает телефонные номера с большой точностью.

Помимо извлечения данных из текста, мы также можем захотеть получить цифры одну за другой от пользователя. Представьте, что пользовательский интерфейс вашего приложения работает аналогично современным мобильным телефонам и форматирует телефонные номера по мере ввода. Например, на вашей веб-странице вы можете передать данные в свой API с каждым событием onkeyup и использовать AsYouTypeFormatter() для форматирования номера телефона с каждой входящей цифрой.

Поскольку часть пользовательского интерфейса выходит за рамки этой статьи, мы будем использовать базовый пример для AsYouTypeFormatter . Чтобы смоделировать форматирование на лету, давайте перейдем к интерпретатору Python:

>>> import phonenumbers
>>> formatter = phonenumbers.AsYouTypeFormatter("TR")
>>> formatter.input_digit("3")
'3'
>>> formatter.input_digit("9")
'39'
>>> formatter.input_digit("2")
'392'
>>> formatter.input_digit("2")
'392 2'
>>> formatter.input_digit("2")
'392 22'
>>> formatter.input_digit("1")
'392 221'
>>> formatter.input_digit("2")
'392 221 2'
>>> formatter.input_digit("3")
'392 221 23'
>>> formatter.input_digit("4")
'392 221 23 4'
>>> formatter.input_digit("5")
'392 221 23 45'

Не все вводимые пользователем данные происходят так, как они вводятся. Некоторые формы имеют простые поля ввода текста для телефонных номеров. Однако это не обязательно означает, что мы будем вводить данные в стандартном формате.

Библиотека телефонных номеров также покрыла нас здесь с помощью метода format_number () . Этот метод позволяет нам форматировать телефонные номера в три хорошо известных, стандартизированных формата. Национальный, Международный и E164. Национальные и международные форматы довольно понятны, в то время как формат E164-это международный формат телефонных номеров, который гарантирует, что телефонные номера ограничены 15 цифрами и форматируются {+}{код страны}{номер с кодом города} . Для получения дополнительной информации о E164 вы можете проверить эту страницу Википедии .

Начнем с национального форматирования:

import phonenumbers

my_number = phonenumbers.parse("+40721234567")
national_f = phonenumbers.format_number(my_number, phonenumbers.PhoneNumberFormat.NATIONAL)
print(national_f)

Это вернет хорошо разнесенную строку телефонного номера с национальным форматом:

Теперь давайте попробуем отформатировать национальный номер как в международном формате:

import phonenumbers

my_number = phonenumbers.parse("0721234567", "RO")  # "RO" is ISO Alpha-2 code for Romania
international_f = phonenumbers.format_number(my_number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
print(international_f)

Приведенный выше код вернет хорошо разнесенную строку телефонного номера:

Обратите внимание, что мы передали "RO" в качестве второго параметра в метод parse () . Поскольку входной номер является национальным номером, он не имеет префикса кода страны, чтобы намекнуть на страну. В этих случаях нам нужно указать страну с ее кодом ISO Alpha-2, чтобы получить точный результат. Исключение кодов стран numeric и ISO Alpha-2 приведет к исключению NumberParseException: (0) Отсутствует или недопустим регион по умолчанию. .

Теперь давайте попробуем вариант форматирования E164 . Мы передадим национальную строку в качестве входных данных:

import phonenumbers

my_number = phonenumbers.parse("0721234567", "RO")
e164_f=phonenumbers.format_number(my_number, phonenumbers.PhoneNumberFormat.E164)
print(e164_f)

Вывод будет очень похож на PhoneNumberFormat.МЕЖДУНАРОДНЫЙ , за исключением пробелов:

Это очень полезно, когда вы хотите передать номер в фоновый API. API нередко ожидают, что телефонные номера будут строками без интервалов.

Получить дополнительную информацию по номеру телефона

Номер телефона загружается с данными о пользователе, которые могут вас заинтересовать. Вы можете использовать различные API или конечные точки API в зависимости от оператора конкретного телефонного номера, поскольку это играет определенную роль в стоимости продукта. Возможно, вы захотите отправлять уведомления о рекламных акциях в зависимости от часового пояса вашего клиента (номера телефона), чтобы не отправлять ему сообщение посреди ночи. Или вы можете получить информацию о местоположении телефонного номера, чтобы предоставить соответствующую информацию. Библиотека телефонных номеров предоставляет необходимые инструменты для удовлетворения этих потребностей.

Чтобы начать с местоположения, мы будем использовать метод description_for_number() из класса geocoder . Этот метод принимает в качестве параметров анализируемый номер телефона и краткое название языка.

Давайте попробуем это с нашим предыдущим поддельным номером:

import phonenumbers
from phonenumbers import geocoder

my_number = phonenumbers.parse("+447986123456")
print(geocoder.description_for_number(my_number, "en"))

При этом будет распечатана страна происхождения телефонного номера:

Короткие языковые названия довольно интуитивно понятны. Давайте попробуем получить вывод на русском языке:

import phonenumbers
from phonenumbers import geocoder

my_number = phonenumbers.parse("+447986123456")
print(geocoder.description_for_number(my_number, "ru"))

А вот вывод на котором написано Великобритания по русски:

Вы можете попробовать его с другими языками ваших предпочтений, такими как “de”, “fr”, “zh” и т. Д.

Как уже упоминалось ранее, вы можете сгруппировать свои телефонные номера по их операторам, так как в большинстве случаев это повлияет на стоимость. Чтобы уточнить, библиотека телефонных номеров, вероятно, предоставит большинство имен операторов точно, но не на 100%.

Сегодня в большинстве стран можно получить свой номер от одного оператора, а затем перенести тот же номер на другой оператор, оставив номер телефона точно таким же. Поскольку Телефонные номера-это всего лишь автономная библиотека Python, обнаружить эти изменения невозможно. Поэтому лучше всего подходить к названиям носителей как к эталону, а не как к факту.

Мы будем использовать метод name_for_number() из класса carrier :

import phonenumbers
from phonenumbers import carrier

my_number = phonenumbers.parse("+40721234567")
print(carrier.name_for_number(my_number, "en"))

При этом будет отображаться исходный носитель телефонного номера, если это возможно:

Примечание : Как указано в оригинальных документах Python Phonenumbers, информация о носителе доступна для мобильных номеров в некоторых странах, но не во всех.

Другой важной частью информации о телефонном номере является его часовой пояс. Метод time_zones_for_number() вернет список часовых поясов, к которым принадлежит это число. Мы импортируем его из номера телефонов.часовой пояс :

import phonenumbers
from phonenumbers import timezone

my_number = phonenumbers.parse("+447986123456")
print(timezone.time_zones_for_number(my_number))

Это приведет к печати следующих часовых поясов:

('Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London')

На этом наш учебник по Python Phonenumbers заканчивается.

Вывод

Мы научились разбирать телефонные номера с помощью метода parse () , извлекать номера из текстовых блоков с помощью метода PhoneNumberMatcher() , получать телефонные номера цифра за цифрой и форматировать их с помощью метода AsYouTypeFormatter() , используйте различные методы проверки с помощью is_possible_number() и is_possible_number() , форматируйте номера с помощью NATIONAL , INTERNATIONAL и E164 методов форматирования, а также извлекайте дополнительную информацию из телефонных номеров с помощью geocoder , carrier и timezone классов.

Не забудьте проверить оригинальное репо GitHub библиотеки телефонных номеров . Кроме того, если у вас есть какие-либо вопросы, не стесняйтесь комментировать их ниже.

Время прочтения
3 мин

Просмотры 29K

В процессе изучения Python стало интересно попробовать его в связке с API VK. В ВК есть телефонная книга, она показывает телефоны ваших друзей в более-менее удобном формате. Так как далеко не всегда люди охотно оставляют там полые(валидные) номера своих телефонов, мне показалась интересной идея написать скрипт, который отбирал бы только валидные номера моб.телефонов и выдавал бы их отдельной таблицей. Наша телефонная книга будет генерировать csv-файл, который затем можно будет открыть, например, в excel.

Для использования API VK на Python я нагуглил отличную, на мой взгляд, библиотеку с оригинальный названием vk.
Итак, импортируем необходимые модули:

import vk
from time import sleep
from re import sub, findall
from getpass import getpass
from csv import writer, QUOTE_ALL

Создадим класс User с необходимыми методами:

class User(object):
	"""VK User"""
	def __init__(self, login, password):
		self.login = login
		self.password = password
		self.id = ''
	# аторизирует юзера
	def auth(self):
		session = vk.AuthSession(app_id='5340228', user_login=self.login, user_password=self.password)
		api = vk.API(session)
		return api
	# возвращает массив объектов друзей
	def friends(self, api):
                # возвращает в том порядке, в котором расположены в разделе Мои
		user_friends = api.friends.get(user_id=self.id, order='hints')
		return user_friends
	# возвращает количество друзей
	def friends_count(self, api):
		user_friends = User.friends(self, api)
		friends_count = len(user_friends)
		return friends_count
	# возвращает массив данных о юзере
	def info(self, api):
		user = api.users.get(user_id=self.id)
		return user[0]

Долго не мог решить проблему, и в гугле как-то не попадалось на глаза, как взять id текущего пользователя. По счастливой случайности нашел выход — надо передать в качестве аргумента пустую строку.

Далее напишем функцию валидатор, которая будет приводить мобильные номера к общему виду. Мне, как жителю Украины, интересно выбирать только украинские моб.номера, которые должны начинаться на «0». Скрипт легко подправить под любой формат.

def norm_mob(str):
	if len(str) != '':
		norm_mob = sub(r'(s+)?[+]?[-]?', '', str)
		# проверяем строку на наличие в ней только необходимых символов
		right_mob = findall(r'[d]', norm_mob)
		# если количество знаков в двух строках совпадает, значит это номер телефона
		if (len(right_mob) == len(norm_mob)) and (len(norm_mob) >= 10):
			rev_norm_mob = norm_mob[::-1]
			norm_mob = rev_norm_mob[0:10]
			if norm_mob[::-1][0] == '0':
				return norm_mob[::-1]
	else:
		return False

Далее проходим по друзьям, выбираем тех, кто оставлял свои контакты, и если оставлял, то валидируем их и записываем в массив. Сервер ВК не любит большого количества запросов, поэтому заставим наш скрипт спать некоторое время между ними, пробовал разные значения, оптимальными оказались эти.

def find_correct_phone_numbers(api, friends, friends_count):
	users_phones = []
	for i in range(0, friends_count):
		cur_user_id = int(friends[i])
		cur_user = api.users.get(user_id=cur_user_id, fields='contacts')
		try:
			# выбираем номер мобильного телефона
			cur_mob = cur_user[0]['mobile_phone']
		except KeyError:
			sleep(0.3)
			continue
		mob = norm_mob(cur_mob)
		if mob:
			# вставим еще одну строку в наш массив
			users_phones.append({
				'user_name': '{} {}'.format(cur_user[0]['first_name'], cur_user[0]['last_name']),
				'user_phone': '8{}'.format(mob)
				})
		sleep(0.4)
	return users_phones

Сохраняем полученный результат.

def saveCSV(data, path):
    with open(path, 'w') as csvfile:
        my_writer = writer(csvfile, delimiter='	', quotechar='"', quoting=QUOTE_ALL)
        my_writer.writerow(('Имя пользователя', 'Номер моб. телефона'))
        for item in data:
        	try:
        		my_writer.writerow((item['user_name'], item['user_phone']))
        	except Exception:
        		my_writer.writerow(('(Ошибка в кодировке)', item['user_phone']))

Добавим функцию, которая считала бы затраченное время.

class Timer(object):
    def __enter__(self):
        self._startTime = time()
    def __exit__(self, type, value, traceback):
    	howLong = time() - self._startTime
    	print("Операция заняла: {:.2f} минут".format(howLong/60))

Ну и заключительный этап, сделаем вызов написанных функций.

def main():
	while True:
		login = input('E-mail: ')
		password = getpass('Password: ')
		try:
			vk_user = User(login, password)
			api = vk_user.auth()
			print('Авторизация выполнена успешно!')
			break
		except Exception:
			print('Вы ввели неверные данные, пожалуйста, повторите попытку.')
	friends = vk_user.friends(api)
	friends_count = vk_user.friends_count(api)
	print('Найдено {} друзей.'.format(friends_count))
	print('Идет выборка мобильных номеров...')
	with Timer() as p:
		users_phones = find_correct_phone_numbers(api, friends, friends_count)
	print('Выборка окончена. Сохранение...')
	saveCSV(users_phones, 'vk_mob.csv')
	print('Данные успешно сохранены.')
if __name__ == '__main__':
	main()

На выходе получаем csv-файл, который можно открыть в excel в формате удобной таблицы.

In this tutorial, it’s shown how to find and validate phone numbers in Python using simple examples. We will review different phone number formats which are the most popular.

The best option for search and validation of data like phones numbers, zip codes, identifiers is Regular expression or Regex.

Next, we’ll see the examples to find, extract or validate phone numbers from a given text or string. The article starts with easy examples and finishes with advanced ones.

Step 1: Find Simple Phone Number

Let’s suppose that we need to validate simple phone number formats which don’t change. For example:

  • 000-000-000
re.findall(r"[d]{3}-[d]{3}-[d]{3}", text)
  • 000 000 0000
re.findall(r"[d]{3} [d]{3} [d]{3}", text)

The goal is to find all matches for the pattern.
The mentioned solution is very basic and it’s not working for numbers like:

  • 9000-000-0009 — it will find only 000-000-000
  • 000 000 000
  • (000)000-000

In order to deal with those cases the Regex should be improved.

Step 2: Regex for Phone Numbers with a Plus

Often phones numbers are displayed with plus sign like:

  • +000-000-000

This format is matched by next regular expression:

re.findall(r"+?[d]{3}-[d]{3}-[d]{3}", text)

Note that this will catch:

  • 000-000-000
  • +000-000-000

but also:

5000-000-0004 will be extracted as 000-000-000. In the next step we will solve this problem.

Step 3: Validate Phone Numbers for Exact Match

If the the format is important and only exact matches are needed like:
000-000-000, +000-000-000 but not — 5000-000-0004 , +000-000-0004 then we need to add word boundaries to our Regex by adding at the start and the end b:

re.findall(r"+?b[d]{3}-[d]{3}-[d]{3}b", text)

Next let’s see a more generic example which covers international and country phone numbers.

Step 4: Validate International Phone Number

It’s difficult to find and test international numbers with 100% accuracy. Analysis of the data might be needed in order to check what formats are present in the text.

One possible solution for validation of international numbers is:

re.match(r"^[+(]?d+(?:[- )(]+d+)+$", phone)

Another regular expression is:

re.match(r"^[+d]?(?:[d-.s()]*)$", phone)

Step 4: Validate US, UK, French phone numbers

For example let’s start with US phone numbers:

  • (000)000-0000
  • 000-000-0000
  • (000) 000-0000

can be done with next Regex:

re.match(r"^(([0-9]{3}) ?|[0-9]{3}-)[0-9]{3}-[0-9]{4}$", phone)

UK or GB numbers like:

  • +447222000000
  • +44 7222 000 000

can be searched and validated by:

^(?:0|+?44)s?(?:ds?){9,11}$

other possible solution for UK is: ^(+44s?7d{3}|(?07d{3})?)s?d{3}s?d{3}(s?#(d{4}|d{3}))?$

The next simple Regex will work for French numbers:

^(?:(?:+|00)33|0)s*[d](?:[s.-]*d{2}){4}$

like:

  • 00 00 00 00 00
  • +33 0 00 00 00 00

Step 5: Find phone numbers in different formats

If you like to build a Regex which find various formats you can try with the next one:

[+d]?(d{2,3}[-.s]??d{2,3}[-.s]??d{4}|(d{3})s*d{3}[-.s]??d{4}|d{3}[-.s]??d{4})

The one above will cover most phone numbers but will not work for all.

If the validation is important or additional features are needed like:

  • updates for new formats/countries/regions
  • geographical information related to a phone number
  • timezone information

then we will recommend mature libraries to be used. Good example in this case is the Google’s Java and JavaScript library for parsing, formatting, and validating international phone numbers.

Conclusion

Have in mind that Regex are powerful but you may face performance issues for the complex ones. Try to use simple and understandable Regex. Sometimes you may need to play with flags in order to make it work properly:

/^[(]?0([d{9})$/mg

Another important note is about using:

  • start and end — ^ and $
  • word boundaries — b

We covered most cases of phone validation by using python and Regex.

Improve Article

Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    In this article, you will learn how you can get the information about phone number like the country name to which the phone number belongs to, or the network service provider name of that phone number just by writing a simple Python program. Python provides a module name phonenumbers for this task. This article is Python’s port of Google’s libphonenumber library.

    Installation
    Install the package phonenumbers using the below command in your command prompt.

    pip install phonenumbers

    Example 1: Python program to get the country name to which phone number belongs:

    import phonenumbers

    from phonenumbers import geocoder

    phone_number = phonenumbers.parse("Number with country code"

    print(geocoder.description_for_number(phone_number, 

                                          'en'))   

    Output:

    India

    Example 2: Python program to get the service provider name to that phone number

    import phonenumbers

    from phonenumbers import carrier

    service_provider = phonenumbers.parse("Number with country code")

    print(carrier.name_for_number(service_provider,

                                  'en')) 

    Output:

    Airtel
    

    Improve Article

    Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    In this article, you will learn how you can get the information about phone number like the country name to which the phone number belongs to, or the network service provider name of that phone number just by writing a simple Python program. Python provides a module name phonenumbers for this task. This article is Python’s port of Google’s libphonenumber library.

    Installation
    Install the package phonenumbers using the below command in your command prompt.

    pip install phonenumbers

    Example 1: Python program to get the country name to which phone number belongs:

    import phonenumbers

    from phonenumbers import geocoder

    phone_number = phonenumbers.parse("Number with country code"

    print(geocoder.description_for_number(phone_number, 

                                          'en'))   

    Output:

    India

    Example 2: Python program to get the service provider name to that phone number

    import phonenumbers

    from phonenumbers import carrier

    service_provider = phonenumbers.parse("Number with country code")

    print(carrier.name_for_number(service_provider,

                                  'en')) 

    Output:

    Airtel
    

    Это тоже интересно:

  • Номера телефонов частных инвесторов
  • Номера телефонов црб реж
  • Номера телефонов црб кондопога
  • Номера телефонов црб города красноуфимска
  • Номера телефонов црб вольск

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии