- Регулярные выражения в Python
- Regex for Phone Number Find and Validation in Python
- Step 1: Find Simple Phone Number
- Step 2: Regex for Phone Numbers with a Plus
- Step 3: Validate Phone Numbers for Exact Match
- Step 4: Validate International Phone Number
- Step 4: Validate US, UK, French phone numbers
- Step 5: Find phone numbers in different formats
- Conclusion
Регулярные выражения в Python
В Python для работы с регулярными выражениями есть модуль re . Для использования его нужно импортировать. Рассмотрим простой пример поиска номера телефона:
>>> import re >>> match = re.search('\d-\d-\d', 'Мой номер 495-456-9102') >>> print('Найденный телефонный номер: ' + match.group()) Найденный телефонный номер: 495-456-9102
Если найдены совпадения, метод re.search() возвращает объект Match . Если совпадений нет — None .
Методы, которые предоставляет библиотека re :
- re.match(pattern, string, [flags=0])
- re.search(pattern, string, [flags=0])
- re.findall(pattern, string, [flags=0])
- re.split(pattern, string, [maxsplit=0], [flags=0])
- re.sub(pattern, replace, string, [count=0], [flags=0])
- re.compile(pattern, [flags=0])
Список метасимволов, которые поддерживает модуль re :
- . — Один любой символ, кроме новой строки \n
- ? — 0 или 1 вхождение шаблона слева
- + — 1 и более вхождений шаблона слева
- * — 0 и более вхождений шаблона слева
- \w — Любая цифра или буква ( \W — все, кроме буквы или цифры)
- \d — Любая цифра от 0 до 9 ( \D — все, кроме цифры)
- \s — Любой пробельный символ ( \S — любой непробельнй символ)
- \b — Граница слова
- […] — Один из символов в скобках ( [^…] — любой символ, кроме тех, что в скобках)
- \ — Экранирование специальных символов ( \. означает точку или \+ — знак «плюс»)
- ^ и $ — Начало и конец строки соответственно
- — От n до m вхождений ( — n и больше)
- a|b — Соответствует a или b
- (…) — Группирует выражение и возвращает найденный текст
- \t,\n — Символ табуляции и новой строки соответственно
Создание групп с помощью круглых скобок:
>>> match = re.search('(\d)-(\d-\d)', 'Мой номер 495-456-9102') >>> match.group() '495-456-9102' >>> match.group(0) '495-456-9102' >>> print('Код города: ' + match.group(1)) Код города: 495 >>> print('Номер телефона: ' + match.group(2)) Номер телефона: 456-9102
Если нужно извлечь сразу все группы:
>>> match = re.search('(\d)-(\d-\d)', 'Мой номер 495-456-9102') >>> match.groups() ('495', '456-9102') >>> code, number = match.groups() >>> code '495' >>> number '456-9102'
Метод re.search() находит только первое вхождение шаблона. Если нужно найти все вхождения, используйте метод re.findall() :
>>> matches = re.findall('\d-\d-\d', 'Домашний 495-456-9102 или мобильный 926-123-4567') >>> matches ['495-456-9102', '926-123-4567']
Поиск всех групп для всех совпадений шаблона:
>>> matches = re.findall('(\d)-(\d-\d)', 'Домашний 495-456-9102 или мобильный 926-123-4567') >>> matches [('495', '456-9102'), ('926', '123-4567')] >>> matches[0][0] '495' >>> matches[1][1] '123-4567'
Метод re.split() разделяет строку по заданному шаблону:
>>> re.split('\n', 'First line.\nSecond line.\nThird line.') ['First line.', 'Second line.', 'Third line.']
Метод re.sub() ищет шаблон в строке и заменяет его на указанную подстроку. Если шаблон не найден, строка остается неизменной.
>>> re.sub('RoboCop', 'Робот-полицейский', 'RoboCop is part man, part machine, all cop.') 'Робот-полицейский is part man, part machine, all cop.'
В строке замены можно использовать обратные ссылки \1 , \2 , \3 и т.д.
>>> re.sub('(\d)-(\d-\d)', 'код города \\1, номер телефона \\2', 'Мой номер: 495-456-9102') 'Мой номер: код города 495, номер телефона 456-9102'
>>> None == re.match('\d-\d-\d', '495-456-9102 Мой номер') False >>> None == re.match('\d-\d-\d', 'Мой номер 495-456-9102') True
Метод re.compite() позволяет собрать регулярное выражение в отдельный объект, который может быть использован для поиска. Это также избавляет от переписывания одного и того же выражения.
regexp = re.compile('\d-\d-\d') match = regexp.search('Мой номер 495-456-9102') print('Найденный телефонный номер: ' + match.group())
Найденный телефонный номер: 495-456-9102
Флаги компиляции регулярных выражений
- re.A или re.ASCII
- re.DEBUG
- re.I или re.IGNORECASE
- re.L или re.LOCALE
- re.M или re.MULTILINE
- re.S или re.DOTALL
- re.X или re.VERBOSE
Игнорирование регистра при поиске соответствий
>>> re.search('robocop', 'RoboCop is part man, part machine, all cop.', re.IGNORECASE).group() 'RoboCop'
Комбинации .* соответствует все, за исключением символа новой строки. С помощью re.DOTALL можно установить режим, при котором точке соответствует также символ новой строки.
>>> re.search('.*', 'First line.\nSecond line.\nThird line.').group() 'First line.' >>> re.search('.*', 'First line.\nSecond line.\nThird line.', re.DOTALL).group() 'First line.\nSecond line.\nThird line.'
Если нужно использовать несколько флагов компиляции:
>>> regexp = re.compile('foo', re.DOTALL | re.IGNORECASE)
Флаг компиляции re.VERBOSE включает многословный режим, при котором пробелы и комментарии игнорируются.
# регулярное выражение для номера телефона phoneRegex = re.compile(''' (?:\(?(\d)\)?)? # код города (?:\s|-)? # разделитель (\d) # первые три цифры (?:\s|-)? # разделитель (\d) # еще две цифры (?:\s|-)? # разделитель (\d) # еще две цифры (?:\s*доб[.а-я]*\s*(\d))? # добавочный ''', re.VERBOSE) # регулярное выражение для адреса эл.почты emailRegex = re.compile(''' [a-z0-9._-]+ # имя пользователя @ # @ [a-z0-9.-]+ # первая часть домена \.[a-z] # вторая часть домена ''', re.VERBOSE | re.IGNORECASE)
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
- 1С:Предприятие (31)
- API (29)
- Bash (43)
- CLI (99)
- CMS (139)
- CSS (50)
- Frontend (75)
- HTML (66)
- JavaScript (150)
- Laravel (72)
- Linux (146)
- MySQL (76)
- PHP (125)
- React.js (66)
- SSH (27)
- Ubuntu (68)
- Web-разработка (509)
- WordPress (73)
- Yii2 (69)
- БазаДанных (95)
- Битрикс (66)
- Блог (29)
- Верстка (43)
- ИнтернетМагаз… (84)
- КаталогТоваров (87)
- Класс (30)
- Клиент (27)
- Ключ (28)
- Команда (68)
- Компонент (60)
- Конфигурация (62)
- Корзина (32)
- ЛокальнаяСеть (28)
- Модуль (34)
- Навигация (31)
- Настройка (140)
- ПанельУправле… (29)
- Плагин (33)
- Пользователь (26)
- Практика (99)
- Сервер (74)
- Событие (27)
- Теория (105)
- Установка (66)
- Файл (47)
- Форма (58)
- Фреймворк (192)
- Функция (36)
- ШаблонСайта (68)
Regex for Phone Number Find and Validation in Python
In this tutorial, it’s shown how to find and validate phone numbers in Python using simple examples. We will review different phone number formats which are the most popular.
The best option for search and validation of data like phones numbers, zip codes, identifiers is Regular expression or Regex.
Next, we’ll see the examples to find, extract or validate phone numbers from a given text or string. The article starts with easy examples and finishes with advanced ones.
Step 1: Find Simple Phone Number
Let’s suppose that we need to validate simple phone number formats which don’t change. For example:
The goal is to find all matches for the pattern.
The mentioned solution is very basic and it’s not working for numbers like:
In order to deal with those cases the Regex should be improved.
Step 2: Regex for Phone Numbers with a Plus
Often phones numbers are displayed with plus sign like:
This format is matched by next regular expression:
Note that this will catch:
5000-000-0004 will be extracted as 000-000-000. In the next step we will solve this problem.
Step 3: Validate Phone Numbers for Exact Match
If the the format is important and only exact matches are needed like:
000-000-000 , +000-000-000 but not — 5000-000-0004 , +000-000-0004 then we need to add word boundaries to our Regex by adding at the start and the end \b :
Next let’s see a more generic example which covers international and country phone numbers.
Step 4: Validate International Phone Number
It’s difficult to find and test international numbers with 100% accuracy. Analysis of the data might be needed in order to check what formats are present in the text.
One possible solution for validation of international numbers is:
Another regular expression is:
Step 4: Validate US, UK, French phone numbers
For example let’s start with US phone numbers:
can be done with next Regex:
UK or GB numbers like:
can be searched and validated by:
The next simple Regex will work for French numbers:
Step 5: Find phone numbers in different formats
If you like to build a Regex which find various formats you can try with the next one:
The one above will cover most phone numbers but will not work for all.
If the validation is important or additional features are needed like:
- updates for new formats/countries/regions
- geographical information related to a phone number
- timezone information
then we will recommend mature libraries to be used. Good example in this case is the Google’s Java and JavaScript library for parsing, formatting, and validating international phone numbers.
Conclusion
Have in mind that Regex are powerful but you may face performance issues for the complex ones. Try to use simple and understandable Regex. Sometimes you may need to play with flags in order to make it work properly:
Another important note is about using:
We covered most cases of phone validation by using python and Regex.
By using SoftHints — Python, Linux, Pandas , you agree to our Cookie Policy.