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 :

Explication de code - RE


Sujet :

Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut Explication de code - RE
    Bonjour tout le monde!

    On m'a filé un code pour m'en inspirer... a priori, ça parle d'expressions régulières mais je ne le comprends pas! Quelqu'un pourrait-il me l'expliquer ou me le commenter, please?

    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
     
    import re
    some_string='-</th></tr> <tr><th>12  -</th></tr> <tr horiz="no" hight=45><th>34 '
    re_buildnr=re.compile(r'-</th></tr> <tr[ 0-9a-zA-Z="]*><th>(?P<buildnr>\d+)')
    match_buildnr=re_buildnr.search(some_string)
    print type(match_buildnr)
    if match_buildnr == None:
    	log.p('Error:   Due to change in URL format, no build information was retrieved from URL: %s' % (url))
    	sys.ex(1)
     
    while match_buildnr != None:
    	startpos=match_buildnr.start()+1
    	newest_buildnr=match_buildnr.group('buildnr')
    	newest_buildnr=int(newest_buildnr)
    	print "100*nr is %i" % (newest_buildnr*100)
    	match_buildnr=re_buildnr.search(some_string, startpos)
    Sinon, ce code est fait pour m'aider à parcourir un string pour retrouver dedans tous les "resultats" de mon expression régulière.

    Merci

    deedoo...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Points : 402
    Points
    402
    Par défaut Re: Explication de code - RE
    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
     
    import re
    # Ta string
    some_string='-</th></tr> <tr><th>12  -</th></tr> <tr horiz="no" hight=45><th>34 '
    # Ton expression régulière compilée
    re_buildnr=re.compile(r'-</th></tr> <tr[ 0-9a-zA-Z="]*><th>(?P<buildnr>\d+)')
    # Cherche dans ta string, la première occurence de ton exp.
    match_buildnr=re_buildnr.search(some_string)
    print type(match_buildnr)
    # Si ton exp n'est pas trouvée dans ta string (résultat du search = None)
    # Message d'erreur. Par contre le msg ne ve rien dire ... il parle d'url alors 
    # que tu ne t'en sert pas.
    if match_buildnr == None:
    	log.p('Error:   Due to change in URL format, no build information was retrieved from URL: %s' % (url))
    	sys.ex(1)
     
    # Tant que ton exp est trouvée, boucle et contine de la chercher dans ta string.
    # a chaque fois qu'il la trouve, il converti le résultat en int et l'affiche multiplié par 100.
    while match_buildnr != None:
    	startpos=match_buildnr.start()+1
    	newest_buildnr=match_buildnr.group('buildnr')
    	newest_buildnr=int(newest_buildnr)
    	print "100*nr is %i" % (newest_buildnr*100)
    	match_buildnr=re_buildnr.search(some_string, startpos)
    "There are two major products that come out of Berkeley: LSD and UNIX.
    We don't believe this to be a coincidence."
    - Jeremy S. Anderson

    La FAQ Python
    Les cours et tutoriels pour apprendre Python
    Le Forum Python

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    merci...c déjà un peu plus clair!

    mais pourquoi on compile l'expression régulière, ça représente quoi "buildnr" et pourquoi c'est là dans l'espression régulière et on le rapelle plus bas?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Points : 402
    Points
    402
    Par défaut
    Pour utiliser une expression régulière tu as 2 moyen :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    re.search ('tonexp', 'tastring')
    ou
    buildre = re.compile ('tonexp')
    buildre.search ('tastring')
    Si tu dois utiliser une expression régulière plusieurs fois (comme c'est le cas), il est fortement conseillé de la compiler. Tu y gagnera en temps d'execution. Regarde dans la doc si tu veux plus de détail.

    Pour ce qui est de buildnr, voici l'explication de la doc :

    (?P<name>...)
    Similar to regular parentheses, but the substring matched by the group is accessible via the symbolic group name name. Group names must be valid Python identifiers, and each group name must be defined only once within a regular expression. A symbolic group is also a numbered group, just as if the group were not named. So the group named 'id' in the example above can also be referenced as the numbered group 1.

    For example, if the pattern is (?P<id>[a-zA-Z_]\w*), the group can be referenced by its name in arguments to methods of match objects, such as m.group('id') or m.end('id'), and also by name in pattern text (for example, (?P=id)) and replacement text (such as \g<id>).
    En gros, c'est une étiquette utilisée pour nomer le résultat. Ainsi lorsque tu le récupère, tu peut utiliser l'étiquete monresult.group ('etiquete') plutot que monresult.group (1). C'est ce qui est fait ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       newest_buildnr=match_buildnr.group('buildnr')
    Ton exp c'est (?P<buildnr>\d+) donc ton résultat sera toujours un nombre (\d+ -> Suite de chiffres)
    J'espère que c'est clair ...
    "There are two major products that come out of Berkeley: LSD and UNIX.
    We don't believe this to be a coincidence."
    - Jeremy S. Anderson

    La FAQ Python
    Les cours et tutoriels pour apprendre Python
    Le Forum Python

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    donc moi si je cherche dans un paragraphe l'expression regulière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [ ,.\(][ARNDCEQGHILKMFPSTWYV][0-9]+[ARNDCEQGHILKMFPSTWYV][ ,.\)]
    je mets un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def read_mut2(doc):
         mutation2 = re.compile("[ ,.\(][ARNDCEQGHILKMFPSTWYV][0-9]+[ARNDCEQGHILKMFPSTWYV][ ,.\)]")
         return mutation2.search(doc)
    Mais après quand je veux chercher une 2ème occurence, j'ai rien du style 'buildnr'... ou alors je suis sur la mauvaise voie ou je comprends rien du tout c'est possible aussi! Au autre problème, je sais pas comment parcourir mon paragraphe mais ça doit surement se faire grace à un 'while' comme dans le première code.

    je sais pas si j'ai été très clair...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Points : 402
    Points
    402
    Par défaut
    Citation Envoyé par deedoo
    je mets un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def read_mut2(doc):
         mutation2 = re.compile("[ ,.\(][ARNDCEQGHILKMFPSTWYV][0-9]+[ARNDCEQGHILKMFPSTWYV][ ,.\)]")
         return mutation2.search(doc)
    Ouais, sauf que le retour de la fonction n'est pas exploitable tel quel ! C'est un objet qui est retourné par la fonction search. Si tu veux le résultat il faudra utiliser la fonction group :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    res = read_mut2(doc)
    res.group (0)

    Citation Envoyé par deedoo

    Mais après quand je veux chercher une 2ème occurence, j'ai rien du style 'buildnr'... ou alors je suis sur la mauvaise voie ou je comprends rien du tout c'est possible aussi! Au autre problème, je sais pas comment parcourir mon paragraphe mais ça doit surement se faire grace à un 'while' comme dans le première code.

    je sais pas si j'ai été très clair... :P
    Si tu veux rechercher toutes les occurence de ton exp dans un texte, utilise plutot la fonction findall que des search les uns derière les autres ![/code]
    "There are two major products that come out of Berkeley: LSD and UNIX.
    We don't believe this to be a coincidence."
    - Jeremy S. Anderson

    La FAQ Python
    Les cours et tutoriels pour apprendre Python
    Le Forum Python

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bon, j'ai un autre problème maintenant... Savez-vous comment serait-il possible de coder une fonction générant des expressions régulières? En fait, j'ai un fichier texte où sont rassemblées beaucoup de données et pour chacunes d'elles, il me faut créer une expresison régulière pour une recherche dans un autre texte...

    Merci de votre aide car pour l'instant je suis complètement dans le flou...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Points : 402
    Points
    402
    Par défaut
    T'as un exemple ?
    "There are two major products that come out of Berkeley: LSD and UNIX.
    We don't believe this to be a coincidence."
    - Jeremy S. Anderson

    La FAQ Python
    Les cours et tutoriels pour apprendre Python
    Le Forum Python

  9. #9
    Membre régulier
    Avatar de Miksimus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 84
    Points
    84
    Par défaut Kodos
    Bonjour,

    Je rappelle juste qu'il y a un logiciel bien pratique pour les expressions régulières en Python :
    http://kodos.sourceforge.net/
    voilà...

    D'autre part, pour ta réponse, si la séléction n'est pas trop compliqué, tu peux faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    deb = "debut de ma séléction"
    fin = "fin de ma séléction"
    def read_mut2(doc, deb, fin):
         mutation2 = re.compile(deb + "(.*)" + fin)
         ...
    C'est très général mais bon...

  10. #10
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Hey!

    Bon alors merci pour ces réponses...et voici des explications!

    Je sais bien pour Kodos mais c'est pas du tout ce que je veux faire!
    Je le refais avec des exemples ça sera surement plus clair car je vous avoue que c'est pas toujours simple pour moi non plus!

    J'ai un fichier texte dont voici les premières lignes en exemple:
    P08908 5-HT<sub>1A</sub> 5-hydroxytryptamine 1A receptor 5-HT-1A|Serotonin receptor 1A|5-HT1A|G-21|5-HT1a receptor|ADRB2RL1, ADRBRL1|G protein coupled receptor|guanine nucleotide-binding regulatory protein-coupled receptor HTR1A 5-HT1A|ADRBRL1|ADRB2RL1
    P28222 5-HT<sub>1B</sub> 5-hydroxytryptamine 1B receptor 5-HT-1B|Serotonin receptor 1B|5-HT1B|5-HT-1D-beta|Serotonin 1D beta receptor|S12 HTR1B HTR1DB|S12|5-HT1B|HTR1D2|HTR1DB|5-HT1DB
    A partir de ça, je dois écrire une fonction qui me permette de générer une expression régulière de chaque "morceau". Par exemple, pour le premier, un truc du genre "5[^A-Za-z][Hh][Tt][^A-Za-z]1[^A-Za-z][Aa]".
    Vous voulez peut-être un pourquoi à tout ça! Alors, je dois rechercher dans des paragraphes des récepteurs qui ont plusieurs dénominations possibles... (les codes commençant pas P... sont les codes internationaux que je devrais afficher).

    Je sais pas si c'est plus clair pour vous mais n'hésitez pas pour d'autres explications!...

  11. #11
    Membre régulier
    Avatar de Miksimus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 84
    Points
    84
    Par défaut
    En fait, je crois que je ne comprends pas ce que tu veux sélectionner...

    Voilà ce que j'ai compris (dis-moi si je me plante complètement) :
    Tu rentres dans ta fonction par exemple "5-hydroxytryptamine 1A receptor" et tu veux récuperer "P08908" et l'afficher, c'est ça ?

    Ou alors un truc du genre :
    si on trouve plusieurs nom pour P08908
    alors on affiche P08908

    Suis-je un peu dans le vrai ou ma tête s'est véritablement obscurcie ?

    Si c'est le cas, sort moi de l'ombre...

  12. #12
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    euh...ouais c'est rpesque ça!

    Je récupere un paragraphe de texte et dedans il y a des récepteurs mais ils peuvent être écrit n'importe comment (comme les exemples que j'ai donnés). De là, il faut que je les retrouve et que j'affiche le code international. Et on m'a demandé de faire une fonction qui génère des expressions régulières pour chaque "morceau" du fichier texte.
    Comme je suis pas du tout experte en expression régulière (j'ai beau lire les liens que vous me donnez, ça reste bien bien flou!), c'est un peu compliqué!

    C'est mieux?

  13. #13
    Membre régulier
    Avatar de Miksimus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 84
    Points
    84
    Par défaut capté!
    Ca y est j'ai compris !! (je suis parfois lent du cerveau...)

    donc ce que tu veux c'est que l'expression régulière s'adapte à la recherche en gros...

    Qu'est-ce qui change tout le temps dans tes formules ?
    Pour reprendre ton expression régulière : 5[^A-Za-z][Hh][Tt][^A-Za-z]1[^A-Za-z][Aa]
    Je suppose ici que les parties en bleu ne changerons pas quelque soit l'expression régulières générée.
    Si tel est le cas, on peut essayer de faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    numero1 = "5"
    lettre1 = "H"
    lettre2 = "T"
    numero2 = "1"
    lettre3 = "A"
    def read_mut2(doc, numero1, lettre1, lettre2, numero2):
         mutation2= re.complie( numero1 + "-.*?" + lettre1 + ".*?" + lettre2 + ".*?" + numero2 + ".+?" + lettre3
         ...
    Je m'explique : .*? selectionne touts les caractères jusqu'au premier caractère suivant trouvé :
    .*?C dans : voila c'est bien cool
    .*C dans : voila c'est bien cool
    (selection en bleu)

    Cependant ça marche pas mal mais pas pour toutes tes formules...
    Mais ce qui serai bien c'est que tu puisse modifier le fichier texte pour y inserer des caractères de séparation entre les formules... Mais je pense que non seulement ce texte doit être énorme et d'autre part c'est un texte qu'on te fourni...?

    C'est un début...

  14. #14
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Je vous remercie pour votre aide... je garde tout sous le coude car je suis pas là la semaine prochaine mais je vais tester tout ce que vous m'avez donner.
    Je vous tiens au courant de mon avancement et je vous demanderais surement encore de l'aide...
    Ciao
    deedoo...

  15. #15
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Boujour...me voilà de retour!

    J'ai réglé mon problème de cherhce de mutations dans les résumés et les titres. Il faut juste que je stocke tout ça dans nun fichier mais ça devrait pas être trop dur...

    Pour ce qui est des expressiosn régulières, c'est une autre histoire! J'ai récupéré mes morceaux de lignes mais je bloque toujours sur la même chose...le parcours de la chaîne de caractère pour remplacer!
    Je m'explique. Je récupère:
    Et je veux le transformer en une expression régulière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    5[^A-Za-z]*HT[^A-Za-z]*1[^A-Za-z]*A
    J'ai commencé ce code mais je vois pas comment continuer.
    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
    import re
     
    def read_doc () : 
        f = open ("receptors2.txt", "r")
        a = f.readlines ()
        return a
     
    c = read_doc () 
     
    def read_receptor (doc,pos) :
        research = re.compile("[ |-|<sub>|</sub>]")
        return research.search(doc,pos)
     
    def main () :
        i = 0
        while i != len (c) : 
            b = c[i].split ("\t") 
            while b != None : 
                if read_receptor (b[i],1) :
                     ????....
            i = i + 1
     
    main()
    Je sais que je bloque toujours sur la même chose car je m'étais posée la même question pour la recherche des mutations...

    Avez-vous une solution pour moi ou des explications pour que je puisse continuer?

    Merci...

  16. #16
    Membre régulier
    Avatar de Miksimus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 84
    Points
    84
    Par défaut
    Bonjour deedoo !
    ça faisait longtemps !


    Ok d'accord, donc en fait tu veux que ton programme, en parcourant ton fichier texte, crée tout seul une expression régulière en fonction de ce qu'il a trouvé, c'est ça ?

    Note : juste au passage, ça n'a rien à voir avec ton problème mais un truc qui est bien c'est qu'au lieu de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while i != len (c) : 
       ...
       i = i + 1
    on peut le remplacer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in range(len(c)):
       ...
    ce qui me paraît plus simple car en plus le "i" s'incrémente tout seul...

    sinon, pour ton "vrai" problème, je cherche...


  17. #17
    Membre régulier
    Avatar de Miksimus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 84
    Points
    84
    Par défaut peut-être une idée...
    Ce qui pourrait être utile, c'est sélectionner chaque parties de ta première ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    P08908 5-HT<sub>1A</sub> 5-hydroxytryptamine 1A receptor 5-HT-1A|Serotonin receptor 1A|5-HT1A|G-21|5-HT1a receptor|ADRB2RL1, ADRBRL1|G protein coupled receptor|guanine nucleotide-binding regulatory protein-coupled receptor HTR1A 5-HT1A|ADRBRL1|ADRB2RL1
    c-a-d d'avoir un retour comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    selection = ("5-HT<sub>1A</sub>", "5-hydroxytryptamine 1A", "5-HT-1A", etc...)
    puis par la suite de faire une différence entre chacune de ces parties afin que le programme reconnaîsse les caractères qui ne bougent pas... Ce doit être la partie la plus dure, alors avant de se plonger dedans, j'aimerai savoir si cette solution te conviens ?


  18. #18
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Oui c'est complètement ça!

    Pour la séparation des parties, il y a déjà une 1ère partie de faite avec:
    Mais, pour les termes séparés par "|", il faut faire un autre .split("|") je pense.

    Après, pour le remplacement, je sais pas trop comment faire!

  19. #19
    Membre régulier
    Avatar de Miksimus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 84
    Points
    84
    Par défaut séparation
    Ok, mais...

    ...Pourquoi toutes les formules ne sont pas séparée de la même manière ?

    ça complique quand même vachement les choses !

    EDIT: ... quoique

  20. #20
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    je n'en ai aucune idée! On m'a donné le fichier comme ça, je m'adapte!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Explication du code suivant
    Par dp33 dans le forum Access
    Réponses: 2
    Dernier message: 05/06/2006, 11h45
  2. Explication de code
    Par sacco dans le forum C
    Réponses: 2
    Dernier message: 12/04/2006, 23h13
  3. Explication de code
    Par claralavraie dans le forum Linux
    Réponses: 1
    Dernier message: 20/03/2006, 09h58
  4. Shell - Explication de code
    Par claralavraie dans le forum Linux
    Réponses: 13
    Dernier message: 13/01/2006, 16h03
  5. Explication de code simple
    Par Clad3 dans le forum OpenGL
    Réponses: 3
    Dernier message: 20/03/2005, 11h31

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