Tri de mots (Regex + count())

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 357 fois - Téléchargée 10 fois

Contenu du snippet

Bonjour,

Comme ça ne sers à rien j'ai créé un script qui tri les mots en fonction
du nombre de caracteres et le fait qu'il n'y ai qu'une seule occurences
de chaque caracteres dans le mot.

Attention:- pour python 2.* (pour Python 3 enlevez les decode() & encode())
- Mettez le fichier texte dans la variable ou en argument
apres commande Ex:$Python SelectCD.py /home/User/list_mots.txt

# -*-coding:utf-8-*-
# __AUTOR__='M4RK05'

import re, sys
import os, time


temps= time.time() # Chrono. 

# Façon Améliorée avec double-boucle et range(start, stop) 9 lignes de moins!
def occur(mot):
    """ Fonction qui vérifie qu'il n'y ai qu'une seule occurence de chaque caractères"""
    
    alph= "abcdeéèfghiîïjklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    hig=[]
    for x in range(56):
       hig.append(mot.count(alph[x]))
       for g in range(2, 7):
           if hig.count(g)> 0:
                return False
                break
           else:
                pass
    return True

# Première façon trouvée (pas très beau lol!)
def occu(mot):
    """ Fonction qui vérifie qu'il n'y ai qu'une seule occurence de chaque caractères"""
    
    alph= "abcdeéèfghiîïjklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    hig=[]
    for x in range(56):
       hig.append(mot.count(alph[x]))
       if hig.count(2)> 0:
             return False
             break
       elif hig.count(3)> 0:
             return False
             break
       elif hig.count(4)> 0:
             return False
             break
       elif hig.count(5)> 0:
             return False
             break
       else:
             pass
    return True

# Nombre de positifs puis de négatif:
nbuen=0                  	
nerrors= 0
# Expression reguliere pour obtenir tous les mots de 10 caractères
# reg= r"^[A-Za-z]{10,10}$"

# Fichier à traiter en dur.
fi1= '/home/fred/liste-francais'

# Fichier à traiter passé en argument au script python.
fi2= str(sys.argv[1])

with open(fi2, "r") as mon_fichier :
    txt= mon_fichier.read()
    liste= txt.split()
    
    for line in liste:
        line.decode('utf8')
        if re.match(r"^[A-Za-z]{10,10}$", line ) and occur(line)== True:
            print (line.encode('utf8') +"  "+ str(occu(line))+"  10 unicS C. *****")
            nbuen+=1
        else:
           nerrors +=1
ri=4
#time.sleep(19)
tmp= time.time()- temps
tem= str(tmp)
if float(tem) > 9.0:
    ri= 5
elif float(tem) > 99.0:
    ri= 6
elif float(tem) > 999.0:
    ri= 7
else:
    pass
print("------------------------------------")  
print(" Terminé avec "+ str(nerrors) +" mots éliminés!")               
print("------------------------------------")
print("Terminé "+ str(nbuen) +" mots trouvés!En "+ tem[:ri] +" sec.")
print("------------------------------------")
print("n")
print("-------------Par M4RK05--------------")
print("le nom du script est ==> "+ str(sys.argv[0]))

A voir également

Ajouter un commentaire Commentaires
Messages postés
8
Date d'inscription
samedi 4 février 2017
Statut
Membre
Dernière intervention
15 mars 2018
1
hello Jordane & Wismeril
merci, je testerai.
Messages postés
16571
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
7 décembre 2021
578
Salut, ce qu'il veut, c'est l'inverse: pas de répétition.
Par contre, on peut simplifier la mienne avec le {0,}.
Et \w matche aussi sur un nombre.

En fait pour faire simple, on peut faire deux passes.
La première matche les mots de 7 lettres
^[a-z]{7}$

Et la seconde vérifie qu'il n'y a pas de lettre en double.
(\w)(?!\w{0,}\1)

Je n'ai pas testé, mais en fournissant à la seconde les résultats de la première ça devrait marcher.
Messages postés
34249
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 décembre 2021
357
Hello,
Je me demande si une regex comme celle-ci

([\w])(?:(\w{0,}\1))

pour le coup.. ne serait pas plus "facile"
elle match tous les mots ayant une ou plusieurs lettre(s) répétées (une ou x fois..)
Messages postés
16571
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
7 décembre 2021
578
oui enfin, si c'est pas très modulable si tu veux changer le nombre de lettres.
Messages postés
8
Date d'inscription
samedi 4 février 2017
Statut
Membre
Dernière intervention
15 mars 2018
1
Super merci Whismeril.
Je me disai que c'était possible.
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.