我是python的新手,我正在尝试编写一些代码,以确保用户输入遵循以下格式:
(整数):(整数):(信纸)
所以这是有效的:
' 3:2:H'
初学者实现这一目标的方法是什么?我在stackoverflow上读到的类似问题的许多解决方案对我来说有点太高级了。任何帮助将不胜感激!感谢
答案 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()