arturweb01
@arturweb01

Как проверить, встречаются ли какие-либо символы из одной строки в другой строке?

Хочу создать генератор пароля, чтобы в нем обязательно были символы, маленькие буквы, большие буквы и цифры.
Нужно организовать проверку, есть ли в генерируем пароле хотя бы один символ из строки с символами, хотя бы одна маленькая буква из строки с маленькими буквами и тд.

Пока что получается вот так:
import random

chars = '+-*/'
smletters = 'qwertyuiopasdfghjklzxcvbnm'
bgletters = 'QWERTYUIOPASDFGHJKLZXCVBNM'
numbers = '1234567890'

allsymbols = '+-*/qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890'

for i in range(5):
    result = ''
    for j in range(8):
        result += random.choice(chars+smletters+bgletters+numbers)
        if result.count(chars) > 0:
            continue
            if result.count(smletters) > 0:
                continue
                if result.count(bgletters) > 0:
                    continue
                    if result.count(numbers) > 0:
                        print(result)


Но "result.count(chars)" ищет всю строку chars в result. Как сделать проверку по вышеуказанному принципу?
  • Вопрос задан
  • 391 просмотр
Решения вопроса 2
@asd111
Ответ легко ищется поисковиком.
import re
def is_password_valid(password):
    return bool(re.search('(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[+\-*\/])', password))

print(is_password_valid("&"))
print(is_password_valid("shsgddg+-/*GGH"))
print(is_password_valid("Aa1+"))

Более понятный вариант:
import re
def is_val(pas):
    is_ok1 = bool(re.search("[a-z]",pas))
    is_ok2 = bool(re.search("[A-Z]",pas))
    is_ok3 = bool(re.search("[0-9]",pas))
    is_ok4 = bool(re.search("[+\-*\/]",pas))
    return is_ok1 and is_ok2 and is_ok3 and is_ok4 
    
print(is_val("asd"))
print(is_val("shsgddg+-/*GGH"))
print(is_val("1Aa1+"))
print(is_val("sh12sgddg+-/*GGH"))
Ответ написан
Комментировать
ri_gilfanov
@ri_gilfanov
Web- and desktop-developer
Лучше использовать регулярные выражения, см. модуль re стандартной библиотеки.

Но если сложно, можете использовать такую функцию:
def check_password_for_chars(password, chars):
    for char in chars:
        if char in password:
            return True
    return False

Ну и для каждой проверки вызываете её 4 раза, указывая в качестве chars свои наборы символов.

Если потребуется проверять, что в пароле больше 1 символа из chars. Убираете return True из тела цикла. Добавляете в функцию третий аргумент, скажем min_count (минимальный счёт), и перед циклом добавляете локальную переменную, скажем count (счёт), со значением 0. Тогда в теле цикла, при каждом обнаружении искомого символа в пароле, Вы увеличиваете count на 1. И в конце проверяете, что count больше или равно min_count, чтобы вернуть True или False.

Но, во-первых, с регулярными выражениями решение будет короче и без цикла. Во-вторых, регулярные выражения очень гибкий инструмент. И в-третьих, они могут сильно пригодится в будущем.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Stasgar
@Stasgar
Обученная макака
Можно проще (если без регулярки):

allowed = set("abcd") # разрешенные символы

password_ok = "babc" # валидный пароль
password_bad = "baz" # невалидный пароль

print(set(password_ok).issubset(allowed)) # true - пароль состоит только из символов allowed
print(set(password_bad).issubset(allowed)) # false, в пароле есть другие не разрешенные символы


В итоге функция:

def password_valid(password, allowed):
    return set(password).issubset(set(allowed))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы