#python
Вопрос:
import re
print("Your password must have lower and uppercase letters, may contain numbers and also must have at least 8 characters")
passWord = input("What is your password?: ")
special_chars = re.compile('[@_!#$%^amp;*()<>?/|}{~:]')
if len(passWord) >= 8:
print("Your password is long enough!")
if passWord is not passWord.isupper() and not passWord.islower():
passWord2 = input("Please re enter your password ")
if passWord2 == passWord:
print("Your password is valid")
else:
print("Oops, it seems your passwords don't match, please try again!")
else:
print("You have made a mistake, please follow the rules that are shown at the beginning.")
if any(passWord.isdigit):
print("Your password is Medium strength")
if(special_chars.search(passWord) >= 1):
print("Your password is Medium strength")
if any(passWord.isdigit) and special_chars.search(passWord) >= 1:
print("Your password is strong")
Я пытаюсь проверить, содержит ли эта строка специальные символы и цифры. Если у него есть то или другое, то это средняя сила. Если в нем есть и то, и другое, он силен. Я ожидал бы, что приведенный выше код будет работать, но это не так. Где я ошибаюсь?
Комментарии:
1.
passWord is not passWord.isupper()
.is
не делает того, о чем вы думаете. Ты, наверное, хочешьif passWord.isupper() or passWord.islower()
.2. Было бы полезно предоставить некоторые примеры входных данных, что вы ожидаете от кода и что он на самом деле делает!
3. разве это не означает, что он может быть только в верхнем или нижнем регистре? Я хочу, чтобы он был вынужден сочетать верхний и нижний регистр
4.
passWord.isdigit
также не делает того, что вы думаете. Ты, наверное, хотелpassWord.isdigit()
.5. «любой» просто не работает таким образом, и регулярное выражение «поиск» не возвращает число. Поиграйте немного с регулярным поиском в оболочке Python, чтобы узнать, что он возвращает, если он что-то находит/не находит, и затем используйте это.
Ответ №1:
Я бы вообще не советовал создавать собственные решения для обеспечения безопасности, лучше всего было бы перенести эту функциональность во внешнюю библиотеку, которая была хорошо протестирована. Рассмотрите такие вопросы, как разные языки (являются ли японские специальные символы хираганы? Арабские цифры?).
Тем не менее, вы можете использовать эту isalnum()
функцию:
>>> "hello".isalnum()
True
>>> "hello!".isalnum()
False
>>> "hello there".isalnum()
False
>>> "hello123".isalnum()
True
>>> "Hello123".isalnum()
True
Если passWord.isalnum()
значение false, ваш пароль содержит какой-либо не буквенно-цифровой символ.
Есть и другие аналогичные функции:
passWord.isalpha()
passWord.isnumeric()
Ответ №2:
Вот цикл for, который делает то, что вы ищете:
teststring = "Thishas3#$amp;specialchars"
specialchars = '@_!#$%^amp;*()<>?/|}{~:'
howmany = 0
for i in range(len(specialchars)):
char = specialchars[i]
if char in teststring:
howmany = 1
и даже ведет подсчет количества специальных символов в строке.
Комментарии:
1. Обратите внимание, что вы
i
ни для чего не используете. Просто напишиfor char in special_chars: ...
2. хороший улов. Я не думал, что смогу повторять буквы такой строки.
Ответ №3:
import string
import re
def is_have_digits(passwd):
return re.search('[0-9]', passwd) != None
def is_have_specials(passwd):
return re.search(f'[{re.escape(string.punctuation)}]', passwd) != None
passwd = "qwerty.123"
if is_have_digits(passwd) and is_have_specials(passwd):
print("strong!")
Комментарии:
1. Пожалуйста, укажите дополнительную информацию в своем ответе. Как это написано в настоящее время, трудно понять ваше решение.