Как запретить пользователю вводить что-то иное, кроме цифр с пробелами?
Есть необходимость получения от пользователя строки, включающей в себя только цифры через пробел (от одной цифры до нескольких, разделенных между собой пробелами). Нужно реализовать проверку ввода. Я попытался занести данные от пользователя в список и уже в списке проверять на валидность. Вот код:
inp = input("Введите через пробел цифры: >> ")
inp_list = inp.split()
intgr = []
for x in inp_list:
try:
x = int(x)
intgr.append(x)
except ValueError:
pass
Но это что-то громоздкое. Да и итоговый список не доступен извне этого фрагмента кода, а делать его глобальной переменной не хорошо. Есть ли более изящные варианты? А на стадии ещё инпута нет возможности отсечь некорретные данные? Спасибо.
Ответы (2 шт):
Можете попробовать регулярные выражения. Тоже не коротко, но действенно.
import re
x = input("Введите через пробел цифры: >> ")
r = re.search(r'^[0-9 ]+$', x) #проверяет, состоит ли строка только из чисел и пробелов
answer = x if r else False #записывает в переменную строку из input, если она прошла проверку, иначе False
print(answer)
#Можно оформить функцией, чтобы её результат передавать глобально в другие функции
inp = input("Введите через пробел цифры: >> ")
def validator(x):
r = re.search(r'^[0-9 ]+$', x)
answer = x if r else False
return answer
print(validator(inp))
https://docs.python.org/3/howto/curses.html
Чтоб не отображался ввод:
curses.noecho()
потом пишешь свою функцию input на основе stdscr.getch()
Так не хотелось писать код, но не удержался:
import curses
import sys
def intinput():
stdscr = curses.initscr()
curses.noecho()
res = []
tmp = ''
curses.flushinp()
print(res, end='← ')
while True:
sys.stdout.flush()
c = stdscr.get_wch()
if c.isdigit():
tmp += c
print(c, end='')
elif c in [' ', '\n']:
if tmp:
res.append(int(tmp))
tmp = ''
print('\r', end='')
print(res, end='← ')
if c == '\n':
print('\n')
break
curses.echo()
curses.endwin()
return res
intinput()