Forum debian-fr.org

Rechercher:

* Connexion   * M’enregistrer

* FAQ    * Rechercher





Poster un nouveau sujet Répondre au sujet  [ 10 messages ] 
Auteur Message
 Sujet du message: Expression régulière : souci
MessagePosté: 22 Mai 2012 18:29 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 03 Mai 2008 06:16
Messages: 3353
Localisation: Nantes
Bonjour!
Je voudrais récupérer tout le texte compris entre deux chaînes.
Cependant, avec ma méthode, je récupère aussi ces deux chaines, chose que je ne veux pas.

Exemple :

J'ai une chaine de ce type :
Code:
<link>http://blabla.com</link>

Que je récupère avec l'expression suivante :
Code:
<link>.*</link>

Mais je ne voudrais pas avoir <link> et </link>

J'ai vraiment un souci avec ces regexp...

_________________
wheezy amd64 + dwm + suckless-tools
http://yeuxdelibad.net
Aidez debian avec apt-p2p!


Haut
 Profil  
 
MessagePosté: 22 Mai 2012 19:53 
Hors ligne
Modérateur du forum
Avatar de l’utilisateur

Inscription: 18 Mai 2009 16:49
Messages: 4046
Capture avec des parenthèses :
<link>(.*)</link>

Bon après faut pas récupérer le résultat complet mais seulement la capture, la manière exacte de le faire va dépendre du langage que tu utilises.

_________________
testing/unstable (amd64) sous KDE4
github/syam44 - De la bonne manière de poser les questions - Wiki debian-fr
Just because you're paranoid doesn't mean they aren't after you. -- J.Heller


Haut
 Profil  
 
MessagePosté: 22 Mai 2012 20:54 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 03 Mai 2008 06:16
Messages: 3353
Localisation: Nantes
C'est avec python...
Merci à toi!

_________________
wheezy amd64 + dwm + suckless-tools
http://yeuxdelibad.net
Aidez debian avec apt-p2p!


Haut
 Profil  
 
MessagePosté: 22 Mai 2012 23:09 
Hors ligne
Vraiment, particulièrement bavard(e)!
Avatar de l’utilisateur

Inscription: 28 Juil 2008 14:57
Messages: 1887
Localisation: Seine et Marne
Tu peux aussi utiliser :
Code:
http://[^<]+

(la chaine "http://" suivie de toute chaine ne contenant pas "<")

Ça colle avec ton exemple, mais selon ce que tu parses, c'est peut-être moins pertinent.

_________________
La propriété intellectuelle n'a d'intérêt que lorsqu'elle porte mal son nom.


Haut
 Profil  
 
MessagePosté: 23 Mai 2012 07:29 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 03 Mai 2008 06:16
Messages: 3353
Localisation: Nantes
suivant ton exemple, ça ça devrait marcher :
Code:
[^<link>]+[$</link>]


Non?

_________________
wheezy amd64 + dwm + suckless-tools
http://yeuxdelibad.net
Aidez debian avec apt-p2p!


Haut
 Profil  
 
MessagePosté: 23 Mai 2012 09:42 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 18 Juil 2007 17:57
Messages: 7736
Localisation: Grenoble
Code:
import re

chaine='sdlfkm sdkljfl<link>http://coucou.com/fdlksj?kdsjkl=dsf&a=e</link>slmskdlm'
expr = re.compile(r'<link>(.*)</link>')
print expr.search(chaine).groups()[0]

# Affiche http://coucou.com/fdlksj?kdsjkl=dsf&a=e

C'est du python 2.6, je n'ai pas plus récent sur ma machine, mais d'après la doc de python 3 je ne crois pas que l'API aie changée (http://docs.python.org/py3k/library/re.html).

Note que la compilation de l'expression n'est pas nécessaire mais améliore les performances. Il est aussi utile de savoir que tu peux prendre toute une page HTML, tout mettre dans une string et faire une fois la recherche et avoir tout les résultats dans une liste (ça peut être pratique).

L'exemple de kna, n'a pas le même sens. Il ne s'agit alors pas de chercher tout ce qui se trouve entre les balise <link>, mais toutes les urls. Elle devrait d'ailleurs être complétée au moins comme ça je pense :
Code:
http://[^< ]+


Au sujet de cette expression :
Code:
[^<link>]+[$</link>]

  • [] : définit des classes de caractères donc [abc] va permettre de matcher a, b ou c
  • ^ : au début d'une définition de classe de caractère il inverse celle-ci donc [^abc] va matcher n'importe quoi sauf a, b et c
  • [^<link>] : va donc matcher tout caractère sauf <, l, i, n ou k
  • + : indique que la classe précédente peut se trouver 1 ou plusieurs fois dans ce que l'on matche [^<link>]+ peut matcher 'abc', 'u', '-', 'utr_hsd', ...
  • [$</link>] : est une classe de caractère qui matche n'importe quel des caractères '$', '<', '>', 'l', 'i', 'n' et 'k'

L'expression de kna correspond à :
Code:
http://[^< ]+

toute chaines qui commence par 'http://' suivi d'au moins un caractère qui n'est pas '<'.

Celle de syam, c'est tout ce qui commence par '<link>', suivi de n'importe quoi, suivi de '</link>'.

_________________
Je suis Pitta, cartésien, irritable, irritant et névrosé (de plus je fais de l'entrisme pour zsh), si l'un de mes messages vous insupporte essayez d'y voir de l'ironie ou de ne pas en tenir compte. Bonne journée et gardez le sourire. :)


Haut
 Profil  
 
MessagePosté: 23 Mai 2012 10:58 
Hors ligne
Modérateur du forum
Avatar de l’utilisateur

Inscription: 18 Mai 2009 16:49
Messages: 4046
Autre remarque, si on prend ce texte d'origine :
Code:
<link>abc</link>def<link>ghi</link>

Alors l'expression régulière <link>(.*)</link> te renverra la chaîne abc</link>def<link>ghi (sauf si tu as donné des options spécifiques à ton moteur de regex).
En effet, le symbole * est dit "greedy" c'est à dire qu'il va essayer de faire correspondre le maximum qu'il peut.

Pour éviter ça, soit tu utilises un opérateur "lazy" qui va s'écrire <link>(.*?)</link> ou, mieux quand c'est possible, une classe de caractères inversée dont parlait MisterFreez : <link>([^<]*)</link>

Dans ce dernier cas ça veut dire :
- la chaîne recherchée doit commencer par <link>
- ensuite on capture tous les caractères tant qu'on ne rencontre pas un <
- enfin, ça doit être suivi de </link>

L'opérateur lazy *? est à éviter si possible car il est généralement moins performant qu'une classe de caractères inversées.

À ce sujet, voir : http://www.regular-expressions.info/repeat.html

_________________
testing/unstable (amd64) sous KDE4
github/syam44 - De la bonne manière de poser les questions - Wiki debian-fr
Just because you're paranoid doesn't mean they aren't after you. -- J.Heller


Haut
 Profil  
 
MessagePosté: 23 Mai 2012 11:44 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 18 Juil 2007 17:57
Messages: 7736
Localisation: Grenoble
En effet, de plus je ne sais pas si comment se comporte l'API python mais il peut être pratique d'utiliser l'opérateur + pour forcer la présence d'au moins un caractère (* permet le vide). Donc au final ça donnerait :
Code:
<link>([^<]+)</link>

Ainsi tu es sur d'avoir quelque chose de non-vide.

_________________
Je suis Pitta, cartésien, irritable, irritant et névrosé (de plus je fais de l'entrisme pour zsh), si l'un de mes messages vous insupporte essayez d'y voir de l'ironie ou de ne pas en tenir compte. Bonne journée et gardez le sourire. :)


Haut
 Profil  
 
MessagePosté: 23 Mai 2012 17:33 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 03 Mai 2008 06:16
Messages: 3353
Localisation: Nantes
Un grand merci pour vos explications complètes. Je ne devrais pas avoir le moindre souci pour parser un fichier de flux rss avec ça.

Je ne le compilerai pas, car ne l'utilise qu'une fois, donc ça ira comme ça.

Promis, dès que je suis en vacance je me met aux regexp :)

_________________
wheezy amd64 + dwm + suckless-tools
http://yeuxdelibad.net
Aidez debian avec apt-p2p!


Haut
 Profil  
 
MessagePosté: 23 Mai 2012 17:45 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 03 Mai 2008 06:16
Messages: 3353
Localisation: Nantes
Et pour récupérer quelque chose qui s'étale sur plusieurs lignes? Pour l'instant je fais ça à coup de split, mais ça manque d'élégance.

en gros, je veux récupérer tout ce qui est entre <div id="main"> et <div id="footer">.
Sans succès avec cette regexp :
Code:
re.findall(r'<div id="main">([^<]*)</div id="footer">',a
où a est le texte.
Je crois avoir vu un truc MULTILINE dans la doc python, j'y retourne.

_________________
wheezy amd64 + dwm + suckless-tools
http://yeuxdelibad.net
Aidez debian avec apt-p2p!


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 10 messages ] 

Index du forum » Divers » Programmation


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Aller à:  
Flux RSS Flux RSS Liste des flux Liste des flux
Powered by phpBB® Forum Software © phpBB Group
Traduction par: phpBB-fr.com
SEO
[ Time : 0.118s | 14 Queries | GZIP : Off ]