确保用户输入在python中使用特定格式确认的最佳方法?

时间:2018-05-08 02:29:00

标签: python user-input

我是python的新手,我正在尝试编写一些代码,以确保用户输入遵循以下格式:

(整数):(整数):(信纸)

所以这是有效的:

' 3:2:H'

初学者实现这一目标的方法是什么?我在stackoverflow上读到的类似问题的许多解决方案对我来说有点太高级了。任何帮助将不胜感激!感谢

2 个答案:

答案 0 :(得分:0)

正则表达式是一般答案,但对于此特定实例,您可以编写:

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可能是什么不太明确!)

答案 1 :(得分:0)

我建议使用 argparse 包来获取输入。这是包裹链接argparse

以下是使用 argparse 和Python的 regex 模块编写的示例代码。我使用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()