python密码规则验证

标签 python

我正在练习一些 Python,但我无法理解为什么这段代码不能接受 - 函数接受一个字符串,如果它的长度至少为 10 个字符,至少有 1 个数字、1 个小写字母和 1 个大写字母信,它应该返回真。此外,必须有一种比我对所有这些嵌套条件语句所做的更简洁的方式来编写它。谢谢大家!

import string
alphalower = string.ascii_lowercase
alphaupper = string.ascii_uppercase
digs = string.digits

def checkio(data):
    if len(data) >= 10:
        if data.count(digs) >= 1:
            if data.count(alphaupper) >= 1:
                if data.count(alphalower) >= 1:
                    return True
    else:
        return False

最佳答案

以下应该有效,并删除不必要的导入:

def checkio(data):
    return len(data) >= 10 and any(char.isdigit() for char in data) and any(char.islower() for char in data) and any(char.isupper() for char in data)

默认情况下,您可以遍历字符串,并且每个字符串都有 isdigit、islower 等...您可以使用的方法。 any() 方法在传递给它的 iterable 返回的任何值为真时返回 True,并且 something(value) for value in iterable 语法创建一个生成器表达式,它遍历字符串的每个字符并检查它是否是数字/小写/大写字符。

基于 this answer


基准测试时间,使用我可怕的基准测试代码(但它似乎可以完成工作):

from time import time
import re

data = "ULFFunH8ni" # the password

def benchmark(method): # benchmark method, loops 1000000 times and prints how much it took
    start = time()
    for _ in range(1000000): method(data)
    print(time() - start)

def checkio_kasra(data): # Kasra's answer
    return len(data) >= 10 and all([any(i.isdigit() for i in data),any(i.islower() for i in data),any(i.isupper() for i in data)])

def checkio_andreysabitov(data): # Andrey Sabitov's regex-based answer
    if len(data) < 10:
        return False

    digital = re.compile('[0-9]+')
    capital = re.compile('[A-Z]+')
    lower = re.compile('[a-z]+')

    return (digital.search(data) is not None) and (capital.search(data) is not None)  and (lower.search(data) is not None)

def checkio_andredaniel(data): # My answer
    return len(data) >= 10 and any(char.isdigit() for char in data) and any(char.islower() for char in data) and any(char.isupper() for char in data)

def checkio_shashank_bitmask(data):
    if len(data) < 10: return False
    lud_bitmask = 0
    for ch in data:
        if ch.islower():
            lud_bitmask |= 4
            if lud_bitmask == 7: return True
        elif ch.isupper():
            lud_bitmask |= 2
            if lud_bitmask == 7: return True
        elif ch.isdigit():
            lud_bitmask |= 1
            if lud_bitmask == 7: return True
    return False

def checkio_shashank_pure_regex(data):
    return bool(re.match(r'(?=.*?[0-9])(?=.*?[A-Z])(?=.*?[a-z]).{10}', data))

def checkio_shashank_impure_regex(data):
    return len(data) >= 10 and re.match(r'(?=.*?[0-9])(?=.*?[A-Z])(?=.*?[a-z])', data)

benchmark(checkio_kasra)
benchmark(checkio_andreysabitov)
benchmark(checkio_andredaniel)
benchmark(checkio_shashank_bitmask)
benchmark(checkio_shashank_pure_regex)
benchmark(checkio_shashank_impure_regex)

结果,在我运行 Windows 7 和 Python 3.4.x 的低端平板电脑上(运行两次以确保):

$ python pass.py
6.333611011505127 # Shashank
9.625216960906982 # Kasra
11.450419902801514 # Andrey Sabitov
8.36161494255066 # Me

但是,给定 1XYZXYZXYZ 的半错误输入(长度和数字都很好,但都是大写),一些解决方案无法提前停止:

7.456813097000122 # Shashank
9.328815937042236 # Kasra
11.169620037078857 # Andrey Sabitov
6.349210977554321 # Me

请注意,这些基准测试并未考虑最终的修改。我建议您使用最新的答案在您自己的机器上运行基准测试。随时用新结果更新这篇文章。

关于python密码规则验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29856568/

相关文章:

计算中间表达式时,Python 嵌套循环速度比较意外变慢

python - 乒乓模拟未正确触发功能

python - 我可以在 AssertionError 上强制调试 python 吗?

python - SQLAlchemy 如何使用 timezone=UTC 加载日期(没有时区存储的日期)

python - 在python中使用正则表达式提取科学记数法数字

Python:如何处理 urllib2 中服务器抛出的异常?

python - 如何在 Python 中使用变量名创建 mysql 表?

python - 将 JSONL 文件转换为 CSV - "JSONDecodeError: Extra data"

python - 绑定(bind)错误的上下文时,mxnet 不会抛出任何错误

python - 从什么时候开始在 Python 中存在 bytes() 函数?