【问题标题】:How do you use: isalnum, isdigit, isupper to test each character of a string? [closed]你如何使用:isalnum、isdigit、isupper 来测试字符串的每个字符? [关闭]
【发布时间】:2014-01-02 03:40:21
【问题描述】:

我正在尝试制作一个密码强度模拟器,它要求用户输入密码,然后返回分数。

我正在使用:

islanum() 
isdigit()
isupper() 

试试看输入的密码有多好。

我希望它不是返回布尔值,而是评估密码的每个字符,然后程序将所有“真”值相加并将其转换为分数。示例代码:

def upper_case():
    points = int(0)
    limit = 3
    for each in pword:
        if each.isupper():
            points = points + 1
            return points
        else:
            return 0

任何帮助将不胜感激!谢谢!!

【问题讨论】:

  • 您是否有任何示例代码可以显示您从哪里开始或到目前为止您已经尝试过什么?
  • 你几乎有这个权利。您只需要计算一个分数,然后在迭代后返回(不在内部)。
  • 也不需要points = int(0)points = 0 很好。
  • 我对密码强度理论的了解并不惊人,但如果你所有的字母都是大写的,那肯定和全部小写一样弱?您的代码背后的想法是给大写字符加分,但我认为您最好混合使用。例如,“password”和“PASSWORD”同样弱,但“PAsSWorD”更强(或至少与带有单词“password”的密码一样强:P)
  • 您可能希望将upper_case() 重命名为get_score() 并使用一些if/elif 分支来根据您看到的字符计算适当的分数。

标签: python function passwords return


【解决方案1】:

.isalnum().isupper().isdigit() 和朋友是 Python 中 str 类型的方法,调用方式如下:

>>> s = "aBc123"
>>> s[0].isalnum()
True
>>> s[1].isupper()
True
>>> s[3].isdigit()
True

简单getscore()功能:

s = "aBc123@!xY"

def getscore(s):
    score = 0
    for c in s:
        if c.isupper():
            score += 2
        elif c.isdigit():
            score += 2
        elif c.isalpha():
            score += 1
        else:
            score += 3
    return score

print getscore(s)

输出:

13

更好的版本:

s = "aBc123@!xY"


def getscore(s):
    return len(s) + len([c for c in s if c.isdigit() or c.isupper() or not c.isalpha()])

print getscore(s)

输出:

17

【讨论】:

  • 已更新,为非字母/数字/大写字母(即:标点符号、空格等)提供更高的分数。
  • 那里有很奇怪的评分功能。我见过的大多数作品都是基于长度和多样性的。包含大写、数字和符号的 10 个字符的密码得分高于所有符号的 10 个字符的密码。无论如何,这会使更多异国情调的角色得分更高。
  • 这可能很奇怪,但它与 OP 一开始试图做的事情相匹配 :) 我同意,只是数一下。大写/数字/标点字符 - 完成。
【解决方案2】:

你可以使用类似的东西

password = "SomePa$$wordYouWantToTest"
score = len([char for char in password if str(char).isupper() or str(char).isdigit() or not str(char).isalnum()])

这将计算password 中的所有大写字符、所有数字和所有非字母数字字符,并给出一个整数

测试输出:

>>>score
8

【讨论】:

  • 我喜欢这种方法,简洁明了 :) 利用 list comprehensions :)
  • 你在那里写的奇怪的分数函数。这只是计算不是小写字母的字符数; BLASTHARDCHEESE 得分很高,但 blasthardcheese 得分为 0。
  • 确定,因为它没有任何给定的要求。我不会这样做的。我什至不会检查密码。 123 之类的密码也是有效密码。但它确实做到了问题所要求的
  • 为什么每个密码都有效?因为您只能记住几个非常强大的密码。因此,在您必须注册但不想注册的每个页面上使用“非”强密码(如 123456 或类似密码)是有效的...
【解决方案3】:

使用正则表达式的另一种解决方法:

#!/usr/bin/python
import re
def password_strength(p):
    score = 0
    if re.search('\d+',p):
        score = score + 1
    if re.search('[a-z]',p) and re.search('[A-Z]',p):
        score = score + 1
    if re.search('[$#@!]', p):
        score = score + 1
    return score

print password_strength('Jac@kpasswor01')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2016-04-28
    • 2011-03-18
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多