【问题标题】:What's the easiest way to validate a string is however many digits it needs to be and is all integers?验证字符串的最简单方法是它需要多少位数并且都是整数?
【发布时间】:2019-09-03 17:17:50
【问题描述】:

我必须验证字符串是 4 位还是 6 位。字符串不能包含任何字符,只能包含整数。如果满足条件则返回真,否则返回假。

我尝试创建一个包含可接受数字的列表并遍历字符串并进行比较。如果字符串的任何部分不在可接受的列表中,我将退出循环并返回 false。如果运行总数等于 4 或 6,那么它应该是真的。 蟒蛇代码:

def validate(n):
   count = 0
   valid_list = list(range(10))
   for digit in pin:
      if digit not in valid_list:
         return False
      count += 1

我不确定为什么像 1234 这样的东西被返回为 False。

【问题讨论】:

  • if len(string) in (4, 6) and string.isdigit():?我正在打电话,所以我无法编辑您的帖子并查看您的代码以说明为什么它不起作用
  • 大概 OP 实际上想要isdecimal() instead of isdigit()
  • 我认为您将 'n' 作为字符串传递(这就是 for digit in n: 不返回错误的原因)和 char '1' != int 1
  • 另外,请确保您发布的代码准确反映了您遇到的问题。您发布的代码有一个未定义的pin 变量(大概是validate 的参数)。
  • valid_list = "0123456789" 会更短更简单。

标签: python validation


【解决方案1】:

用正则表达式怎么样?

import re
str="03506"
pattern="[0-9]{4,6}"
prog=re.compile(pattern)
result=prog.match(str)    
if result:
    return True
else:
    return False

这匹配长度在 4 到 6 个字符之间的数字。如果您的意思是要匹配那些 4 或 6 长的字符串,您可以尝试

import re
str="03506"
pattern1="[0-9]{4}"
pattern2="[0-9]{6}"

if re.match(pattern1,str) or re.match(pattern2, str):
    return True
else:
    return False

【讨论】:

  • 没有真正需要预编译正则表达式。
  • 我几乎可以肯定 {4,6} 表示 4 到 6 次重复,而不是提问者想要的。编译一个只使用一次的正则表达式是一个非常糟糕的主意。
  • @Voo 无论你是否调用re.compile,表达式都会被编译; re 模块只维护最近使用的正则表达式的缓存,以避免每次使用它们时编译它们。
  • 单一模式[0-9]{4}([0-9]{2})? 也足够了。
  • @chepner 实际上需要是^[0-9]{4}([0-9]{2})?$,否则像“123456789”这样的字符串会匹配。 (或者,对于 python >= 3.4,可以使用 fullmatch 代替 match)。
【解决方案2】:

我不确定为什么像 1234 这样的东西被返回为 False。

Python 永远不会在整数和字符串之间进行隐式转换,并且整数和字符串之间的比较总是错误的。

"valid_list" 是一个整数列表,而"digit" 是一个字符串,所以你永远不会在你的列表中找到任何东西。

【讨论】:

  • 现在我看到了错误。谢谢。也许最简单的是:如果 len(string) in (4, 6) 和 string.isdigit() 但要纠正我的错误,只需更改 valid_list = '0123456789' 所以现在将字符串与字符串进行比较。
猜你喜欢
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2016-05-10
  • 2019-11-15
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
相关资源
最近更新 更多