0

我的问题是设计一个 Python 脚本,要求用户输入密码,并让 Python 验证密码是否适合条件。

以下是用户输入密码的条件:

  1. 以字母开头
  2. 至少 6 个字符
  3. 密码中只允许使用字母、数字和 - 和 _

如果条件匹配,则输出 Yes。否则,不。

这些是我尝试过的:

from sys import exit

def check_alpha(input):
   alphas = 0
   alpha_list = "A B C D E F G H I J K L M N I O P Q R S T U V W X Y Z".split()
   for char in input:
    if char in alpha_list:
        alphas += 1
if alphas > 0:
    return True
else:
    return False

def check_number(input):
numbers = 0
number_list = "1 2 3 4 5 6 7 8 9 0".split()
for char in input:
    if char in number_list:
        numbers += 1
    if numbers > 0:
        return True
    else:
        return False

def check_special(input):
specials = 0
special_list = "_-"
for char in input:
    if char in special_list:
        specials += 1
    if specials > 0:
        return True
    else:
        return False

def check_len(input):
    if len(input) >= 6:
        return True
    else:
        return False

def validate_password(input):
check_dict ={
    'alpha':check_alpha(input),
    'number':check_number(input),
    'special':check_special(input),
    'len':check_len(input)

}
    if check_alpha(input) & check_number(input) & check_sprcial(input) & check_len(input)
    return True
else:
    print"No"

    while True:
    password = raw_input("Enter password:")
    print
    if validate_password(password):
        print("Yes")
    else
        print("No")

或者:

import re

while True:
    user_input = input("Please enter password:")
    is_valid = False

    if(len(user_input)<6):
        print("No")
        continue
    elif not re.search("[a-z]",user_input):
        print("No")
        continue
    elif not re.search("[0-9]",user_input):
        print("No")
        continue
    elif re.search("[~!@#$%^&*`+=|\;:><,.?/]",user_input):
        print("No")
        continue
    else:
        is_valid = True
        break

    if(is_valid):
    print("Yes")
4

8 回答 8

1

我喜欢这个特殊的解决方案,因为我发现验证是对装饰器的一种很好的使用。

def require(pred):
    def wrapper(f):
        def wrapped(*args, **kwargs):
            while True:
                result = f(*args, **kwargs)
                ok = pred(result)
                if ok:
                    return result
        return wrapped
    return wrapper

def begin_with_letters(s):
    return s[0].isalpha()

def length_over_six(s):
    return len(s) >= 6

def no_letters_outside_of_whitelist(s):
    WHITELIST = set(string.ascii_letters + string.digits + '-_')
    return all(c in WHITELIST for c in s)

@require(begin_with_letters)
@require(length_over_six)
@require(no_letters_outside_of_whitelist)
def get_password():
    user_pass = input("Enter a password: ")
    return user_pass

这种架构可以通过构建一个Validator类来扩展。

class Validator(abc.ABC):
    errormsg = NotImplemented

    def __init__(self, value):
        self.__value = value

    @property
    def value(self):
        return self.__value

    @abc.abstractmethod
    def validate(self) -> bool:
        """Uses self.value and validates it in some way, returning a bool."""

    @staticmethod
    def require(validator)
        def wrapper(f):
            def wrapped(*args, **kwargs):
                while True:
                    result = f(*args, **kwargs)
                    v = validator(result)
                    ok = v.validate()
                    if ok:
                        return result
                    print(v.errormsg)
            return wrapped
        return wrapper

class BeginWithLetters(Validator):
    errormsg = "Your password must begin with letters."

    def validate(self):
        return self.value[0].isalpha()

class LengthOverSix(Validator):
    errormsg = "Your password must be six characters or longer."

    def validate(self):
        return len(self.value) >= 6

class WhiteListCharacters(Validator):
    WHITELIST = set(string.ascii_letters + string.digits + "-_")
    errormsg = "Your password must only contain letters, digits, - and _"

    def validate(self):
        return all(c in self.WHITELIST for c in self.value)

@Validator.require(BeginWithLetters)
@Validator.require(LengthOverSix)
@Validator.require(WhiteListCharacters)
def get_password():
    return input("Enter a password: ")
于 2018-11-30T08:27:01.007 回答
0
import re

def validate(password):
    if len(password) < 6  or re.search('^[A-Za-z][A-Za-z0-9-_]*$',password) is None:
        print("password not accepted")
    else:
        print("Your password seems fine")
于 2018-11-30T08:51:24.973 回答
0

我建议你看看getpass模块。为了帮助您入门,请查看以下链接:getpass(示例系列 1)示例系列 2

于 2018-11-30T08:15:27.343 回答
0

您可以在一行中加入 3 个条件,并避免使用变量is_valid. 您还错过了第一个字符的条件:

import re
user_input = raw_input('Please enter password:')
if len(user_input)>=6 and user_input[0].isalpha() and re.match(r"^[\w-]*$", user_input):
    print('Yes')
else:
    print('No')
于 2018-11-30T08:45:17.960 回答
0

尝试这个:

import re

pw = raw_input('Type a password: ') # get input from user

if any([not pw[0].isalpha(),            # check if first char is a letter
       len(pw) < 6,                     # check if len is greater than or equal to 6
       not re.match(r'^[\w-]*$', pw)]): # check if all chars are alphanumeric, underscores, or dashes
    print 'No'
else:
    print 'Yes'

几个测试用例的示例输出:

Type a password: qwer
No

Type a password: qwerty
Yes

Type a password: 1a2b3c
No

Type a password: ASDF1234!!!!
No

Type a password: a.a.a.a
No
于 2018-11-30T08:38:28.637 回答
0
import re

user_input = raw_input('Please enter password:')

if len(user_input)>=6 and user_input[0].isalpha() and re.match(r"^[\w-]*$", user_input):
      print('Yes')
else:
      print('No')
于 2018-12-02T07:21:42.607 回答
-1
Import re
Password = (input("enter password here:"))
flag = 0
while True:
          if (len(password)<7):
                flag = -1
                break
          elif not re.search("[a-z]",  password):
                flag = -1
                break
           elif not re.search("[A-Z]",  password):
                 flag = -1
                 break
           elif not re.search("[0-9]",  password):
                 flag = -1
                 break  
            elif not re.search("[#@$&*_]",  password):
                 flag = -1
                 break
            else:
                     flag = 0
                     print("strong")
                     break
if flag == -1:
      print("weak")
于 2019-12-21T14:18:28.403 回答
-1

您的问题的理想解决方案是正则表达式。尝试在前端验证它。像javascript之类的东西。

据您所知,请查看 Python 文档中的以下链接。 https://docs.python.org/3/howto/regex.html

于 2018-11-30T08:24:11.027 回答