【问题标题】:(Python 2.7) Data validation using try not working as expected(Python 2.7)使用 try 的数据验证未按预期工作
【发布时间】:2015-12-25 11:48:33
【问题描述】:

我要求用户使用 raw_input 输入格式为“AB12 XYZ”的字符串。下面的代码应该通过检查我是否可以在我希望能够使用的地方使用 str 和 int 来验证字符串是否遵循这种格式 - 我知道,这不是一个优雅的解决方案,但我唯一可以目前想到的。如果输入不符合预期的模式,“非标准”应该返回为真。然而,目前,非标准总是返回为真。我怀疑这可能与我对 str 的使用有关,但我不确定到底是什么。

来源:

try:
    for x in range(0,1):
        str(Tnumberplate[x])
    global nonstandard
    nonstandard = "true"
except TypeError:
    pass
try:
    for x in range(4,6):
        str(Tnumberplate[x])
    nonstandard = "true"
except TypeError:
    pass

【问题讨论】:

  • 你最好使用TrueFalse而不是字符串。
  • 另外你为什么认为str(<anything>) 会抛出一个TypeError ?除非您手动编写了一个从 __str__() 函数抛出 TypeError 的类,否则不应该这样做。
  • @ForceBru 这可能是真的,但我实际上不知道如何 - 正如你可能知道的那样,我对 python 的了解非常有限。
  • 你为什么不使用正则表达式??? re.match(r"^[A-Z]{2}[0-9]{2} [A-Z]{3}$", "AB12 XYZ")
  • @brunodesthuilliers 如果你能解释每个部分的具体作用,我会使用它。但是,我不喜欢在我的程序中使用我不理解的代码,所以现在可能不是:)

标签: python validation


【解决方案1】:

我要指出的第一件事是数字可以转换为有效字符串,因此对数字调用str() 会成功。

您可以使用isdigit() 方法:

>>> numberplate = 'AB12 XYZ'
>>> for character in numberplate:
...     print(character.isdigit())
... 
False
False
True
True
False
False
False
False

如果你把它存储在一个列表中,你可以简化测试:

expected = [False, False, True, True, False, False, False, False]
results = [character.isdigit() for character in numberplate]
if results == expected:
    # the digits are where we expect...
    pass 

【讨论】:

  • 非常感谢!这是我从未遇到过的有用代码——应该立即解决我的问题。是的,使用 str 对我来说很愚蠢。我有点飘忽不定:D
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 2013-07-26
  • 2013-01-21
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多