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 :

[Biopython] Comment recuperer la taxonomie?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Mydriaze
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Par défaut [Biopython] Comment recuperer la taxonomie?
    Bonjour à tous,

    J'ai un probleme bête (encore) d'expression réguliere ..

    Je veux parser un fichier genbank pour en recuperer entre autre la taxonomie.
    Or comme celle-ci se trouve sur plusieurs lignes les codes les autres codes ne marchent pas..

    Donc pour celui-là je recupere l'entree en XML .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            handle = Entrez.efetch(db = "Nucleotide", id=identifiant, rettype="xml")
            result = handle.read()
            print  result
    J'obtiens un truc du style :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    ...
     
                            </OrgName_mod>
                            <OrgName_lineage>Eukaryota; Metazoa; Arthropoda; Hexapoda; Insecta; Pterygota; Neoptera; Endopterygota; Hymenoptera; Apocrita; Aculeata; Apoidea; Apidae; Apis</OrgName_lineage>
                            <OrgName_gcode>1</OrgName_gcode> ...
    ....
    je voufrais recuperer tout ce qui est entre

    <OrgName_lineage> et </OrgName_lineage>


    J'essaye de faire qqch comme :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    taxonomie = (re.search("<OrgName_lineage>([\w\s\n]+)",result)).group(1)
    mais ça donne :

    ou


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    taxonomie = (re.search("<OrgName_lineage>([\w\s\n]+</OrgName_lineage>", result)).group(1)
    et ça donne

    AttributeError: 'NoneType' object has no attribute 'group'

    Je ne sais pas comment faire ...

    Est-ce que quelqu'un aurait une idee s'il vous plait?

    Merci ppar avance.

  2. #2
    Membre confirmé Avatar de Mydriaze
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Par défaut
    Bon, je vous remercie !!!

    Vous avez resolu mon pb!

    En editant le poste je viens de voir que la taxonomie etait sur une seule ligne. le retour à la ligne etait reel qd je faisais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    handle = Entrez.efetch(db = "Nucleotide", id=identifiant, rettype="gb")
    Qd j'ai changé pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    handle = Entrez.efetch(db = "Nucleotide", id=identifiant, rettype="xml")
    j'avais le meme retour à la ligne mais à cause de la largeur de la console... lol

    donc ça venait juste du fait que je n'avais pas mis le ";" ds les expression reguliere..




    Maintenant j'ai tout bien !

    MERCI !!

  3. #3
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par Mydriaze Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    taxonomie = (re.search("<OrgName_lineage>([\w\s\n]+</OrgName_lineage>", result)).group(1)
    C'est déjà plus proche de la solution que la première proposition

    La raison pour laquelle tu tombes sur cette erreur de "None has no attribute...", c'est parce que d'une part ta regex contient une erreur, et d'autre part qu'il se peut qu'elle ne match pas.

    Construisons cette regex:
    On a, comme tu l'as bien mis, "<OrgName_lineage>" et sa fermante de part et d'autre de la chaîne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <OrgName_lineage></OrgName_lineage>
    Entre les deux, des caractères, des blancs, des passages à la ligne... bref un peu de tout, sauf une balise fermante. Tout sauf un "<" s'exprime en ces termes simples:
    En mettant un répétiteur derrière, ainsi que des parenthèses pour récupérer le groupe, ça nous amène à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <OrgName_lineage>([^<]+)</OrgName_lineage>
    Et voilà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Autant ne compiler la regex qu'une fois, on gagnera du temps
    pattern = re.compile(r"<OrgName_lineage>([^<]+)</OrgName_lineage>")
     
    for item in pattern.findall(theXMLData):
        print item
    Edit: erf, l'auteur du post s'est aidé lui-même avant que je n'aie le temps de poster :p

  4. #4
    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
    À mon avis, il y a confusion.



    On peut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.compile(r"<OrgName_lineage>([^<]+)</OrgName_lineage>")
    seulement si l’on sait qu’il n’y a jamais de carcatère ’<’ dans le contenu de l’élément.

    Auquel cas, il est tout à fait identique d’écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.compile(r"<OrgName_lineage>([^<]+)<")
    Mais d’où vient cette restriction sur ’<’ ??





    Toutefois, on peut capter le contenu de l’élément sans se préoccuper de ce qui peut constituer ce contenu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.compile(r"<OrgName_lineage>(.+)</OrgName_lineage>")
    parce que le contenu de l’élément ne peut pas contenir la chaîne de sa balise fermante.....

    Mais on peut même écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.compile(r"<OrgName_lineage>(.+)<")
    parce que le répétiteur + est greedy = glouton: il va progresser au maximum dans la chaîne traitée pour ne s’arréter que devant la fin de chaîne ou devant un caractère newline. Bien sûr s’il va aussi loin, la RE "<OrgName_lineage>(.+)<" ne matchera pas
    ==> la plus grande chaîne qui matchera avec "<OrgName_lineage>(.+)<" sera celle qui s’arrêtera au dernier ’<’ dans la chaîne et c’est ce qui permet d’obtenir le résultat voulu.
    Résultat susceptible de contenir des ’<’ en son sein, cette fois.

    Mais il ne faut évidemment pas que le mode MULTILINE soit activé.

  5. #5
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par eyquem Voir le message
    On peut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.compile(r"<OrgName_lineage>([^<]+)</OrgName_lineage>")
    seulement si l’on sait qu’il n’y a jamais de carcatère ’<’ dans le contenu de l’élément.
    XML requiert qu'il n'y ait pas ce caractère dans le texte. Il doit être remplacé par &lt;
    De plus, et tout le monde semble l'ignorer, les . (points) doivent être évités à tout prix dans les regex. Ils représentent tout simplement une source de bug et une catastrophe niveau performance.

  6. #6
    Membre confirmé Avatar de Mydriaze
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Par défaut
    Rhoooo là là là ...21h16, 23h26, 23h56 ... Vous êtes graves les garçons.... lol

    Bon, en tout cas, Merci infiniment pour votre aide!!!

    Apparement il n'y aurait que des lettres, des chiffres, des espaces, le ";" , le "-" ... , (à priori pas de points?)
    ...

    Donc j'ai fini par ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    taxonomie = (re.search("<OrgName_lineage>([\w\s;-]+)",result3)).group(1)
    qui a marché . Il ne fallait pas oublier le ";" ... A partir de là , il prend tout jusqu'au "<" puisqu'il n'est pas ds la regex.

    Mais effectivement c'etait bien plus simple de mettre [^<] . Donc j'ai remplacé. et ça marche nickel ! MERCI !

    Par contre je ne compile jamais les regex. Je n'ai jamais compris à quoi ça servait ... apparemment ça marche bien sans ... enfin je crois...

  7. #7
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Oui, ça marche tout aussi bien sans.
    Quand tu fais une recherche "sans la compiler", elle est compilée en interne.
    Autrement dit, elle est compilée pour chaque recherche. Ca représente une perte de temps

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/06/2005, 16h17
  2. Réponses: 3
    Dernier message: 04/02/2004, 18h35
  3. Réponses: 2
    Dernier message: 19/01/2004, 12h19
  4. comment recuperer le nom des champs ?????
    Par e11137 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 09/01/2004, 10h00
  5. comment recuperer une variable dans flash
    Par krépuscul dans le forum Flash
    Réponses: 30
    Dernier message: 16/10/2003, 09h40

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