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
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
A voir également:
- Aide expression reguliere python
- Citizen code python avis - Accueil - Outils
- Expression de recherche - Guide
- Tu es un amour expression ✓ - Forum Loisirs / Divertissements
- Python retour à la ligne dans le code - Forum Python
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
2 déc. 2009 à 23:56
cool
j'adore les regex
je regarde ça en détail
bonsoir au fait
j'adore les regex
je regarde ça en détail
bonsoir au fait
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
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)
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)
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
3 déc. 2009 à 00:51
Ceci devrait marcher:
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.
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.
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
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é.