Есть ли способ найти слово из списка в строке без пробелов? - PullRequest
1 голос
/ 22 февраля 2020

Я создаю программу, в которой пользователь должен создать пароль длиной не менее 8 символов, содержащий хотя бы одну ди git, хотя бы одну строчную букву и хотя бы заглавную букву. Сложность в том, что пароль не может содержать слова из словаря Swedi sh. Я сохранил каждое слово из словаря в текстовом файле. Можно ли в любом случае проверить, содержит ли пароль слово из списка, составленного мной из словаря?

def main():
    print("Write a password with at least 8 characters", 
          "which contains at least 1 digit,", 
          "\nat least 1 uppercase letter, at least one lowercase character", 
          "and at least 1 special character")
    password = input("The password may not contain any word from the dictionary:")

    if checkAllow(password) == True:
        print("\nYour password is allowed")
    else:
        print("\nYour password is not allowed")
        main()

# This function checks if the password is allowed
def checkAllow(password):
    words = open("dictionary.txt", "r")
    wordlist = words.readlines()

    specialChar = ['!', '@', '#', '¤', '£', '$', '%', '€', '&', '/', '{', '(',
                  '[', ')', ']', '=', '}', '+', '?', '"', '¨', '^', '¨', '*',
                    ',', ';', '.', ':', '-', '_', '<', '>', '|', '§', '½']

    if len(password) >= 8 and any(char.isdigit() for char in password):
        if any(char.isupper() for char in password) and any(char.islower() for char in password):
            if any(char in specialChar for char in password):

# Below I try to check if the password contains a word from the dictionary.
                    if any(word in password for word in wordlist) == False:
                       return True
    else:
        return False

Ответы [ 3 ]

0 голосов
/ 22 февраля 2020

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

Вы можете использовать что-то вроде:

with open("dictionary.txt") as f:
    wordlist = [word.rstrip() for word in list(f) if word]

if any(word in password for word in wordlist) == False:
    ...

Примечания:

  • Проверка каждого слова в словаре требует много ресурсов процессора и его следует избегать
  • Слова словаря содержат символы новой строки в конце, и поэтому если он не совпадает, вы можете удалить его с помощью rstrip()
0 голосов
/ 22 февраля 2020

Вам нужно просмотреть все подстроки в строке и проверить, есть ли они в словаре. Я бы загрузил словарь в набор для быстрого поиска:

def load_dictionary(dict_path):
    word_set = set()
    with open(dict_path, 'r') as f:
        for line in f:
            for word in line.split():
                word_set.add(word)
    return word_set


def check_substrings(string, word_set):
    for i in range(len(string)):
        for j in range(i + 1, len(string)+ 1):
            if string[i:j] in word_set:
                return True
    return False

Возвращает true, если слово находится в словаре.

Кроме того, для доступа к файлам лучше использовать with open('dictionary.txt') as f:. Тогда вам не нужно беспокоиться о закрытии файла. Подробнее об этом здесь

0 голосов
/ 22 февраля 2020

Вам необходимо удалить символы новой строки из слов в wordlist.

wordlist = [word.rstrip() for word in words.readlines()]

Тогда ваша проверка any() должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...