在Python中验证用户输入字符串的内容?

在Python中验证用户输入字符串的内容?,python,Python,作为作业的一部分,我正在创建一个程序,要求用户输入用户名和密码 我已完成用户名部分(简单),但在分配说明中,密码必须: 包含大写字符 包含小写字符 长度不能超过6个字符 包含数字 没有空白 如果这些条件中的任何一个不正确,则需要显示5条特定的错误消息 我现在看到的是一些奇怪的行为,错误只会以特定的顺序出现(例如,密码“f”将出现错误“必须有大写字符”而不是“必须超过6个字符”)。我知道这是因为if语句的嵌套顺序,但如果有更好的方法。。。由于某些原因,它也无法捕获密码中的空白。我知道这可能不是

作为作业的一部分,我正在创建一个程序,要求用户输入用户名和密码

我已完成用户名部分(简单),但在分配说明中,密码必须:

  • 包含大写字符
  • 包含小写字符
  • 长度不能超过6个字符
  • 包含数字
  • 没有空白
如果这些条件中的任何一个不正确,则需要显示5条特定的错误消息

我现在看到的是一些奇怪的行为,错误只会以特定的顺序出现(例如,密码“f”将出现错误“必须有大写字符”而不是“必须超过6个字符”)。我知道这是因为if语句的嵌套顺序,但如果有更好的方法。。。由于某些原因,它也无法捕获密码中的空白。我知道这可能不是最有效的方法,但以下是我迄今为止得到的:

def validatePassword():
    accept = "n"
    while accept == "n":
        password = input("Please enter a valid password: ")
        upper = "n"
        lower = "n"
        digit = "n"
        length = "n"
        white = "n"
        if len(password) >= 6:
            length = "y"
        for char in password:
            if char in string.ascii_uppercase:
                upper = "y"
            if char in string.ascii_lowercase:
                lower = "y"
            if char in string.digits:
                digit = "y"
            if char not in string.whitespace:
                white = "y"
        if upper == "y":
            if lower == "y":
                if digit == "y":
                    if length == "y":
                        if white == "y":
                            accept = "y"
                        else:
                            print("::: ERROR :::",password,"must not have any white space character.")
                    else:
                        print("::: ERROR :::",password,"must be longer than 6 characters.")
                else:
                    print("::: ERROR :::",password,"must contain a number.")
            else:
                print("::: ERROR :::",password,"must contain a lowercase character.")
        else:
            print("::: ERROR :::",password,"must contain an uppercase character.")

    return password

您可以尝试以下方法:

#/usr/bin/env python
#-*-编码:utf-8-*-
def validatePassword(密码):
如果没有(密码中x的x.isupper()):
返回False,“无大写字符”
如果没有(x.islower()表示密码中的x):
返回False,“无小写字符”
如果len(密码)<6:
返回False,“不超过6个字符”
如果没有(密码中x的x.isdigit()):
返回False,“无编号”
如果有(密码中x的x.isspace()):
返回False,“包含hitespace”
返回True“
def test():
#测试一些密码
测试密码=[“lkjasdf”、“KAJSDF”、“lfSF”、“asdfADSF”、“asdfADSF 123”、“asdfADSF123”]
对于测试_密码中的p:
打印验证密码(p)
#“真实”用法
尽管如此:
密码=输入(“请输入有效密码:”)
结果,消息=validatePassword(密码)
如果结果为真:
打破
其他:
打印(信息)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
测试()

显然正确的方法是使用
any()
和生成器表达式,但是看看你怎么说
,我已经在10周的入门课程中学习了8周了
,这些可能对你没有帮助

这里介绍了如何不使用any()来执行此操作,只需在字符之间循环检查是否存在某些类型的字符

def validate_password(password):
    hasUpper = hasLower = hasNumber = hasWhiteSpace = False

    for char in passwordStr:
        if char.isupper():
            hasUpper = True
        if char.islower():
            hasLower = True
        if char.isdigit():
            hasNumber = True
        if char.isspace():
            hasWhiteSpace = True

    if len(password) <= 6:
        return False, "Password must be longer than 6 characters"
    if not hasUpper:
        return False, "Password must contain atleast one uppercase character"
    if not hasLower:
        return False, "Password must contain atleast one lowercase letter"
    if not hasNumber:
        return False, "Password must contain alteast one number"
    if hasWhiteSpace:
        return False, "Password cannot contain any white space"

    return True
def验证密码(密码):
hasUpper=hasLower=hasNumber=haswitespace=False
对于passwordStr中的字符:
如果char.isupper():
hassupper=True
如果char.islower():
hasLower=True
如果char.isdigit():
hasNumber=True
如果char.isspace():
haswitespace=True

如果先使用len(password),则会出现数据类型
bool
,它可以表示值
True
False
。您应该使用它们来表示简单的真/假状态,而不是分配字符串
“y”
“n”

其次,单独检查每个字符并至少存储一次不同条件是否满足是一种可行的方法。然而,Python有强大的字符串检查方法,可以使您的生活更加轻松。让我通过编写一个简短的函数来演示它们,该函数以aa password作为参数,根据密码是否满足您的限制,简单地返回
True
False

def is_password_valid(password):

    # check password length:
    if len(password) < 6:
        print("Your password is too short, at least 6 characters are required!")
        return False

    # check if password contains any non-alphanumeric letters (including whitespace):
    # (isalnum() only returns true if the string only contains letters and digits, nothing else)
    if not password.isalnum():
        print("Your password may only contain letters and digits!")
        return False

    # check if password contains letters:
    # (isdigit() only returns true if all of the characters are numbers)
    if password.isdigit():
        print("Your password does not contain any letters!")
        return False

    # check if password contains uppercase letters:
    # (islower() only returns true if all of the letters are lowercase, non-letters are ignored)
    if password.islower():
        print("Your password does not contain any uppercase letters!")
        return False

    # check if password contains lowercase letters:
    # (isupper() only returns true if all of the letters are uppercase, non-letters are ignored)
    if password.isupper():
        print("Your password does not contain any lowercase letters!")
        return False

    # check if password contains lowercase numbers:
    # (isalpha() only returns true if all of the characters are letters)
    if password.isalpha():
        print("Your password does not contain any numbers!")

    # if all conditions above are okay, the password is valid:
    print("The password is okay.")
    return True

你可以试试正则表达式。如果你不知道regex,正如你在评论中提到的,它是一个很棒的网站

要进行验证,请检查密码是否与将使其无效的任何规则匹配,如果不匹配,则为有效密码

import re
def validate(passwd):
  pattern = r'^(.{0,5}|[^0-9]*|[^A-Z]*|[^a-z]*|.*\s+.*)$'
  result = re.search(pattern, passwd)
  if result:
    print 'Invalid Password'
  else:
    print 'Valid Password'  

这样做的目的是检查,
passwd
是否少于6个字符,是否不包含数字,是否不包含大写字符,是否不包含小写字符,是否包含空格。如果所有条件都不匹配,则密码有效

试着换一个正则表达式。甚至不知道那是什么。我已经上了8周10周的入门课程。也许你应该使用你的。
if len(password)<6:
应该是
if len(password)@Racialz,这取决于我们是看OP的文字描述还是他们的代码。当文本显示“长度超过6个字符”时,代码显示“
如果len(密码)>=6:length=“y”
”。如果我的解释不正确,他们应该能够适应这种情况。我喜欢这种结构,但它总是返回值True,并接受密码。我在主程序中使用了while循环:accept=False,而accept=False password=getpass()accept=validatePassword(password)validate程序应该返回要接受的true或false布尔值,并且应该继续或结束while循环。它总是立刻结束。
import re
def validate(passwd):
  pattern = r'^(.{0,5}|[^0-9]*|[^A-Z]*|[^a-z]*|.*\s+.*)$'
  result = re.search(pattern, passwd)
  if result:
    print 'Invalid Password'
  else:
    print 'Valid Password'