Tri de mots (Regex + count())

0/5 (12 avis)

Snippet vu 3 767 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
dume. Messages postés 8 Date d'inscription samedi 4 février 2017 Statut Membre Dernière intervention 15 mars 2018 1
16 févr. 2017 à 14:33
hello Jordane & Wismeril
merci, je testerai.
Whismeril Messages postés 18023 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 décembre 2022 618
Modifié par Whismeril le 15/02/2017 à 07:00
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.
jordane45 Messages postés 36600 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 décembre 2022 342
15 févr. 2017 à 02:36
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..)
Whismeril Messages postés 18023 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 décembre 2022 618
14 févr. 2017 à 07:02
oui enfin, si c'est pas très modulable si tu veux changer le nombre de lettres.
dume. Messages postés 8 Date d'inscription samedi 4 février 2017 Statut Membre Dernière intervention 15 mars 2018 1
14 févr. 2017 à 05:05
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.