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

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

  7. #7
    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
    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 !
    �a vient du logiciel Unitex.
    Mais merci pour toutes vos remarques !!!

    c'est vrai que les expressions r�guli�res �a devient vite lourd, mais parfois, �a aide bien !!

  8. #8
    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
    � mon avis, elles doivent �tre utilis�e pour modeliser les choses, mais d�s lors qu'il faut rendre le r�sultat efficace (en TAL, on a vite des corpus en centaine de millier de mots), il n'est plus question de faire autrement qu'avec les fonctions de string.

  9. #9
    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
    Citation Envoy� par eyquem Voir le message
    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....
    �a ne va pas donner tout � fait le m�me r�sultat. En effet, sans les parenth�ses, tu ne peux que r�cup�rer le r�sultat de l'expression enti�re via un m.group(0) alors qu'avec les parenth�ses, m.group(0) donne le m�me r�sultat, mais tu as en plus acc�s � m.group(1), m.group(2) ... correspondant � chacunes de tes parenth�ses.
    Ton expression ne peut donc ramener que {Chapitre,chapitrer.V+ alors que la mienne va pouvoir te donner le m�me r�sultat ou alors Chapitre pour m.group(1), chapitrer pour m.group(2) et V pour m.group(3) ce qui doit beaucoup correspondre � ta volont� initiale.

  10. #10
    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
    pour �tre complet, dans ton cas, un code du type suivant serait plus simple � exploiter :

    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
    # -*- coding: cp1252 -*-
    import re
     
    motif = '{(.+?),(.+?)\.(.+?)\+'
    motifCompile = re.compile(motif)
     
    t = '''%{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}
    '''
     
    m = re.findall(motifCompile, t)
     
    print m
    m sera alors la liste de tuples suivante :
    [('Chapitre', 'chapitrer', 'V'), ('I', 'i', 'N'), ('DANS', 'dans', 'PREP'), ('LEQUEL', 'lequel', 'DET'), ('ACCEPTENT', 'accepter', 'V')]

  11. #11
    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
    On est bien d'accord, cyrull.
    En fait, je n'avais pas fait bien attention � ce que cherchait ekremy (il parait que ce qu'on trouve est plus important que ce qu'on cherche uhuh) (en regardant, je vois qu'il ne dit d'ailleurs pas sous quelle forme il veut obtenir ses 3 mots: liste, tuple, chaine, dico ?)
    J'ai pens� � la va-vite chercher toutes les chaines situ�es entre { et + et les traiter ult�rieurement en fonction du besoin.
    �tant dans le m�me esprit que toi par rapport aux regex, je pensais ainsi qu'utiliser le motif '{.+?,.+?\..+?\+' au lieu du motif '{(.+?),(.+?)\.(.+?)\+' all�gerait le travail de la regex.

    Mais c'est plus vite pens� que fait. Concr�tement si on veut spliter les chaines obtenues, il faut � nouveau utiliser une fonction de re puisqu'il y a deux s�parateurs, ou une autre astuce, et comme le fonctionnement de findall produit un r�sultat diff�rent quand il n'y a pas de groupes d�finis dans le motif, je suis oblig� de rajouter des lookaround assertion pour ne pas trainer { et + dans les chaines extraites.
    C'est amusant aussi, et avec des list comprehension �a passe mieux, mais c'est lourdingue quand m�me:
    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
    # -*- coding: cp1252 -*-
    import re
    t = '''%{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}
    '''
    resa = [ re.split(',|\.',u)\
             for u in re.findall('(?<={).+?,.+?\..+?(?=\+)', t) ]
     
    resb = [ w.replace(',','.').split('.')\
             for w in re.findall('(?<={).+?,.+?\..+?(?=\+)', t) ]
     
    print resa,'\n\n',resb
    S'il tient � utiliser une regex, ta m�thode avec findall() et ton motif convient beaucoup mieux.


    Sinon je suis du m�me avis que toi: dans un cas pareil je me passerais de regex:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # -*- coding: cp1252 -*-
    t = '''%{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}
    '''
    print [ u[2:].partition('+')[0].replace(',','.').split('.')\
            for u in t.splitlines() ]

  12. #12
    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
    oups, grand observateur que je suis, je n'avais pas vu que j'avais 2 interlocuteurs. D�sol� Eyquem. Je pensais que tu �tais ekremyilmaz et que tu tatonnais.
    Et nous sommes effectivement d'acord sur les expressions r�guli�res.
    Il n'y a qu'un truc que je n'ai pas test� : l'efficacit� du findall par rapport aux fonctions de string tant que l'expression r�guli�re reste simple.
    En effet, dans ce cas l�, il faut compter � la fois le temps de recherche et le temps de stockage des r�ponses.

  13. #13
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Par d�faut
    Je vais juste me permettre d'ajouter une chose quand � l'utilisation du re.compile() des expression r�guli�res.

    Je pense que les deux experts maitrises bien le sujet et sont au courant mais la fa�on dont cela a �t� dit plus haut peu pr�ter � confusion. A savoir qu'une regexp sera forcement compil�e, et ce qu'ait �t� appel� re.compile() de fa�on explicite ou pas.
    Dans le cas d'un appel direct a re.search(pattern, string) le d�roulement ce fait en 2 phase:
    1. Compiler le pattern de l'expression r�guli�re.
    2. Faire la recherche des r�sultats.


    Le gain en temps CPU de la fonction compile vient du fait que l'on cherche souvent � appliquer la m�me expression r�guli�re � plusieurs chaines de caract�res et que dans le cas ou l'on va r�utiliser le r�sultat de "re.compile", la premi�re phase va pouvoir �tre sauter pour ne faire que la 2�me partie.
    Ainsi l'expression ne sera compil�e qu'une unique fois au lieu de le faire � chaque fois que l'on va faire une recherche.

    On voit m�me dans la doc une note assez int�ressante :
    Note: The compiled versions of the most recent patterns passed to re.match(), re.search() or re.compile() are cached, so programs that use only a few regular expressions at a time needn�t worry about compiling regular expressions.
    Ou le gain de re.compile() se voit encore plus restreint puisque le caching du r�sultat se fait automatiquement dans certains cas. Mais les 'certains cas' restent � �tre analys�s et d�finies pr�cis�ment.

+ 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