Python регулярное выражение для соответствующих телефонных номеров - PullRequest
0 голосов
/ 07 февраля 2020

Я новичок ie в Python регулярное выражение, мне нужна ваша помощь. Я использую следующее регулярное выражение для сопоставления телефонных номеров:

r'^\s*\(?([0-9]{3})[\)\-][\s]*?([0-9]{3})[-]?([0-9]{4})\s*$'

Очевидно, что оно проходит большинство случаев, но не пропускает некоторые форматы. Может кто-нибудь уточнить, что я делаю не так? Я думаю, что-то не так с форматом пробела и круглых скобок в первой части числа.

Он должен передать эти форматы

'(404) 666-1111'
'(404) 6661111'
'404-666-1111'
'404-6661111'
'404666-1111'
'4046661111'
'  (404)   666-1111  '
'(404)666-1111  '
'  404-666-1111 '
'  404-6661111 '
' 4046661111'

и fail у этих:

'+1 (404) 666-1111'
' ( 404)666-1111'
'404.666.1111'
'404 666-1111'
'404 666 1111'
'(404-666-1111'

Ответы [ 3 ]

1 голос
/ 07 февраля 2020

Основная задача - убедиться, что круглые скобки совпадают. Поскольку регулярные выражения не могут сосчитать открывающие и закрывающие элементы, обычный способ выполнить эту часть - предоставить два альтернативных шаблона: один с круглыми скобками, а другой без:

>>> bool(re.match(r'(\(\d{3}\))|\d{3}', '404'))
True
>>> bool(re.match(r'(\(\d{3}\))|\d{3}', '(404)'))
True
>>> bool(re.match(r'(\(\d{3}\))|\d{3}', '(404'))
False
0 голосов
/ 07 февраля 2020

Причина, по которой целые числа без скобок или дефиса не совпадают, заключается в том, что в начале шаблона после 3 цифр ожидается либо ), либо -

^\s*\(?([0-9]{3})[)-]
                 ^^^^   

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

 ^\s*(?:\(\d{3}\)\s*|\d{3})-?\d{3}-?\d{4}\s*$

Объяснение

  • ^ Начало строки
  • \s* Совпадение 0+ пробельных символов
  • (?: Группа без захвата
    • \(\d{3}\)\s* Совпадение 3 цифр между круглыми скобками и необязательными пробельными символами
    • | Или
    • \d{3} Матч 3 цифры
  • ) Закрыть группу
  • -?\d{3}-? Матч 3 цифры между необязательными дефисами
  • \d{4}\s* Матч 4 цифры и дополнительные пробельные символы
  • $ Конец строки

Regex demo

Примечание that \s также может соответствовать новой строке

0 голосов
/ 07 февраля 2020

что вы можете сделать, это избавиться от "" и затем выполнить регулярное выражение с "|" это означает или Обратите внимание, что этот RegEx неполный, но идея в том, что вы можете добавить больше | к этому:

import re
numbersList=['(404) 666-1111' ,'(404) 6661111', '404-666-1111', '404-6661111' ,'404666-1111', '4046661111', '  (404)   666-1111  ' ,'(404)666-1111  ' ,'  404-666-1111 ', '  404-6661111 ', ' 4046661111' ]
regExStr="^\(\d{3}\) *\d+\-*\d+|^ *\d+\-\d+|^ *\d+|^ *\(\d{3}\)\d+\-\d+"
for number in numbersList:
    tmpStr=number.replace(" ", "")
    result = re.findall(regExStr, tmpStr)
    print(result)
    print("orig: " + number)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...