Номер телефона Регулярное выражение (Regex) в Python

Погружение в python дает удивительный небольшой учебник по созданию регулярного выражения для телефонных номеров: http://diveintopython3.ep.io/regular-expressions.html#phonenumbers

Окончательная версия выглядит так:

phone_re = re.compile(r'(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$', re.VERBOSE) 

Это работает отлично для почти всех примеров, которые я могу придумать, однако я нашел довольно большой провал, который я не могу исправить.

Если группа из 3 цифр подходит к номеру телефона, она работает нормально. IE: «500 долларов, звоните 123-456-7891»

Если группа из 3 цифр появляется после номера телефона, она терпит неудачу. IE: «Позвоните 123-456-7891 для скидки до 500»,

Любые идеи по исправлению, которые будут работать для обоих примеров?

  • Регистрация пользователя в Django rest?
  • Python JSON дамп / добавляет к .txt с каждой переменной на новой строке
  • Модификация Python dict при итерации по ней
  • Почему существует ActivePython?
  • Получить список значений полей из sqlite3 Python, а не кортежей, представляющих строки
  • AttributeError: объект 'Series' не имеет атрибутов 'searchsorted' pandas
  • 2 Solutions collect form web for “Номер телефона Регулярное выражение (Regex) в Python”

    Для параметра (\d*)$ требуется, чтобы строка, которую вы сопоставляете, заканчивала символами цифр ( $ означает «конец строки»). Попробуйте удалить $ если вы согласны с большей строкой, где номер телефона может не находиться в конце строки.

    Вот ваш оригинал, с некоторыми пробелами (используйте re.VERBOSE или удалите пробелы):

     (\d{3}) \D* (\d{3}) \D* (\d{4}) \D* (\d*) 

    \D* будет соответствовать всем, что не является цифрой, включая слова. Возможно, вам стоит попробовать:

     (\d{3}) \W* (\d{3}) \W* (\d{4}) \W* (\d*) 

    \W* соответствует любому, что не является словом. Он будет соответствовать (222) - 222 - 2222 . Однако он не будет соответствовать, если между цифрами есть буква, как в (222) x 222 - 2222 . Последняя часть матча (\d*) похоже, ищет расширение. Они могут быть отформатированы различными способами – я предлагаю вам либо отказаться от него, либо уточнить его на основе того, как вы ожидаете, что ваши данные будут выглядеть. И, как говорит Амбер, вы должны, вероятно, отказаться от $ .

    Python - лучший язык программирования в мире.