1
votes

Existe-t-il un moyen de trouver un mot dans une liste dans une chaîne sans espaces?

Je crée un programme dans lequel l'utilisateur doit créer un mot de passe d'au moins 8 caractères, contenant au moins un chiffre, au moins une lettre minuscule et au moins une lettre majuscule. Le plus difficile est que le mot de passe ne peut contenir aucun mot du dictionnaire suédois. J'ai stocké chaque mot du dictionnaire dans un fichier texte. Puis-je vérifier si le mot de passe contient un mot de la liste que j'ai faite du dictionnaire?

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


4 commentaires

if substring in longstring: vous dira si la sous-chaîne apparaît n'importe où dans la longue chaîne.


En passant, if boolean_expression == boolean: return boolean est une erreur classique


Vous devez utiliser un gestionnaire de contexte pour gérer les objets fichier. De plus, les noms de variables et de fonctions doivent suivre le style lower_case_with_underscores .


Aussi, utilisez le type set au lieu de list pour effectuer la vérification, c'est beaucoup plus rapide.


3 Réponses :


0
votes

Vous devez supprimer les nouvelles lignes des mots dans wordlist .

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

Ensuite, votre vérification any () devrait fonctionner.

/ p>


0 commentaires

0
votes

Puis-je vérifier si le mot de passe contient un mot du liste que j'ai faite du dictionnaire?

Vous pouvez utiliser quelque chose comme:

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:
    ...

Remarques:

  • Vérifier chaque mot d'un dictionnaire est intensif en CPU et doit être évité
  • Les mots du dictionnaire contenaient des caractères de nouvelle ligne à la fin et c'est pourquoi le ne correspond pas, vous pouvez le supprimer avec rstrip()

0 commentaires

0
votes

Vous devez examiner toutes les sous-chaînes de la chaîne et vérifier si elles sont dans le dictionnaire. Je chargerais le dictionnaire dans un ensemble pour obtenir une recherche rapide:

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

Cela renvoie vrai si le mot est dans le dictionnaire.

De plus, il est préférable d'accéder aux fichiers en utilisant avec open ('dictionary.txt') comme f: . Ensuite, vous n'avez pas à vous soucier de la fermeture du fichier. Plus d'informations à ce sujet ici


0 commentaires