re.match не работает, как я ожидаю в python3 - PullRequest
1 голос
/ 14 апреля 2020

Ссылка на проблему: https://www.hackerrank.com/challenges/validating-credit-card-number/problem

Regexp работает нормально в онлайн-тестере регулярных выражений, но не работает, когда я использую re.match () из python. Для следующего условия это регулярное выражение не работает: В нем НЕ должно быть 4 или более последовательных повторяющихся цифр.

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

Например: - 5133-3367-8912-3456 В этом случае он дает «Нет совпадений» в онлайн-тестере регулярных выражений. Но в случае python3 с re.match возвращается объект сопоставления re.Match object; span = (0, 19), match = '5133-3367-8912-3456'

Так что для этого теста вышеупомянутой проблемы с хакерранком это печать «Действительный» вместо «Недействительный».

1 Ответ

2 голосов
/ 14 апреля 2020

Как сказал @snakecharmerb, некоторые обратные слеши интерпретируются в двойных кавычках.

import re
a = r"^(?!.*(\d)(-?\1){3})[456]{1}\d{3}[-]?\d{4}[-]?\d{4}[-]?\d{4}$"
b = "^(?!.*(\d)(-?\1){3})[456]{1}\d{3}[-]?\d{4}[-]?\d{4}[-]?\d{4}$"
print(a)
print(b)

test_case = "5133-3367-8912-3456"
print('Valid' if re.match(a,test_case) is not None else "Invalid")
print('Valid' if re.match(b,test_case) is not None else "Invalid")

output

^(?!.*(\d)(-?\1){3})[456]{1}\d{3}[-]?\d{4}[-]?\d{4}[-]?\d{4}$
^(?!.*(\d)(-?){3})[456]{1}\d{3}[-]?\d{4}[-]?\d{4}[-]?\d{4}$
Invalid
Valid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...