Возвращаемая строка недопустима четыре раза подряд повторения di git с использованием Regex в Python - PullRequest
0 голосов
/ 25 марта 2020

Я думаю, что я слишком близок к решению. (Нужен пу sh!)

import re

for _ in range(int(input())):
    match = re.findall(r'^([456])((\d){3}(-)?(\d){4}(-)?(\d){4}(-)?(\d){4})(?!.*\1\2){3}$', input())
    if match:
        print("Valid")
    else:
        print("Invalid")

Я объясню свое понимание регулярного выражения, которое я написал, относительно поставленной задачи.

  • Строка должна начинаться с 4 , 5 или 6 - Regex : r '^ ([456])
  • Должно содержать ровно 16 цифр и может иметь цифры в группах по 4, разделенных одним дефисом " - "

    Regex : ((\ d) {3} (-)? (\ D) {4} (-)? (\ D) {4} (-)? (\ d) {4})

  • Должен состоять только из di git 0-9

  • Не должен использовать какой-либо разделитель, такой как "_" " " et c.
  • В нем не должно быть 4 или более последовательных повторяющихся цифр - Regex : (?!. * \ 1 \ 2) {3} $

    • Действительный: 4123456789123456

    • Действительный: 5123-4567-8912-3456

    • Недействительный: 61234 -567-8912-3456 (поскольку он не образует группу из 4 {61234})

    • Действительный: 4123356789123456

    • Недействительно: 5133-3367-8912-3456

    (Проблема в том, что он принимает четыре (3333) потому что это происходит до и после дефиса) На экране вывода после выполнения эта строка также показывает действительное значение, которого не должно быть.

Если я пропускаю другой упомянутые условия в регулярном выражении, пожалуйста, поделитесь своими ответами по этому вопросу.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Наконец-то я с ответом. Спасибо всем за помощь.

import re
for _ in range(int(input())):
    s = input()
    if re.match(r"^[456]([\d]{15}|[\d]{3}(-[\d]{4}){3})$", s) and not re.search(r"([\d])\1\1\1", s.replace("-", "")):
        print("Valid")
    else:
        print("Invalid")
0 голосов
/ 25 марта 2020

Попробуйте один из них:

^(\d{4})([\-]?[0-9]{4}){3}$

Или, если вторая группа (не стартовая) должна быть 4567, попытайтесь ...

^(\d{4})[\-]?(4567)([\-\s]?[0-9]{4}){2}$
...