繁体   English   中英

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

[英]Function to validate pin code, why doesn't this code work?

所以我一直在尝试自学如何做这些事情,到目前为止取得了微不足道的成功,我正在做一个我在 codewars.com 上找到的练习,但我有点卡住了。 目标是制作一个功能来验证输入的引脚是否满足要求,这些要求是: PIN 必须是 4 或 6 位数字,PIN 必须是严格的数字

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

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 天。 我更新了 for 循环,阅读了正则表达式,我尝试搜索论坛,但完全不知道要寻找什么。 任何人都可以提供的任何帮助将不胜感激。

编辑:哇! 我没想到会有如此积极的反馈,我很感激大家! 感谢您帮助我了解我已经看到了我出错的地方,并将更加努力地研究它。 感谢所有反馈!

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

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

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

这仅适用于 Python 3.4 及更高版本,因为fullmatch函数是在 3.4 中添加的
如果您使用的是早期版本,请改用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

由于您的

PIN 必须是严格的数字

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

def validate_pin(pin):
    return len(pin) in (4, 6) and all(p in '0123456789' for p in pin)

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

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

我认为我们可以在不导入的情况下对其进行排序,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM