Aide expression reguliere python

Fermé
nifaste83 Messages postés 7 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 3 janvier 2010 - 2 déc. 2009 à 23:51
nifaste83 Messages postés 7 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 3 janvier 2010 - 3 déc. 2009 à 09:07
Bonjour,
Bonsoir tout le monde, je suis debutante en python et j'ai un problème d'expression regulière :
En fait, je dois recuperer le code HTML de la page d'un site, et recuperer une information. Ca se presente de la forme :

plein de choses qui ne m'interesse pas ..... " identifier"="Nom du domaine ( info que je veux recuperer)" .... plein de choses qui ne m'interesse pas.

La chose que j'aimerai recuperer est dans une liste un peu bizare ( je n'ai jamais fait de programmation web) du style :

var layout = [{"length":"415","regions":[{"modelStart":"2","modelEnd":"78","colour":"#2dcf00","endStyle":"jagged","end":101,"display":true,"startStyle":"jagged","aliEnd":"99","modelLength":"81","text":"PDZ","href":"/family/PF00595","type":"pfama","metadata":{"scoreName":"e-value","score":"2.5e-07","description":"PDZ domain (Also known as DHR or GLGF)","end":"101","accession":"PF00595","database":"pfam","aliEnd":"99","identifier":"PDZ","type":"Domain","aliStart":"23","start":"22"},"aliStart":"23","start":22},{"modelStart":"1","modelEnd":"229","colour":"#ff5353","endStyle":"curved","end":"352","display":true,"startStyle":"curved","aliEnd":"352","modelLength":"229","text":"Arfaptin","href":"/family/PF06456","type":"pfama","metadata":{"scoreName":"e-value","score":"6.2e-82","description":"Arfaptin-like domain","end":"352","accession":"PF06456","database":"pfam","aliEnd":"352","identifier":"Arfaptin","type":"Domain","aliStart":"117","start":"117"},"aliStart":"117","start":117}],"markups":[],"metadata":{"database":"uniprot","identifier":"PICK1_HUMAN","description":"PRKCA-binding protein","organism":"Homo sapiens (Human)","accession":"Q9NRD5","taxid":"9606"},"motifs":[{"colour":"#00ffff","type":"coiled_coil","metadata":{"database":"ncoils","type":"coiled_coil","start":"146","end":"166"},"start":"146","end":"166","display":false},{"colour":"#86bcff","type":"low_complexity","metadata":{"database":"seg","score":"2.0800","type":"low_complexity","start":"376","end":"394"},"start":"376","end":"394","display":true}]}];

J'ai mi en gras l'info que j'aimerai recuperer

Donc, j'ai ecrit :

import urllib
from re import *

def getproteinedomain(p):
f = urllib.urlopen("http://pfam.sanger.ac.uk//protein/%s" %p)
texte = f.read()
i=string.index(texte,"identifier")
expressReg=re.compile('''*identifier *= *"(.+?)"')
express=expressReg.search(texte,i)
return express

je pense que mon expression regulière est fausse, pourriez vous m'aider svp ?
En fait, je ne sais pas comment dire dans l'expression regulière que c'est forcement "identifier" = " ce qui m'interesse" qu'il faut que je recupère ...
Merci d'avance.

4 réponses

heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
2 déc. 2009 à 23:56
cool
j'adore les regex
je regarde ça en détail

bonsoir au fait
0
nifaste83 Messages postés 7 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 3 janvier 2010
2 déc. 2009 à 23:59
Merci !
J'ai essayé quelque chose de nouveau, mais ca me renvoi une liste vide ...

import urllib
import re

def getproteinedomain(p):
f = urllib.urlopen("http://pfam.sanger.ac.uk//protein/%s" %p)
texte = f.read()
p = re.compile(r'"indentifier":"([^"]*)"')
return p.findall(texte)
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
3 déc. 2009 à 00:51
Ceci devrait marcher:
import urllib 
from re import * 

def getproteinedomain(p): 
    f = urllib.urlopen("http://pfam.sanger.ac.uk//protein/" + p) 
    texte = f.read()
    f.close()
    i = string.find(texte,"var layout = [") 
    expressReg = compile(',"identifier":"(.+?)","') 
    express = expressReg.search(texte,i) 
    return express.group(1)




Corrections apportées:

- À mon avis , c'est verbeux d'utiliser
"http://pfam.sanger.ac.uk//protein/%s" %p
plutôt que
"http://pfam.sanger.ac.uk//protein/" + p
La seconde écriture est plus rapide et est plus claire de mon point de vue.
Comme tu as écrit %s, la variable p est une chaîne, donc je mets p et non pas str(p)

- enlevé les < et > en début et fin de la chaîne d'adresse

- fermer le socket après usage, c'est plus propre, ça ne laisse pas un pointeur en activité pour rien

- je préfère find() à index() car en cas de pas trouvé find() donne -1, tandis que index() lève un message d'erreur

- chercher le début de 'identifier' par index() comme tu le fais puis faire commencer la recherche de matching à partir de cette position, ce n'est pas dans l'esprit d'une regex à laquelle on confie non seulement l'extraction mais la recherche d'un motif. Tant qu'à faire, si tu as déterminé la position i du début de la chaîne
identifier":"PDZ","type":" etc
pourquoi ne continuerais tu pas en extrayant ainsi: texte[i+13:i+13+texte[i+13:].find('",")] !


- par contre, dans la recherche de motifs, j'aime bien combiner find() et une regex, ce qui normalement n'est pas nécessaire: find() pour se rapprocher de la zone dans laquelle se trouve le motif recherché, puis une regex pour détecter précisément le motif.
find() sur un motif simple (sans les complications d'une regex) est très rapide, beaucoup plus qu'une regex.
une regex est plus puissante que find()
Utiliser les deux cumule ainsi les avantages des deux.

Et surtout ça me permet d'augmenter la fiabilité de ce qui est trouvé. En effet, dans ton cas par exemple, il se pourrait qu'un jour il apparraisse un "identifier":" avant le var layout = [. Auquel cas, ta regex se mettrait à te renvoyer un truc peut être faux sans que tu t'en aperçoives. En détectant var layout = [ avec find(), la proba que se produise ce genre de problème à cause de changements sur deux motifs à la fois est plus faible

- si tu fais from re import * , tu importes les fonctions de re les unes après les autres et elles sont appelables sans mettre re devant.





search() et match() produisent des objets regex
C'est de l'interrogation de ces objets de match (= Match Objects dans la doc) que l'on tire les renseignements que l'on veut.
cette interrogatoion se fait par les fonctions que l'on trouve dans la page
http://www.python.org/doc/2.5.4/lib/match-objects.html

group() est l'une de ces fonctions qui permet de tirer de l'objet de match regex soit la chaîne complète qui matche avec le motif de la RE, soit un groupe précis si on spécifie un numéro.
Dans ton cas, il n'y a qu'un numéro possible car un seul groupe défini.


Par contre la page
http://www.python.org/doc/2.5.4/lib/re-objects.html
concerne les objets de compilation tel que l'objet expressReg de ton code.
0
nifaste83 Messages postés 7 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 3 janvier 2010
3 déc. 2009 à 09:07
Je vous remercie infiniment pour votre aide precieuse ainsi que que toutes les explications que vous m'avez apporté.
0