IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Créer une insensibilité à la casse [Python 2.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Créer une insensibilité à la casse
    Bonjour,

    Je travaille sur un programme de veille technologique. Donc le but de celui ci est de lire les flux RSS et de renvoyer uniquement les informations qui contiennent un des mots clés recherché. Mots clés qui sont recherchés dans le titre et la description du fichier XML. Et viens mon problème : je suis capable de repérer les mots clés mais mon programme est sensible à la casse ce qui posera quelques soucis, des informations pouvant passer à la trappe.

    J'ai déjà essayé de contourner le problème en utilisant une regex en l'occurrence IGNORECASE. Mais cela n'a pas très bien marché et a occasionné d'autres erreurs y compris d'encodage. En fait surtout d'encodage. Je précise au passage que je tourne sous python 2.7 et que lire les XML j'utilise le module Universal Feedparser (qui fait ça très bien).

    Voilà la partie du code concernée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    if (rss): 
    	xmldoc = feedparser.parse(rss)
    	if (xmldoc) :
    		"""On ouvre le fichier Newsletter.txt qui va récolter le flux. Ce fichier sera ensuite lu par les fonction d'envoi par mail et d'envoir sur le serveur"""
    		newsletter = open("Newsletter.txt", "w") 
     
    		"""On cherche premièrement à savoir de quelle source vient le RSS"""
    		source_title = xmldoc.feed.title
    		print source_title #Dev
    		newsletter.write (source_title.encode("utf_8") + "\n" + "\n")
     
    		"""Universal Feedparser crée une liste dans qui répertorie chaque article, cette liste est la liste entries[n] qui comprends n+1 entrées (les liste sont numérotées à partir de 0). Python ne peut aller au delà de cette taille n-1. Il faut donc d'abord cherche la taille de la liste avec la fonction len"""  
    		range = 0 #on initialise la variable range qui va servir pour pointer les articles 
    		rangemax = len(xmldoc.entries)
    		print ("nombre d'article :"), rangemax, ("\n") #dev
     
    		"""On initialise une boucle while qui va parcourir la liste pour rechercher titres, description, lien, etc ...."""
    		while range < rangemax:
    			post_title = xmldoc.entries[range].title
    			post_description = xmldoc.entries[range].description
    			post_link = xmldoc.entries[range].link
    			keyword = u"Google"
     
    			if keyword in post_title:
    				print post_title.encode("utf_8") #Dev
    				print post_link, ("\n") #Dev
    				print ("range:"), range, ("\n") #Dev
    				newsletter.write (post_title.encode("utf_8") + "\n" + post_link.encode("utf_8") + "\n" + "\n")
     
    			elif keyword in post_description:
    				print post_title.encode("utf_8") #Dev
    				print post_link, ("\n") #Dev
    				print ("range:"), range, ("\n") #Dev
    				newsletter.write (post_title.encode("utf_8") + "\n" + post_link.encode("utf_8") + "\n" + "\n")	
     
    			range = range+1 #On incrémente le pointeur range qui nous sert aussi de compteur
     
    		newsletter.close()
    Je précise que je n'ai pas encore implémenté le multi-source et le multi-keyword. C'est pour ça que c'est encore un peu simple.

    Merci beaucoup et bonne journée !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par SidereusNuncius Voir le message
    Je travaille sur un programme de veille technologique. Donc le but de celui ci est de lire les flux RSS et de renvoyer uniquement les informations qui contiennent un des mots clés recherché. Mots clés qui sont recherchés dans le titre et la description du fichier XML. Et viens mon problème : je suis capable de repérer les mots clés mais mon programme est sensible à la casse ce qui posera quelques soucis, des informations pouvant passer à la trappe.
    "insensible à la casse", c'est ignorer majuscules et minuscules. Dans la pratique, passez les chaines de caractères en majuscule (ou en minuscules) avant de les comparer le fait assez bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> 'fooBAR'.lower() == 'FOObar'.lower()
    True
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 470
    Points : 9 264
    Points
    9 264
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En complément de lower ou upper, on peut vouloir faire des comparaisons après avoir neutralisé les caractères accentués. Il faut dans ce cas passer par Unicode. Dis si ça t'intéresse et je peux te donner un petit code.

    On a aussi la possibilité sous Python de rechercher des mots qui se ressemblent (avec un ratio de similitude).
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Tout d'abord wiztricks, tyrtamos merci d'avoir répondu

    @wiztricks

    J'ai essayé ce que tu as proposé mais je crois qu'il y a quelque chose que j'ai pas compris car quand j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if keyword.lower() or keyword.upper in post_title:
    				print post_title.encode("utf_8") #Dev
    				print post_link, ("\n") #Dev
    				print ("range:"), range, ("\n") #Dev
    				newsletter.write (post_title.encode("utf_8") + "\n" + post_link.encode("utf_8") + "\n" + "\n")
    Il me donne en retour TOUTES les entrées dans le XML. En fait comme si je ne lui avais pas donné de mots-clés ... (par acquis de conscience j'ai vérifié quand même mais bien sûr mon mot clé n'est pas dedans)

    @tyrtamos
    Bien sûr si je peux peux améliorer mon programme je suis preneur ^^.

  5. #5
    Membre averti Avatar de cervo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 220
    Points : 388
    Points
    388
    Par défaut

    Je suis tenté de te dire essaies de comparer keyword.lower() à post_title.lower()....
    Toute chose dépend de la valeur qu'on lui attribue !

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 470
    Points : 9 264
    Points
    9 264
    Billets dans le blog
    6
    Par défaut
    Voilà une petite fonction pour enlever tous les accents sur les minuscules et les majuscules (Python 2):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import unicodedata
     
    #############################################################################
    def sans_accent(ch):
        """Supprime les éventuels accents (minuscule ou majuscule) de la chaine ch
           ch doit être en unicode, et le résultat retourné est en unicode
        """
        chnorm = unicodedata.normalize('NFKD', ch)
        return u"".join([c for c in chnorm if not unicodedata.combining(c)])
    Test d'application:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    alphanum = ur""" !"#$%&'()*+,-./0123456789:;<=>?@[\]^_`{|}~""" + \
               u"\xA0" + \
               u"€aAàÀâÂäÄåÅæÆbBcCçÇdDeEéÉèÈêÊëËfFgGhHiIîÎïÏjJ" + \
               u"kKlLmMnNoOôÔöÖœŒpPqQrRsStTuUùÙûÛüÜvVwWxXyYÿŸzZ"
     
    print alphanum
    # !"#$%&'()*+,-./0123456789:;<=>?@[\]^_`{|}~*€aAàÀâÂäÄåÅæÆbBcCçÇdDeEéÉèÈêÊëËfFgGhHiIîÎïÏjJkKlLmMnNoOôÔöÖœŒpPqQrRsStTuUùÙûÛüÜvVwWxXyYÿŸzZ
     
    print sans_accent(alphanum)
    # !"#$%&'()*+,-./0123456789:;<=>?@[\]^_`{|}~ €aAaAaAaAaAæÆbBcCcCdDeEeEeEeEeEfFgGhHiIiIiIjJkKlLmMnNoOoOoOœŒpPqQrRsStTuUuUuUuUvVwWxXyYyYzZ
    A noter qu'on peut supprimer les accents uniquement sur les majuscules ou uniquement sur les minuscules:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #############################################################################
    def sans_accent_maj(ch):
        """Supprime les éventuels accents sur les majuscules de la chaine ch
           ch doit être en unicode, et le résultat retourné est en unicode
        """
        r = u""
        for car in ch:
            carnorm = unicodedata.normalize('NFKD', car)
            carcat = unicodedata.category(carnorm[0])
            if carcat==u"Lu":
                r += carnorm[0]
            else:
                r += car
        return r       
     
    #############################################################################
    def sans_accent_min(ch):
        """Supprime les éventuels accents sur les minuscules de la chaine ch
           ch doit être en unicode, et le résultat retourné est en unicode
        """
        r = u""
        for car in ch:
            carnorm = unicodedata.normalize('NFKD', car)
            carcat = unicodedata.category(carnorm[0])
            if carcat!=u"Lu":
                r += carnorm[0]
            else:
                r += car
        return r
    Ce qui donnera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    print sans_accent_maj(alphanum)
    # !"#$%&'()*+,-./0123456789:;<=>?@[\]^_`{|}~*€aAàAâAäAåAæÆbBcCçCdDeEéEèEêEëEfFgGhHiIîIïIjJkKlLmMnNoOôOöOœŒpPqQrRsStTuUùUûUüUvVwWxXyYÿYzZ
     
    print sans_accent_min(alphanum)
    # !"#$%&'()*+,-./0123456789:;<=>?@[\]^_`{|}~ €aAaÀaÂaÄaÅæÆbBcCcÇdDeEeÉeÈeÊeËfFgGhHiIiÎiÏjJkKlLmMnNoOoÔoÖœŒpPqQrRsStTuUuÙuÛuÜvVwWxXyYyŸzZ
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    salut Cervo ,

    J'ai essayé ta méthode :
    Je suis tenté de te dire essaies de comparer keyword.lower() à post_title.lower()....
    mais le terminal me renvoie l'erreur suivante :
    if keyword.lower() in post_title.lower:
    TypeError: argument of type 'builtin_function_or_method' is not iterable
    Donc je ne crois pas que ce soit la bonne méthode

    @tyrtamos

    merci !! je vais voir ce que je peux en faire une fois que j'aurais réglé ce problème de casse !

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par SidereusNuncius Voir le message
    J'ai essayé ta méthode :
    Je suis tenté de te dire essaies de comparer keyword.lower() à post_title.lower()....
    mais le terminal me renvoie l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if keyword.lower() in post_title.lower:
    TypeError: argument of type 'builtin_function_or_method' is not iterable
    Donc je ne crois pas que ce soit la bonne méthode
    C'est la bonne méthode mais il faudrait être un peu plus rigoureux dans ce que vous recopiez et/ou apprendre à programmer Python (il y a des tutos) i.e. faire des exercices pour voir comment çà se comporte, apprendre à décoder les messages d'erreur qui remontent,...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Autant pour moi ça fonctionne effectivement si on définit keyword.lower() et post_title.lower() hors du while

    il faudrait être un peu plus rigoureux dans ce que vous recopiez et/ou apprendre à programmer Python (il y a des tutos) i.e. faire des exercices pour voir comment çà se comporte, apprendre à décoder les messages d'erreur qui remontent,...
    Et effectivement wiztricks je suis débutant .. je fais du python seulement depuis une semaine. Et pas vraimenet dans le cadre de mes loisirs personnels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment créer une contrainte UNIQUE insensible à la casse ?
    Par pavlo_id dans le forum Administration
    Réponses: 3
    Dernier message: 08/02/2011, 14h53
  2. [Réseau] Créer une connexion Internet
    Par Tranber dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 17/10/2002, 17h01
  3. créer une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    Réponses: 3
    Dernier message: 01/10/2002, 16h48
  4. Créer une fenêtre flottante qui ne peut avoir le focus
    Par BestofMac dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 10h46
  5. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo