Я думаю, что я слишком близок к решению. (Нужен пу 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) потому что это происходит до и после дефиса) На экране вывода после выполнения эта строка также показывает действительное значение, которого не должно быть.
Если я пропускаю другой упомянутые условия в регулярном выражении, пожалуйста, поделитесь своими ответами по этому вопросу.
Заранее спасибо!