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 :

regexp python extraire


Sujet :

Python

Vue hybride

ekremyilmaz regexp python extraire 05/03/2009, 21h11
ekremyilmaz c cool ;) , j'ai réussi avec... 05/03/2009, 21h34
cyrull salut, je te déconseil... 06/03/2009, 12h09
cyrull PS : avec ton expression,... 06/03/2009, 12h11
cyrull PS 2 : je ne sais pas quel... 06/03/2009, 13h56
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut regexp python extraire
    Bonjour,
    j'ai un ensemble de chaine qui ressemble à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    %{Chapitre,chapitrer.V+z2:P1s:P3s:S1s:S3s:Y2s}
    %{I,i.N+z1:ms:mp}
    %{DANS,dans.PREP+Dnom+z1}
    %{LEQUEL,lequel.DET+'Dnom'+z1:ms}
    %{si,.CONJS+z1}
    %{se,.PRO+PpvLE+z1:3fs:3ms:3fp:3mp}
    %{ACCEPTENT,accepter.V+z1:P3p:S3p}
    j'aimerai récupérer 3 mots :

    Chapitre puis Chapitrer puis V
    I puis i puis N
    DANS dans PREP

    En fait je cherche à recupérer les mots après le { puis entre la , et . et le mot juste après .

    avez vous une idée d'expression régulière ?

    merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    c cool , j'ai réussi avec la doc, à faire une regexp

    pour info si un jour ça sert à qqn :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    t = "%{Chapitre,chapitrer.V+z2:P1s:P3s:S1s:S3s:Y2s}"
    m = re.search(r"(\w+)\,(\w+).(\w+)", t)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut
    salut, je te déconseil d'utiliser les \w et autres dont tu ne maitrise pas forcément le contenu.
    Surtout en matière de TAL, où tu vas vite te retrouver confronté à des problèmes avec les lettres accentuées etc.
    Essaie plutôt de te créer tes propres groupes en définissant des variables :
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ponctuation = 'u'[ \'"«»\#\.\?,;:!\(\)\[\]\|]+''
    Ou alors, il faut utilser la définition de LOCALE qui te permet de spécifier l'encodage utilisé sur ta machine et donc ce à quoi correspond exactement \w.
    De toutes les manières, dans ton cas, le plus simple consiste à utilser le . puisque ce que tu veux, c'est tout entre le { et la , puis entre la , et le .

    D'autre part, si ta virgule n'a pas besoin d'être backslashée, ce n'est pas le cas de ton point. Tu aurais donc plutôt dû faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m = re.search(r"(\w+),(\w+)\.(\w+)", t)
    Ensuite, évite les opérateurs gourmand comme tu le fais. En effet, par défaut, les expressions régulières cherchent la solution la plus longue possible.
    Il vaut mieux utiliser les opérateurs + et * avec ? (.+? ou .*?), ce qui signifie que tu cherches le plus petit groupe matchant ton expression.

    Pour finir, compile plutôt tes motifs de recherche. Les expressions régulières ne sont pas particulièrement efficaces de manières générales (une expression régulière simple comme la tienne mets 5 à 10 fois plus de temps à obtenir un résultat qu'une recherche avec des find et des extractions de chaine). Alors si en plus tu ne les compiles pas, ça peut devenir l'horreur.
    Pour compiler, c'est simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    t = "%{Chapitre,chapitrer.V+z2:P1s:P3s:S1s:S3s:Y2s}"
    motif = "(\w+),(\w+)\.(\w+)"
    motifCompile = re.compile(motif)
    reponse = re.search(motifCompile, t)
    En définitive, le code est un peu plus long, mais mieux maîtrisé et plus efficace. Dans ton cas, j'aurais écrit tes deux lignes de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        motif = '(.+?),(.+?)\.(.+?)\+'
        motifCompile = re.compile(motif)
     
        t = "%{Chapitre,chapitrer.V+z2:P1s:P3s:S1s:S3s:Y2s}"
        m = re.search(motifCompile, t)
    voilà, bonne chance avec tout ça, tu verras que les expressions régulières deviennent vite des usines à gaz mais qu'elles sont quand même très pratiques de manière générale.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut
    PS :

    avec ton expression, sur la chaine %{si,.CONJS+z1} tu ne récupère rien alors qu'avec des * à la place des + tu aurais eu si, rien, CONJS comme réponse.

    => m = re.search(r"(\w*),(\w*)\.(\w*)", t)

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut
    PS 2 : je ne sais pas quel analyseur donne ce genre de sorties mais il me semble bizare que Chapitre soit considéré comme la forme fléchie de Chapitrer et non comme un nom commun !

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je suis entièrement d'accord avec cyrull sur tous ses points. Je n'ai pas eu le courage de les écrire.
    Et particulièrement sur celui-ci dont je me suis aperçu avec la pratique:
    «une expression régulière simple comme la tienne mets 5 à 10 fois plus de temps à obtenir un résultat qu'une recherche avec des find et des extractions de chaine»

    J'ajoute juste une chose : l'utilisation du mot commun groupe dans les regex porte à se méprendre sur la fonction réelle des parenthèses délimitant des groupes dans les regex.
    Ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    motif = '.+?,.+?\..+?\+' 
    #va produire le même résultat que 
    motif = '(.+?),(.+?)\.(.+?)\+' 
    #sur la chaine 
    t = "%{Chapitre,chapitrer.V+z2:P1s:P3s:S1s:S3s:Y2s}"
    dans le code que tu donnes en exemple, cyrull.
    Il ne faut pas se laisser tromper par l'apparente bizarrerie de la succession \.. en l'absence de parenthèses.
    J'espère enfoncer une porte ouverte, mais je ne suis pas sûr que ce soit le cas....

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/01/2013, 21h13
  2. [Syntaxe ?] Regexp en Python
    Par Thomus38 dans le forum Général Python
    Réponses: 1
    Dernier message: 21/08/2007, 14h43
  3. Regexp: extraire du texte entre deux balises
    Par moook dans le forum Langage
    Réponses: 11
    Dernier message: 19/06/2007, 18h08
  4. [RegExp] Extraire le texte entre 2 balises
    Par d1g-2-d1g dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/02/2007, 19h15
  5. extraire chiffre avec regexp
    Par chillansky dans le forum ASP
    Réponses: 1
    Dernier message: 17/08/2006, 10h28

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