Python : Expression régulière

Fermé
Nouga - 22 août 2010 à 14:59
 Utilisateur anonyme - 26 août 2010 à 22:53
Bonjour,

J'ai besoin d'aide pour trouver une expression régulière, j'ai plusieurs liens coller sans distinction particulière entre eux et je souhaite trouver une expression pour les récupérer, mon problème est le suivant.

Ma chaine ressemble a ça :

http://www.google.frhttp://fr.weather.comhttp://www.meteoconsult.com

Je ne trouve pas le moyen d'éviter d'inclure une chaine entière, je souhaiterais trouver quelque chose qui ce rapproche de [^http] mais pour une chaine entière, car cette manière ne prends que les lettres individuellement. J'ai regarder la documentation de python bien entendu mais je dois avouer que je suis un peu perdu.

Merci de m'aider.

8 réponses

Utilisateur anonyme
25 août 2010 à 15:46
Les réponses données ici sont correctes. Je t'en donne une autre qui t'enverras sous forme de liste les urls

ch="http://www.google.frhttp://fr.weather.comhttp://www.meteoconsult.com"
new_ch=ch.replace("http://", " ").split()
# resultat : ['www.google.fr', 'fr.weather.com', 'www.meteoconsult.com']

for url in new_ch:
	print "http://"+url # pour avoir les urls sous la forme http://...

# resultat : 
#https://www.google.fr/?gws_rd=ssl
#https://weather.com/fr-FR/temps/aujour/l/FRXX0076:1:FR
#http://www.meteoconsult.com</code>


Que demander de plus? Le faire avec le module re, c'est comme écraser une fourmi avec un marteau piqueur
2
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
25 août 2010 à 19:39
Pourquoi utiliser la fonction replace ?
Le même programme avec : new_ch=ch.split("http://") fait exactement pareil.
0
eh bien je dirais pourquoi pas? Ta solution, je l'ai dis plus tôt est correcte aussi, je ne propose qu'une solution différente ayant le même résultat ;)

Par contre, il me semble qu'avec la méthode split tu te retrouves dans ta liste de résultats avec un "http://" seul, c'est tout.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
Modifié par fiddy le 25/08/2010 à 21:23
Je disais juste ça car c'est dommage d'utiliser une fonction de plus ^^.
Par contre comme tu l'as fait remarquer si justement, j'avais oublié le fait que chaine.split("[http://]") laissera un élément vide en début de liste. Il faut donc utiliser : new_ch=ch.split("[http://]")[1:]
Cdlt,
0
Utilisateur anonyme
26 août 2010 à 11:56
Tu utilises le slice ( [:1] ) qui est aussi une fonction supplémentaire ;)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
26 août 2010 à 20:36
Vi vi, c'est pareil. J'avais oublié le coup de l'élément vide comme dit plus haut :-))).
Par contre je savais pas que le slicing était considéré comme une fonction. Je pensais que [1:] permettait d'accéder directement à partir de l'élément 1 via un pointeur en C.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
22 août 2010 à 15:32
Bonjour,
Pas besoin de passer par une regexp, tu peux tout simplement utiliser la méthode slip.
Par exemple : chaine.split("http://") te renverra dans un tableau www.google.fr, fr.weather.com, www.meteoconsult.com
Et si tu veux, tu peux remettre facilement le http:// devant si ça t'es important.

Cdlt,
0
Merci pour ta réponse,

Effectivement ça serai une solution mais il ce trouve que je dois utiliser une expression régulière pour ce cas, si quelqu'un pouvait m'aider dans ce sens, ça dois surement être possible mais je n'arrive pas a trouver par moi même.
0
Utilisateur anonyme
23 août 2010 à 08:55
Sans espaces entre tes urls c'est pas évident. La solution proposée précédemment est bonne et de toute façon bien plus rapide que les expressions régulières.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
23 août 2010 à 11:24
tu sais que ton adresse est comprise entre deux "http://" donc, un truc dans le genre :
find(" http://[:alpnum:|.|/]*http://|$ " )
c'est à dire tout caractère alphanumérique plus les caractères accepter dans les URL ('/', '.', '_', '-' ...) compris entre "http://" et : "http://" ou une fin de ligne.
0
Je relance mon sujet en désespoir de cause, je n'ai toujours pas trouver de solution correcte.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
25 août 2010 à 14:24
en quoi ma solution ne conviens pas ?
0
@Char Snipeur:
en quoi ma solution ne conviens pas ?
Merci d'essayer de m'aider avant tout, le tiens quand même a le dire et surtout ne t'offusque pas. C'est juste que tu me propose une idée que je décris dans mon premier poste, c'est à dire prendre la chaine entre "http" et "http" en me proposant un exemple qui n'est la que pour représenté ton idée donc qui ne fonctionnement pas, du coup il faut admettre que ça ne m'aide que moyennement.

@fred1599:
Merci, je pense que je vais utilisé ta proposition vu que je ne trouve pas pour l'expression régulière, au passage peux tu m'expliquer, si ce n'est pas trop abusé de ton temps, pourquoi tu me déconseilles d'utilisé le module re, c'est un module particulièrement lourd ?
0
Utilisateur anonyme
25 août 2010 à 18:00
Sur du texte complexe, le module re est très efficace, mais sur du gros fichier il est particulièrement long, et si on peut l'éviter, les autres solutions seront toujours plus rapides.
0