Какой лучший способ отформатировать номер телефона в Python?
Если у меня есть строка из 10 или более цифр, как я могу отформатировать это как номер телефона? Некоторые тривиальные примеры:
555-5555 555-555-5555 1-800-555-5555
Я знаю, что это не единственные способы их форматирования, и, скорее всего, я оставлю все, если я сделаю это сам. Есть ли библиотека python или стандартный способ форматирования телефонных номеров?
из какого диапазона они могут прийти? Разные страны имеют разные соглашения для форматирования телефонных номеров.
Откомандирован. Пожалуйста, не пишите код, который предполагает, что каждый номер телефона будет в формате США. Работать с такими программами действительно раздражает.
Кажется, стандартный способ записи телефонных номеров называется E.123. Таким образом, национальный номер выглядит как (800) 555 5555 , а международный номер выглядит как +1 800 555 5555 . Но не забывайте, что длина разных групп зависит от страны. en.wikipedia.org/wiki/E.123
@Thomas Томас Правильно, именно поэтому я спрашиваю, есть ли библиотека для этого. Легко делать неправильные предположения. Если формат зависит от региона, то, возможно, это должен быть аргумент или параметр в библиотеке.
Как мило с вашей стороны — надеюсь, вы когда-нибудь получите работу по управлению продуктами в Силиконовой долине. Удивительно и бесконечно разочаровывает, как много приложений и веб-сайтов предполагают, что все понимают этот кровавый запутанный формат даты в США, который почти ни одна другая страна не использует. И даже не рассказывай мне о Фаренгейтах и других странных подразделениях, которые были заброшены почти везде, еще поколения назад .
4 ответа
для библиотеки: phonenumbers (pypi, source)
Python версия общей библиотеки Google для разбора, форматирования, хранения и проверки международных телефонных номеров.
Чтение недостаточно, но я нашел, что код хорошо документирован.
Для тех, кто ищет быстрый ответ, вот пример с номером США. pip install phonenumbers затем import phonenumbers phonenumbers.format_number(phonenumbers.parse(«8006397663», ‘US’), phonenumbers.PhoneNumberFormat.NATIONAL)
Похоже, что ваши примеры, отформатированные с тремя цифрами, за исключением последнего, вы можете написать простую функцию, используя тысячу секторов и добавив последнюю цифру:
>>> def phone_format(n): . return format(int(n[:-1]), ",").replace(",", "-") + n[-1] . >>> phone_format("5555555") '555-5555' >>> phone_format("5555555") '555-5555' >>> phone_format("5555555555") '555-555-5555' >>> phone_format("18005555555") '1-800-555-5555'
Здесь один адаптирован из решения utdemir и это решение, которое будет работать с Python 2.6, «formatter является новым в Python 2.7.
def phone_format(phone_number): clean_phone_number = re.sub('[^0-9]+', '', phone_number) formatted_phone_number = re.sub("(\d)(?=(\d)+(?!\d))", r"\1-", "%d" % int(clean_phone_number[:-1])) + clean_phone_number[-1] return formatted_phone_number
Простое решение может состоять в том, чтобы начать с обратной стороны и вставить дефис после четырех чисел, а затем сделать группы по три, пока не будет достигнуто начало строки. Я не знаю о встроенной функции или что-то в этом роде.
Регулярные выражения будут полезны, если вы принимаете пользовательский ввод телефонных номеров. Я бы не использовал точный подход, который следовал по вышеуказанной ссылке. Что-то более простое, как просто удаление цифр, возможно, проще и так же хорошо.
Кроме того, вставка запятых в числа является аналогичной проблемой, которая была эффективно решена в другом месте и может быть адаптирована к этой проблеме.
Ещё вопросы
- 0 Как я могу передать свой заводской результат другому контроллеру?
- 0 Как использовать только один ВХОДНОЙ ТИП = «текст» для проведения двух опросов
- 1 используйте сокращение до групповой даты, чтобы сделать date_from и date_to
- 1 CoordinatorLayout Делает просмотры не размещенными
- 0 Возвышенный текст 3 работает локальный файл на локальном сервере с помощью плагина SideBarEnhancements?
- 1 Python — динамически изменять количество аргументов
- 1 Как выровнять два текста по горизонтали с фоном, используя любой макет в Android?
- 0 загрузка файла JavaScript соответственно
- 0 `const char * ‘to` char’
- 0 Событие FocusChanged в платформе Firebreath
- 0 динамическое создание таблиц и столбцов с использованием MySQL Python Connector
- 0 Проблема, связанная с браузером Chrome
- 0 Встроенное переполнение: скрыто, только частично работает
- 0 Замените тег другим тегом
- 0 Подсчет вхождений различных значений при возврате различных значений
- 0 Фильтровать и сортировать многомерный массив в PHP
- 1 Изящное программное отключение окон
- 1 Поиск большого массива по двум столбцам
- 0 Внешний документ JQuery IIFE готов — плохой шаблон
- 0 Проблемы с прототипированием структуры (неправильное использование неопределенного типа) c ++
- 1 Apk не устанавливается на Oreo
- 1 Получение FileNotFoundException при попытке поделиться MP3 через неявное намерение с использованием FileProvider
- 0 Выбрать все данные из второй таблицы, где имя равно значению столбца из первой таблицы
- 1 Eclipse plugin dev — Как добавить гиперссылку на FieldEditorPreferencePage
- 0 не работает
- 0 угловая ошибка выпадающего загрузчика: d.init не является функцией
- 1 Создать проект только для сервлетов в NetBeans 8 без всего, что связано с Java EE?
- 0 Альтернатива многократному использованию if-else в базе кода
- 0 добавлять теги div после определенного количества раз в javascript / jquery
- 0 Невозможно получить доступ к изолированной области директивы в тесте Жасмин
- 0 Предупреждение pthread_cond_broadcast, даже если условие никогда не выполняется
- 0 Cron Jobs на GAE с PHP
- 0 Передача идентификатора пользователя в апплет?
- 0 очистка setInterval в плагине onScreen для изменения класса в окне просмотра
- 0 Проверка Javascript перед сохранением информации
- 0 По умолчанию возвращать не прямоугольные объекты для всех маршрутов.
- 0 SQL-запрос для поиска общих элементов в списках столбцов между таблицей и указанными критериями?
- 1 Полимер 2.0 Edge Issue
- 0 только atoi возвращает первую цифру параметра char * [duplicate]
- 0 Qt QML MenuBar и меню не отображаются
- 0 ngSwitch не обновляется при изменении модели данных
- 1 Управляемые событиями веб-приложения на Java?
- 1 Как передать дополнительные аргументы объекту сервиса Google Pagespeed API
- 0 Проверка RegEx для динамически создаваемых элементов с использованием JavaScript
- 1 Как изменить статус релиза продукта на альфа / бета приложение для Android в Google Play
- 1 рекурсивный алгоритм для файловой структуры для одного типа файла
- 1 В чем разница между консолью разработчиков и отчетами о сбоях на пожарной базе?
- 0 Сохранить массив элементов SDL_Surface в классе?
- 1 Как бороться с зависимыми полями при сериализации?
- 2 Изменить размер текста на positveButtonText в диалоговом окне EditTextPreference
phonenumbers 8.13.17
Python version of Google’s common library for parsing, formatting, storing and validating international phone numbers.
Навигация
Ссылки проекта
Статистика
Метаданные
Лицензия: Apache Software License (Apache License 2.0)
Сопровождающие
Классификаторы
- Development Status
- 5 — Production/Stable
- Developers
- OSI Approved :: Apache Software License
- OS Independent
- Python :: 2
- Python :: 2.5
- Python :: 2.6
- Python :: 2.7
- Python :: 3
- Python :: 3.3
- Python :: 3.4
- Python :: 3.5
- Python :: 3.6
- Python :: 3.7
- Python :: 3.8
- Python :: 3.9
- Python :: 3.10
- Python :: 3.11
- Python :: Implementation :: CPython
- Python :: Implementation :: PyPy
- Communications :: Telephony
Описание проекта
phonenumbers Python Library
This is a Python port of Google’s libphonenumber library It supports Python 2.5-2.7 and Python 3.x (in the same codebase, with no 2to3 conversion needed).
Original Java code is Copyright (C) 2009-2015 The Libphonenumber Authors.
Installation
Example Usage
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 also need to specify the country that the phone number is being dialled from (unless the number is in E.164 format, which is globally unique).
The PhoneNumber object that parse produces typically still needs to be validated, to check whether it’s a possible number (e.g. it has the right number of digits) or a valid number (e.g. it’s in an assigned exchange).
The parse function will also fail completely (with a NumberParseException ) on inputs that cannot be uniquely parsed, or that can't possibly be phone numbers.
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.
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.
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.
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.
For more information about the other functionality available from the library, look in the unit tests or in the original libphonenumber project.
Memory Usage
The library includes a lot of metadata, potentially giving a significant memory overhead. There are two mechanisms for dealing with this.
- The normal metadata (just over 2 MiB of generated Python code) for the core functionality of the library is loaded on-demand, on a region-by-region basis (i.e. the metadata for a region is only loaded on the first time it is needed).
- Metadata for extended functionality is held in separate packages, which therefore need to be explicitly loaded separately. This affects:
- The geocoding metadata (~19 MiB), which is held in phonenumbers.geocoder and used by the geocoding functions ( geocoder.description_for_number , geocoder.description_for_valid_number or geocoder.country_name_for_number ).
- The carrier metadata (~1 MiB), which is held in phonenumbers.carrier and used by the mapping functions ( carrier.name_for_number or carrier.name_for_valid_number ).
- The timezone metadata (~100 KiB), which is held in phonenumbers.timezone and used by the timezone functions ( time_zones_for_number or time_zones_for_geographical_number ).
The phonenumberslite version of the library does not include the geocoder, carrier and timezone packages, which can be useful if you have problems installing the main phonenumbers library due to space/memory limitations.
If you need to ensure that the metadata memory use is accounted for at start of day (i.e. that a subsequent on-demand load of metadata will not cause a pause or memory exhaustion):
- Force-load the normal metadata by calling phonenumbers.PhoneMetadata.load_all() .
- Force-load the extended metadata by import ing the appropriate packages ( phonenumbers.geocoder , phonenumbers.carrier , phonenumbers.timezone ).
The phonenumberslite version of the package does not include the geocoding, carrier and timezone metadata, which can be useful if you have problems installing the main phonenumbers package due to space/memory limitations.
Static Typing
The library includes a set of type stub files to support static type checking by library users. These stub files signal the types that should be used, and may also be of use in IDEs which have integrated type checking functionalities.
These files are written for Python 3, and as such type checking the library with these stubs on Python 2.5-2.7 is unsupported.
Project Layout
- The python/ directory holds the Python code.
- The resources/ directory is a copy of the resources/ directory from libphonenumber. This is not needed to run the Python code, but is needed when upstream changes to the master metadata need to be incorporated.
- The tools/ directory holds the tools that are used to process upstream changes to the master metadata.