Номер телефона Регулярное выражение (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»,

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

  • Сплит с одиночным двоеточием, но не двойной двоеточие с использованием регулярного выражения
  • Языковая граница слов Python с неожиданными результатами
  • Регулярное выражение для удаления разрывов строк
  • Регулярное выражение, соответствующее многострочному блоку текста
  • Regex для цен с фунтами и долларами евро
  • Python Regex работает не так, как ожидалось
  • pandas находит строки среди рядов и возвращают ключевые слова
  • Python - анализировать IPv4-адреса из строки (даже при цензуре)
  • 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*) похоже, ищет расширение. Они могут быть отформатированы различными способами – я предлагаю вам либо отказаться от него, либо уточнить его на основе того, как вы ожидаете, что ваши данные будут выглядеть. И, как говорит Амбер, вы должны, вероятно, отказаться от $ .

    Interesting Posts

    конвертировать список кортежей в структурированный массив numpy

    Как добавить путь к PYTHONPATH в virtualenv

    Повторное совпадение совпадений с регулярным выражением

    Проблемы с 2D-интерполяцией в Scipy

    matplotlib (mplot3d) – как увеличить размер оси (растянуть) в 3D-плане?

    Общая папка / структура файла в приложении Flask

    Отправка запроса TLS 1.2 в Python 2.6

    Условный вывод в документации Sphinx

    (все еще) не может правильно установить lxml 2.3 для python, но по крайней мере 2.2.8 работает

    Улучшение скорости на больших пандах read_csv с индексом datetime

    Пошаговое объяснение этого кода

    Matplotlib: добавьте строки как пользовательские x-тики, но также сохраните существующие (числовые) метки метки? Альтернативы matplotlib.pyplot.annotate?

    Запуск сценария Python из приложения Cocoa с использованием GCD

    Как сделать Python split () на языках (например, китайском), которые не используют пробелы в качестве разделителя слов?

    pyinstaller, spec file, ImportError: Нет модуля с именем 'blah'

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