Поэтому я должен создать код, который подтвердит ли пароль:

  • Не менее 8 символов
  • Содержит как минимум 1 номер
  • Содержит как минимум 1 заглавную букву

Вот код:

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")
            break

validate()

Я не уверен, что не так, но когда я ввожу пароль, у которого есть номер - он постоянно говорит мне, что мне нужен пароль с номером в нем. Любые решения?

2
HaViK 13 Дек 2016 в 12:38

9 ответов

Лучший ответ

Вы можете использовать модуль re для регулярных выражений.

При этом ваш код будет выглядеть так:

import re

def 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")
            break

validate()
9
zipa 13 Дек 2016 в 09:54

Python 2.7 Цикл for назначит номер условия для каждого символа. то есть Pa $$ w0rd в списке будет = 1,2,4,4,2,3,2,2,5. Поскольку наборы содержат только уникальные значения, набор будет = 1,2,3,4,5; следовательно, поскольку все условия выполняются, длина набора будет = 5. если бы он был $ $ w, набор был бы = 2,4, и поэтому len = 2 был бы недействительным

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")
0
user2557522 14 Ноя 2018 в 19:01

Может быть, вы можете использовать выражение регулярного выражения:

re.search(r"[A-Z]", password)

Проверьте заглавные буквы.

re.search(r"[0-9]", password)

Проверьте цифры в пароле.

0
Marcin Świerczyna 13 Дек 2016 в 09:51
r_p = re.compile('^(?=\S{6,20}$)(?=.*?\d)(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[^A-Za-z\s0-9])')

Этот код подтвердит ваш пароль:

  1. минимальная длина 6 и максимальная длина 20
  2. по крайней мере, включить цифру,
  3. как минимум заглавные и строчные буквы
  4. хотя бы специальные символы
3
MikeZhang 30 Мар 2017 в 07:53

Примере:

class Password:
    def __init__(self, password):
        self.password = password

    def 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 = False
               return n
        return valid                

    def compare(self, password2):
        if self.password == password2:
            return True


if __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())
0
Xavi Martínez 27 Дек 2019 в 13:46

Вы проверяете методы isdigit и isupper для всего объекта строки пароля, а не для каждого символа строки. Ниже приведена функция, которая проверяет, соответствует ли пароль вашим конкретным требованиям. Он не использует никаких регулярных выражений. Также распечатывает все дефекты введенного пароля.

#!/usr/bin/python3
def passwd_check(passwd):
    """Check if the password is valid.

    This function checks the following conditions
    if its length is greater than 6 and less than 8
    if it has at least one uppercase letter
    if it has at least one lowercase letter
    if it has at least one numeral
    if it has any of the required special symbols
    """
    SpecialSym=['$','@','#']
    return_val=True
    if len(passwd) < 6:
        print('the length of password should be at least 6 char long')
        return_val=False
    if len(passwd) > 8:
        print('the length of password should be not be greater than 8')
        return_val=False
    if not any(char.isdigit() for char in passwd):
        print('the password should have at least one numeral')
        return_val=False
    if not any(char.isupper() for char in passwd):
        print('the password should have at least one uppercase letter')
        return_val=False
    if not any(char.islower() for char in passwd):
        print('the password should have at least one lowercase letter')
        return_val=False
    if not any(char in SpecialSym for char in passwd):
        print('the password should have at least one of the symbols $@#')
        return_val=False
    if return_val:
        print('Ok')
    return return_val

print(passwd_check.__doc__)
passwd = input('enter the password : ')
print(passwd_check(passwd))
1
srinivasu u 8 Ноя 2017 в 05:29
''' 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 string

def 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 False

    countLetters = 0
    countDigits = 0
    countSpec = 0
    countWS = 0

    for i in inputStr:
        if i in string.ascii_uppercase or i in string.ascii_lowercase:
             countLetters += 1
        if i in string.digits:
            countDigits += 1
        if i in string.punctuation:
            countSpec += 1
        if i in string.whitespace:
            countWS += 1

    if not countLetters:
        return False
    elif not countDigits:
        return False
    elif not countSpec:
        return False
    elif countWS:
        return False
    else:
        return True


print("Output: ",checkPassword(input()))

С регулярным выражением

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))

Модуль импорта

from string import digits, punctuation

def validate_password(p):
    if not 5 <= len(p) <= 10:
        return False

    if not any(c in digits for c in p):
        return False

    if not any(c in punctuation for c in p):
        return False

    if ' ' in p:
        return False

    return True

for p in ('DJjkdklkl', 'John Doe'
, '$kldfjfd9'):
    print(p, ': ', ('invalid', 'valid')[validate_password(p)], sep='')
0
Nons 22 Сен 2019 в 10:08

password.isdigit() не проверяет, содержит ли пароль цифра, она проверяет все символы в соответствии с:

str.isdigit (): Возвращает true, если все символы в строке являются цифрами и имеется хотя бы один символ, в противном случае - false.

password.isupper() не проверяет, имеет ли пароль в нем прописаны все символы в соответствии с:

str.isupper (): Возвращает true, если все символы в строке в верхнем регистре имеют верхний регистр и имеется хотя бы один символ в регистре, в противном случае - false.

Чтобы найти решение, проверьте вопрос и принятый ответ по адресу проверить, содержит ли строка число.

Вы можете создать свою собственную hasNumbers() - функцию (скопировано из связанного вопроса):

def hasNumbers(inputString):
    return any(char.isdigit() for char in inputString)

И hasUpper() - функция:

def hasUpper(inputString):
    return any(char.isupper() for char in inputString)
3
Community 23 Май 2017 в 12:10

Или вы можете использовать это, чтобы проверить, получил ли он хотя бы одну цифру:

min(passwd).isdigit()
-1
Ludwig Austermann 28 Фев 2018 в 11:22