Регулярное выражение номера телефона (регулярное выражение) в Python - PullRequest
2 голосов
/ 14 августа 2010

Dive into 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"

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

Ответы [ 2 ]

1 голос
/ 14 августа 2010

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

0 голосов
/ 14 августа 2010

Вот ваш оригинал с некоторыми пробелами (используйте 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*), кажется, ищет расширение.Они могут быть отформатированы различными способами - я предлагаю вам либо отбросить их, либо уточнить, исходя из того, как вы ожидаете, что ваши данные будут выглядеть.И, как говорит Эмбер, вы, вероятно, должны сбросить $.

...