So I have to create code that validate whether a password:
- Is at least 8 characters long
- Contains at least 1 number
- Contains at least 1 capital letter
Here is the code:
def validate():while True:password = input("Enter a password: ")if len(password) < 8:print("Make sure your password is at lest 8 letters")elif not password.isdigit():print("Make sure your password has a number in it")elif not password.isupper(): print("Make sure your password has a capital letter in it")else:print("Your password seems fine")breakvalidate()
I'm not sure what is wrong, but when I enter a password that has a number - it keeps telling me that I need a password with a number in it. Any solutions?
Best Answer
You can use re
module for regular expressions.
With it your code would look like this:
import redef validate():while True:password = raw_input("Enter a password: ")if len(password) < 8:print("Make sure your password is at lest 8 letters")elif re.search('[0-9]',password) is None:print("Make sure your password has a number in it")elif re.search('[A-Z]',password) is None: print("Make sure your password has a capital letter in it")else:print("Your password seems fine")breakvalidate()
r_p = re.compile('^(?=\S{6,20}$)(?=.*?\d)(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[^A-Za-z\s0-9])')
this code will validate your password with :
- min length is 6 and max length is 20
- at least include a digit number,
- at least a upcase and a lowcase letter
- at least a special characters
password.isdigit()
does not check if the password contains a digit, it checks all the characters according to:
str.isdigit(): Return true if all characters in the string are digitsand there is at least one character, false otherwise.
password.isupper()
does not check if the password has a capital in it, it checks all the characters according to:
str.isupper(): Return true if all cased characters in the string areuppercase and there is at least one cased character, false otherwise.
For a solution, please check the question and accepted answer at check if a string contains a number.
You can build your own hasNumbers()
-function (Copied from linked question):
def hasNumbers(inputString):return any(char.isdigit() for char in inputString)
and a hasUpper()
-function:
def hasUpper(inputString):return any(char.isupper() for char in inputString)
Example:
class Password:def __init__(self, password):self.password = passworddef validate(self): vals = {'Password must contain an uppercase letter.': lambda s: any(x.isupper() for x in s),'Password must contain a lowercase letter.': lambda s: any(x.islower() for x in s),'Password must contain a digit.': lambda s: any(x.isdigit() for x in s),'Password must be at least 8 characters.': lambda s: len(s) >= 8,'Password cannot contain white spaces.': lambda s: not any(x.isspace() for x in s) } valid = True for n, val in vals.items(): if not val(self.password): valid = Falsereturn nreturn valid def compare(self, password2):if self.password == password2:return Trueif __name__ == '__main__':input_password = input('Insert Password: ')input_password2 = input('Repeat Password: ')p = Password(input_password)if p.validate() is True:if p.compare(input_password2) is True:print('OK')else:print(p.validate())
You are checking isdigit and isupper methods on the entire password string object not on each character of the string. The following is a function which checks if the password meets your specific requirements. It does not use any regex stuff. It also prints all the defects of the entered password.
#!/usr/bin/python3def passwd_check(passwd):"""Check if the password is valid.This function checks the following conditionsif its length is greater than 6 and less than 8if it has at least one uppercase letterif it has at least one lowercase letterif it has at least one numeralif it has any of the required special symbols"""SpecialSym=['$','@','#']return_val=Trueif len(passwd) < 6:print('the length of password should be at least 6 char long')return_val=Falseif len(passwd) > 8:print('the length of password should be not be greater than 8')return_val=Falseif not any(char.isdigit() for char in passwd):print('the password should have at least one numeral')return_val=Falseif not any(char.isupper() for char in passwd):print('the password should have at least one uppercase letter')return_val=Falseif not any(char.islower() for char in passwd):print('the password should have at least one lowercase letter')return_val=Falseif not any(char in SpecialSym for char in passwd):print('the password should have at least one of the symbols $@#')return_val=Falseif return_val:print('Ok')return return_valprint(passwd_check.__doc__)passwd = input('enter the password : ')print(passwd_check(passwd))
''' Minimum length is 5;- Maximum length is 10;- Should contain at least one number;- Should contain at least one special character (such as &, +, @, $, #, %, etc.);- Should not contain spaces.'''import stringdef checkPassword(inputStr):if not len(inputStr):print("Empty string was entered!")exit(0)else:print("Input:","\"",inputStr,"\"")if len(inputStr) < 5 or len(inputStr) > 10:return FalsecountLetters = 0countDigits = 0countSpec = 0countWS = 0for i in inputStr:if i in string.ascii_uppercase or i in string.ascii_lowercase:countLetters += 1if i in string.digits:countDigits += 1if i in string.punctuation:countSpec += 1if i in string.whitespace:countWS += 1if not countLetters:return Falseelif not countDigits:return Falseelif not countSpec:return Falseelif countWS:return Falseelse:return Trueprint("Output: ",checkPassword(input()))
With Regex
s = input("INPUT: ")print("{}\n{}".format(s, 5 <= len(s) <= 10 and any(l in "0123456789" for l in s) and any(l in "!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~" for l in s) and not " " in s))
Module import
from string import digits, punctuationdef validate_password(p):if not 5 <= len(p) <= 10:return Falseif not any(c in digits for c in p):return Falseif not any(c in punctuation for c in p):return Falseif ' ' in p:return Falsereturn Truefor p in ('DJjkdklkl', 'John Doe', '$kldfjfd9'):print(p, ': ', ('invalid', 'valid')[validate_password(p)], sep='')
Sure with regex there are easier answers, but this one of the simplest ways
from string import punctuation as ps = 'Vishwasrocks@23' #or user input is welcomelis = [0, 0, 0, 0]for i in s:if i.isupper():lis[0] = 1elif i.islower():lis[1] = 1elif i in p:lis[2] = 1elif i.isdigit():lis[3] = 1print('Valid') if 0 not in lis and len(s) > 8 else print('Invalid')
The simplest python validation using normal methods
password = '-'while True:password = input(' enter the passwword : ')lenght = len(password)while lenght < 6:password = input('invalid , so type again : ')if len(password)>6:breakwhile not any(ele.isnumeric() for ele in password):password = input('invalid , so type again : ')while not any(ele.isupper() for ele in password):password = input('invalid , so type again : ')while not any(ele not in "[@_!#$%^&*()<>?/|}{~:]" for ele in password):password = input('invalid , so type again : ')break
isdigit()
checks the whole string is a digit, not if the string contains a digitReturn true if all characters in the string are digits and there is at least one character, false otherwise.
isupper()
checks the whole string is in uppercase, not if the string contains at least one uppercase character.Return true if all cased characters in the string are uppercase and there is at least one cased character, false otherwise.
What you need is using the any
built-in function:
any([x.isdigit() for x in password])
will return True if at least one digit is present inpassword
any([x.isupper() for x in password])
will return True if at least one character is considered as uppercase.
Maybe you can use regex expression:
re.search(r"[A-Z]", password)
Check uppercase letters.
re.search(r"[0-9]", password)
Check digits in password.
Python 2.7The for loop will assign a condition number for each character. i.e. Pa$$w0rd in a list would = 1,2,4,4,2,3,2,2,5. Since sets only contains unique values, the set would = 1,2,3,4,5; therefore since all conditions are met the len of the set would = 5. if it was pa$$w the set would = 2,4 and len would = 2 therefore invalid
name = raw_input("Enter a Password: ")list_pass=set()special_char=['#','$','@']for i in name:if(i.isupper()):list_pass.add('1')elif (i.islower()):list_pass.add('2')elif(i.isdigit()) :list_pass.add('3')elif(i in special_char):list_pass.add('4')if len(name) >=6 and len(name) <=12:list_pass.add('5')if len(list_pass) is 5:print ("Password valid")else: print("Password invalid")
uppercase_letter = ['A', 'B','C', 'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']number = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]import reinfo ={}while True:user_name = input('write your username: ')if len(user_name) > 15:print('username is too long(must be less than 16 character)')elif len(user_name) < 3 :print('username is short(must be more than 2 character)')else:print('your username is', user_name)breakwhile True: password= input('write your password: ')if len(password) < 8 :print('password is short(must be more than 7 character)')elif len(password) > 20:print('password is too long(must be less than 21 character)') elif re.search(str(uppercase_letter), password ) is None :print('Make sure your password has at least one uppercase letter in it')elif re.search(str(number), password) is None :print('Make sure your password has at least number in it')else:print('your password is', password)breakinfo['user name'] = user_nameinfo['password'] = passwordprint(info)
Password Complexity conditions:
Must include at least one uppercase character
Must include at least one lowercase character
Must include at least one number
Must include at least one special character
Must have a length of at least 8 and a max of 20
import redef validate():while True:password = raw_input("Enter a password: ")re_exp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!#%*?&]{8,20}$"if re.search(re.compile(regex_exp),password):print("Your password seems fine")else:print("Password doees not matches with password complexity conditions")break
Or you can use this to check if it got at least one digit:
min(passwd).isdigit()