регулярные выражения являются общим ответом, но для этого конкретного случая вы могли бы написать:
def validate(in_):
try:
a, b, c = in_.split(":")
_, _ = int(a), int(b)
except Exception:
return False
else:
return True
По существу: сделайте кучу вещей, которые будут выдавать исключения, если пользовательский ввод неправильный, обернуть его в try
и перехватить любое исключение с return False
. Если не выдано никаких исключений, то это должно быть действительно так return True
.
Обратите внимание, что это подтверждает ввод, как:
654412: 89777056444.12: все письменные произведения Шекспира
но если вы ограничиваете это только одним символом, вы можете сделать:
def validate(in_):
try:
a, b, c = in_.split(":")
for v in [a, b, c]:
assert len(v) == 1
# etc as before
Общее решение, как я уже упоминал выше, это регулярные выражения.
import re
def validate(in_):
pattern = r"\d:\d:[a-zA-Z]"
m = re.match(pattern, in_)
return (m is not None)
Шаблон здесь:
pattern = re.compile(r'''
\d # a digit character (0-9)
: # a literal colon
\d # another digit (0-9)
: # another literal colon
[a-zA-Z] # one character from the character class
# containing all letters a-z and A-Z''', re.X)
Мы пытаемся сопоставить с этим шаблоном и просто возвращаем, было ли совпадение успешным (неудачное совпадение оставляет m = None
, в то время как успешное совпадение возвращает объект сопоставления, который нам на самом деле не нужен, поэтому мы можем безопасно бросить его прочь. Это может быть эквивалентно написано return bool(m)
, но это менее явно о том, что m
может быть!)