验证密码的功能,为什么这段代码不起作用?

时间:2016-06-16 08:29:53

标签: python

所以我一直在努力教自己如何做到这一点并且到目前为止取得了微不足道的成功,我正在我在codewars.com上发现的一项练习,我有点卡住了。目标是制作一个功能,验证输入的引脚是否符合要求,这些要求是: 密码长度必须为4或6位,密码必须严格为数字

我遇到了很多问题,最终来到了下面的代码:

import re
def validate_pin(pin):
    for x in pin:
        if x.isalpha():
            return False
        elif re.match(".", pin):
            return False
    if len(pin) == 4 or len(pin) == 6:
        return True
    else:
        return False

我真的,真的,真的,不想寻求帮助,但我绝对不知道为什么上面的代码不起作用。它在" 1234"上返回false作为输入,我现在已经在这2天了。我刷新了自己的循环,阅读正则表达式,我尝试搜索论坛,但我完全难以找到要寻找的东西。任何人都可以提供的任何帮助都将受到极大的赞赏。

编辑:哇!我并不期待这样的积极反馈我很感激大家!感谢您帮助我了解我已经看到我出错的地方并且会更加努力地学习。感谢您的所有反馈!

4 个答案:

答案 0 :(得分:2)

如果您从代码中看到允许使用正则表达式,为什么不使用此正则表达式^(\d{4}|\d{6})$

import re
p = re.compile(ur'^(\d{4}|\d{6})$')
return re.match(p, pin)

答案 1 :(得分:2)

自你的

  

PIN必须严格按照数字

这不应该构成需要正则表达式的东西:

Integer arrays[]={4,3,8,9,0,44,12};

答案 2 :(得分:1)

使用正则表达式验证它有一种更简单的方法。你在"1234"返回False的原因是因为正则表达式匹配。点(.)匹配除换行符之外的所有字符,因此匹配几乎总是成功。那不是你想要的。

这是我之前谈到的一个更简单的解决方案:

import re
def validate_pin(pin):
    if re.fullmatch("\d{4}|\d{6}", pin):
        return True
    else:
        return False

这只适用于Python 3.4及更高版本,因为在{3}中增加了fullmatch功能 如果您使用的是早期版本,请使用re.match("\d{4}$|\d{6}$", pin)代替

一些正则表达式的解释:
此字符"\d"仅匹配数字。其后面的花括号中的数字显示了我们想要匹配的前一个令牌(在我们的例子中是"\d")的确切数量。这个"|"就像一个OR,告诉我们可以匹配4位或6位数 如果整个字符串与模式匹配,fullmatch将仅返回匹配对象。但由于我们在早期版本中没有该功能,因此可以通过在模式末尾添加"$"来模拟此行为。它表明我们希望此模式仅匹配字符串的结尾,match函数仅匹配来自开头的字符。因此,结合这些属性,我们得到的模式只匹配整个字符串

正如评论中所建议的,为了缩短代码,您可以像这样编写条件:

def validate_pin(pin):
    return bool(re.fullmatch("\d{4}|\d{6}", pin))

如果匹配成功,显式转换为bool将返回True,如果没有 - 它将返回False

答案 3 :(得分:0)

我认为我们可以不导入而对其进行排序,就像这样:

def validate_pin(pin):
    return len(pin) in (4, 6) and pin.isdigit()