Код Python для приема разных форматов телефонных номеров в США? - PullRequest
0 голосов
/ 13 ноября 2009

Я читаю множество введенных пользователем данных, которые представляют номера телефонов из файлов. Они все слегка введены по-разному:

5555555555
555-555-5555
555-555/5555
1555-555-5555
etc...

Как я могу легко разобрать все эти телефонные номера в Python и создать канонический вывод, такой как: 555-555-5555

Ответы [ 6 ]

9 голосов
/ 13 ноября 2009

В Dive into Python есть раздел о разборе телефонных номеров

http://www.diveintopython.org/regular_expressions/phone_numbers.html

6 голосов
/ 13 ноября 2009

Я не американец, но это работает с русскими номерами телефонов ... может быть, это касается и американских?

  1. Отменить все нечисловые символы
  2. Подтвердить количество оставшихся номеров
  3. Вставить несколько штрихов в соответствующих местах
3 голосов
/ 13 ноября 2009

берите только числа с регулярным выражением. затем выясните, добавили ли они 1 (НЕТ кода города начинается с 1). если он есть, удалите его, отформатируйте 10 цифр так, как вы хотите.

import re
pnumber = re.sub("[^0-9]", "", input_number)
if pnumber[0] == 1:
    pnumber = pnumber[1:]#strip 1st char if it's a 1

#insert the dashes
if len(pnumber) == 10:
    pnumber = "%s-%s-%s" % (pnumber[:3],pnumber[3:6],pnumber[6:])
else:
    #throw error
2 голосов
/ 13 ноября 2009

После небольшой подготовки с помощью string.maketrans метод строк translate обеспечивает очень быструю и простую операцию. Я даю код Python 2 для простых строк (строки Python 3 и Unicode в Python 2 немного отличаются - спросите, нужно ли вам это):

Подготовка (сделать раз и навсегда, например, во время загрузки модуля):

>>> import string
>>> allchars = string.maketrans('', '')
>>> nondigits = allchars.translate(allchars, string.digits)

Выполнение (превратить любую подходящую строку в число, отформатированное в свойстве):

>>> x='1555-555-5555'
>>> y=(x.translate(allchars, nondigits)).lstrip('1')
>>> assert len(y) == 10
>>> '%s-%s-%s' % (y[:3], y[3:6], y[6:])
'555-555-5555

Конечно, вам нужно решить, что делать, если len(y) делает не равным 10 (просто вызовите исключение, как я делаю здесь, или что еще). Но это также необходимо для любой другой формы обработки (регулярное выражение или что-то еще). Подход translate действительно очень быстрый и простой! -)

0 голосов
/ 13 ноября 2009

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

Пример:

, чтобы соответствовать

xxx-xxx-xxxx   -> \d{3}-\d{3}-\d{4}
(xxx) xxx-xxxx -> \(\d{3}\) \d{3}-\d{4}
1-xxx-xxx-xxx  -> 1-\d{3}-\d{3}-\d{4}

При этом игнорируются правила, ограничивающие префикс и код города (в США не разрешается использование кодов регионов или префиксов с 0 или 1). Вы могли бы попытаться быть очень умным и создать одно регулярное выражение, которое соответствует всем, но в итоге вы получите беспорядочный беспорядок, который невозможно изменить, вместо этого вам следует ИЛИ шаблоны вместе, чтобы их было легче модифицировать в будущем.

основная идея:

pattern = re.compile(r'\d{3}-\d{3}-\d{4}|\(\d{3}\) \d{3}-\d{4}|1-\d{3}-\d{3}-\d{4}')

с добавленной группировкой для канонического вывода

pattern = re.compile(r'(\d{3})-(\d{3})-(\d{4})|\((\d{3})\) (\d{3})-(\d{4})|1-(\d{3})-(\d{3})-(\d{4})')

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

0 голосов
/ 13 ноября 2009
def extractNumber(s):
    """take a string phone number and extract it to the legal string"""

    target = ""
    for char in s:
        try:
            target += int(s)
        except ValueError:
            target += '-'

    return target
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...