Как использовать, если только для числа, когда знак минус (-) только один перед числом, которое вводит пользователь

#python

Вопрос:

Итак, я пытаюсь создать программу, в которой пользователи могут просто вводить число, но для числа минус знак минус (-) только один перед числом. Когда пользователи вводят неверный ввод, он повторяется всего до 5 раз.

Итак, я просто хочу, чтобы номер ввода пользователя был таким

-1

-12

-123

Не так, как сейчас

—1

—12

1-

1—

12-

12—

-1-

-12-

1-1

-1-1

и некоторые подобные трюки

Объяснение утверждений if:

len(nama) > 0

  1. Этого следует избегать, если пользователь вводит пустой ввод или просто нажимает Enter.

re.match("^[-0-9]*$", nama)

  1. Это делается для того, чтобы пользователи просто вводили число (0-9) и знак минус (-).

nama[1:] != "-"

  1. Это делается для того, чтобы пользователь мог просто ввести знак минус (-) перед номером.

nama[1:-1] != "-"

  1. Это делается для того, чтобы избежать ввода пользователем знака минус (-) после первого знака минус до латте.

all([len(nama) > 0, re.match("^[-0-9]*$", nama), nama[1:] != "-", nama[1:-1] != "-"])

  1. Это для того, чтобы, если все утверждения верны, перейти к следующему. Но я не был уверен, что использование И или ИЛИ для этого или кода выглядит не так хорошо.

Я пробовал это, но почему после того, как я ввел более одного знака минус (-) перед номером и сзади, все равно выводите «Бенар». Это не то, чего я хочу.

Это мой первый простой код:

 for retry_nama in range(5):
    nama = input("masukkan nama: ")
    if all([len(nama) > 0, re.match("^[-0-9]*$", nama), nama[1:] != "-", nama[1:-1] != "-"]):
        print("Benar")
        input("press ENTER to exit")
        break
    print("salah, try again.")
else:
    print("You keep making invalid name, exiting now.")
    sys.exit(1)```

 

Ответ №1:

Для такой простой проверки нет необходимости в регулярных выражениях:

 def is_int(s):
    s = str(s)
    if s[0] in ('-', ' '):
        return s[1:].isdigit()
    return s.isdigit() 

for retry_nama in range(5):
    nama = input("masukkan nama: ")
    if is_int(nama):
        print("Benar")
        input("press ENTER to exit")
        break
    print("salah, try again.")
else:
    print("You keep making invalid name, exiting now.")
 

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

1. Мы чудесно, это может решить мою проблему. Я все еще изучаю основы python вчера и все еще знаю совсем немного. Таким образом, он может использовать функцию, а не использовать re. Спасибо

2. но есть ошибка, когда я ввожу пустой ввод, возникает ошибка. Обратная связь (последний последний вызов): Файл «D:….», строка 10, в <модуле>, если is_int(nama): Файл «D:….», строка 3, в is_int, если s[0] в (‘-‘, ‘ ‘): Ошибка индекса: строковый индекс выходит за пределы диапазона

3. это легко исправить is_int , я уверен, что вы сможете это понять 🙂

Ответ №2:

Другой подход состоял бы в том, чтобы привести число int и посмотреть, что произойдет:

 sample_input = [
    "-1",
    "-12",
    "-123",
    "--1",
    "--12",
    "1-",
    "1--",
    "12-",
    "12--",
    "-1-",
    "-12-",
    "1-1",
    "-1-1",
]

for inp in sample_input:
    try:
        number = int(inp)
        print(f"Input is a valid int: {number}")
    except ValueError:
        print(f"{inp} is not a valid int.")
 

Какие отпечатки:

 Input is a valid int: -1
Input is a valid int: -12
Input is a valid int: -123
--1 is not a valid int.
--12 is not a valid int.
1- is not a valid int.
1-- is not a valid int.
12- is not a valid int.
12-- is not a valid int.
-1- is not a valid int.
-12- is not a valid int.
1-1 is not a valid int.
-1-1 is not a valid int.
 

Что решает ваши примеры.

Ваше здоровье!

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

1. Это может быть без использования образца?

2. Что ты имеешь в виду? Если вы имеете в виду пустую строку: int('') она вызывает то же исключение.

3. Я имею в виду, это может быть без использования sample_input? так что это автоматически, а не я все еще заполняю образец первым

4. Конечно, мой код проверяет все элементы sample_input , чтобы убедиться, что все возможности, о которых вы спрашивали, были учтены, но единственная важная часть находится внутри try except блока: эти 5 строк-это то, что вам нужно.