Как заставить это регулярное выражение python работать правильно

#python #regex

Вопрос:

Мне нужно проверить число с помощью регулярного выражения Python, но это не работает.

Приведенный ниже код представляет собой библиотеку, которая используется другим файлом. На данный момент я только пытаюсь сделать так, чтобы входные данные были единственными числами между 13 и 19 цифрами. Диапазон работает просто отлично, но когда я вставляю букву во входные данные, она печатает ее, вместо того, чтобы выводить «Недопустимую» строку:

 """
Credit card number validation and provider check
"""
import re

def card_range(cardNumber):
    """
    Checks the credit card number length
    """
    if len(cardNumber) < 13:
        return "Invalid"
    if len(cardNumber) >  19:
        return "Invalid" 
    
    pattern = re.compile("[0-9] ")
    if not pattern.match(cardNumber):
        return "Invalid"
    return cardNumber
 

Ответ №1:

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

 def card_range(cardNumber):
    return re.search(r'^[0-9]{13,19}

Кстати, регулярные выражения для основных поставщиков кредитных карт легко доступны, например, здесь.


Комментарии:

1. @vitoruggo Спасибо и добро пожаловать в Stack Overflow. Если этот ответ решил вашу проблему, пожалуйста, подумайте о том, чтобы принять его, нажав на зеленую галочку слева.

Ответ №2:

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

 
def card_range(cardNumber):
    """
    Checks the credit card number length
    """
    if not cardNumber.isnumeric():
        return 'Invalid! I need only NUMBERZ!'

    if not 13 <= len(cardNumber) <= 19:
        return "Invalid! The length check FAILED!"

    return True

# Invalid! The length check FAILED!
print(card_range('1234567'))

# Invalid! I need only NUMBERZ!
print(card_range('a'))

# True
print(card_range('112233445566778899'))

# Invalid! I need only NUMBERZ!
print(card_range('1122334455x6778899'))
 

Комментарии:

1. Зачем импортировать re , если вы им не пользуетесь?

2. это яркий пример copypasta .. мой плохой там

3. Я просто хочу использовать регулярное выражение, потому что это проект колледжа, и профессор ожидает, что мы будем его использовать. Я спрошу ее, можно ли использовать что-то более "продвинутое". Спасибо за подсказку!

4. ах, не беспокойтесь. В этом случае решение регулярных выражений должно быть идеальным для данного случая использования.

, cardNumber)
Кстати, регулярные выражения для основных поставщиков кредитных карт легко доступны, например, здесь.

Комментарии:

1. @vitoruggo Спасибо и добро пожаловать в Stack Overflow. Если этот ответ решил вашу проблему, пожалуйста, подумайте о том, чтобы принять его, нажав на зеленую галочку слева.

Ответ №2:

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


Комментарии:

1. Зачем импортировать re , если вы им не пользуетесь?

2. это яркий пример copypasta .. мой плохой там

3. Я просто хочу использовать регулярное выражение, потому что это проект колледжа, и профессор ожидает, что мы будем его использовать. Я спрошу ее, можно ли использовать что-то более «продвинутое». Спасибо за подсказку!

4. ах, не беспокойтесь. В этом случае решение регулярных выражений должно быть идеальным для данного случая использования.