шаблон регулярных выражений для украинских телефонных номеров - PullRequest
1 голос
/ 05 октября 2019

Я читаю «Автоматизируйте скучные вещи с помощью Python». Прямо сейчас я застрял в главе 7 (часть Regex). Существует шаблон для американских телефонных номеров, который я хочу реализовать для украинских телефонных номеров.

Украинские номера могут появляться в разных форматах, таких как: +380445371428, +38 (044) 5371428, +38 (044) 537 14 28, +38 (044) 537-14-28, +38 (044) 537.14.28, 044.537.14.28, 0445371428, 044-537-1428, (044) 537-1428, 044 537-1428,и т.д.

Ниже приведена моя реализация, но она не совсем верна. Что мне нужно?

  • Когда я копирую некоторые страницы веб-сайта, из всей информации, которую я скопировал, я хочу извлечь украинский номер, отображаемый в этом (044-537-1428) формате.
    phoneRegex = re.compile(r'''(
    (^\+38?)                           # area code(not necessarily)
    (\d{3}|\(\d{3}\))                  # carrier code(usually starts with 0
    (\s|-|\.)?                         # separator
    (\d{3}|\(\d{3}\))                  # first 3 digits
    (\s|-|\.)                          # separator
    (\d{4})                            # last 4 digits
    (\s*(ext|x|ext.)\s*(\d{2,5}))?     # extension
    )''', re.VERBOSE)

шаблон для американского номера (согласно книге) выглядит следующим образом

    phoneRegex = re.compile(r'''(
    (\d{3}|\(\d{3}\))? 
    (\s|-|\.)
    (\d{3})
    (\s|-|\.)
    (\d{4})
    (\s*(ext|x|ext.)\s*(\d{2,5}))?
    )''', re.VERBOSE)

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Возможно, одним из вариантов будет включение чередования на основе типов шаблонов, которые у нас могут быть, таких как:

^(?:\+38)?(?:\(044\)[ .-]?[0-9]{3}[ .-]?[0-9]{2}[ .-]?[0-9]{2}|044[ .-]?[0-9]{3}[ .-]?[0-9]{2}[ .-]?[0-9]{2}|044[0-9]{7})$

Или даже более ограниченных, чем это, если бы мы проверяли.

Демонстрация

Тест

import re

regex = r'^(?:\+38)?(?:\(044\)[ .-]?[0-9]{3}[ .-]?[0-9]{2}[ .-]?[0-9]{2}|044[ .-]?[0-9]{3}[ .-]?[0-9]{2}[ .-]?[0-9]{2}|044[0-9]{7})$'
string = '''

+380445371428
+38(044)5371428
+38(044)537 14 28
+38(044)537-14-28
+38(044) 537.14.28
044.537.14.28
0445371428
044-537-1428
(044)537-1428
044 537-1428
+83(044)537 14 28
088 537-1428

'''

print(re.findall(regex, string, re.M))

Выход

['+ 380445371428', '+38 (044)) 5371428 ',' +38 (044) 537 14 28 ',' +38 (044) 537-14-28 ',' +38 (044) 537.14.28 ',' 044.537.14.28 ',' 0445371428 ','044-537-1428 ',' (044) 537-1428 ',' 044 537-1428 ']


Если вы хотите упростить / изменить / изучить выражение, это объясненона верхней правой панели regex101.com . При желании вы также можете посмотреть в этой ссылке , как она будет сопоставляться с некоторыми примерами входных данных.


RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

0 голосов
/ 05 октября 2019

Я не знаком с Python, но я думаю, что следующее регулярное выражение решит вашу проблему

((\+38)?\(?\d{3}\)?[\s\.-]?(\d{7}|\d{3}[\s\.-]\d{2}[\s\.-]\d{2}|\d{3}-\d{4}))

вы можете проверить, работает ли он здесь

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