регулярное выражение Python ограничить скобки одним разом - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблема в Python, когда программа должна проверить, вводит ли пользователь телефонный номер в допустимом формате, таком как: (111)-111-1111 Я заставил эту программу работать с использованием функции Python regex re.findall, однако позже японял, что программа позволяет пользователю вводить столько скобок, сколько он хочет, например: (((((111)-111-1111, и это все равно будет проходить через программу в допустимом формате.Вопрос.Есть ли способ ограничить количество скобок, чтобы формат был как (111)-111-1111?Мой код выглядит следующим образом:

import re
number=input("Please enter phone number:  " )                    
x=re.findall('([(+*)]\d{3}[(+*)][a-]\d{3}[a-]\d{4})', number)
if (x):
    print("Perfect! Your format is valid: -->  " "'"+number+"'")
else:
    print("Not a valid format, please enter as (###)-###-####")

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Вы можете использовать строку ниже:

x=re.findall('^\(\d{3}\)-\d{3}-\d{4}$', number)

Здесь также проверяются начальные и конечные символы.

0 голосов
/ 19 февраля 2019

Для проверки мобильных номеров, таких как (111)-111-1111 Я не думаю, что вам нужно слишком сложное и неправильное регулярное выражение, подобное этому ([(+*)]\d{3}[(+*)][a-]\d{3}[a-]\d{4}) Даже если вы установите начальный якорь ^ и конечный якорь $, он будет проверять следующеедействительные номера мобильных телефонов, которые будут правильными,

)111(a111a1111
*111+-111-1111

Проверьте эту демонстрацию, чтобы увидеть, как она допускает недопустимые номера мобильных телефонов

Для проверки номера мобильного телефона, подобного этому (111)-111-1111, вы можете просто использовать следующее регулярное выражение,

^\(\d{3}\)-\d{3}-\d{4}$

Демонстрация для правильной проверки мобильных номеров

Дайте мне знать, если вы хотитеразрешить любые изменения этого (111)-111-1111 номера мобильного телефона в качестве действительного.

Кроме того, для проверки текста следует использовать функцию match вместо findall, где позже используется для извлечения информации из текста и бывшегодля сопоставления текста на действительность.

Вот пример кода Python, который показывает, как вы должны проверить свои номера мобильных телефонов,

import re

arr = ['(111)-111-1111','(((((111)-111-1111',')111(a111a1111','*111+-111-1111']

for s in arr:
 if (re.match(r'^\(\d{3}\)-\d{3}-\d{4}$', s)):
  print(s, ' --> is Valid mobile number')
 else:
  print(s, ' --> is Not Valid mobile number')

Печать,

(111)-111-1111  --> is Valid mobile number
(((((111)-111-1111  --> is Not Valid mobile number
)111(a111a1111  --> is Not Valid mobile number
*111+-111-1111  --> is Not Valid mobile number
0 голосов
/ 19 февраля 2019

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

import re

number=input("Please enter phone number:  " )
x=re.match('^([(+*)]\d{3}[(+*)][a-]\d{3}[a-]\d{4})$', number)
if (x):
  print("Perfect! Your format is valid: -->  " "'"+number+"'")
else:
  print("Not a valid format, please enter as (###)-###-####")

Где вместо findall вы используете match, поскольку вы проверяете, что число соответствует шаблону (регулярное выражение) и какВы не хотите извлекать некоторую суб-информацию из него.

Также вам нужно будет добавить якоря (^, $) в ваше регулярное выражение, чтобы убедиться, что входная строка не содержит других символов в начале или в конце.

Выход:

Please enter phone number:  '(111)-111-1111'
Perfect! Your format is valid: -->  '(111)-111-1111'
Please enter phone number:  '(((((111)-111-1111'
Not a valid format, please enter as (###)-###-#
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...