Лучший способ убедиться, что пользовательский ввод подтверждается с определенным форматом в Python? - PullRequest
0 голосов
/ 08 мая 2018

Я новичок в Python и пытаюсь написать код, который гарантирует, что пользовательский ввод соответствует следующему формату:

(Integer) :( Integer) :( Письмо)

Так что это будет действительно:

3: 2: Н '

Каков подход для достижения этого для начинающих? Многие решения аналогичных проблем, которые я читал в stackoverflow, слишком сложны для меня. Любая помощь будет принята с благодарностью! Спасибо

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Я предлагаю использовать пакет argparse для получения входных данных. Вот ссылка на пакет argparse .

Ниже приведен пример кода, который я написал с использованием argparse и regex модуля Python. Я использовал Python3 для запуска скрипта.

import argparse
import re

class SampleClass:

    def main(self):
        script_description = 'Sample Description for Script'
        parser = argparse.ArgumentParser(description=script_description)

        input_one_help = 'Input has format int:int:letter'
        parser.add_argument('input_one',
                            help=input_one_help,
                            type=self._input_one_pattern,
                            metavar='input_one'
                           )

        args = parser.parse_args()
        print(args.input_one)

    @staticmethod
    def _input_one_pattern(input_one):
        try:
            return re.match(r'\d:\d:[a-zA-Z]', input_one).group(0)
        except Exception as error:
            print(error)
            raise argparse.ArgumentTypeError('String {}'.format(input_one) + 
                                             'does not match required format.')


if __name__ == '__main__':
    SampleClass().main()
0 голосов
/ 08 мая 2018

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

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 может быть!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...