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 :

expressions régulières sur url


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Par défaut expressions régulières sur url
    bonjour,

    j'ai un petit soucis avec les expressions régulières en python.
    Je souhaiterais en effet créer un regex capable de capturer deux / successifs dans une url, sans pour autant matcher les deux premiers, mais je n'y parviens pas. Pourriez-vous m'aider svp ?

    Ex dans "http://www.developpez.net//forums/", je souhaiterais capturer les "//" juste avant forums/.

    merci de votre aide,
    Silvio

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Petite proposition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import re
     
    def trouvedoubleslash(c):
        ch = re.compile(r"(?:[^./:])(//)(?:[^/]?)")
        result = []
        i = 0
        while True:
            m = ch.search(c, i)
            if m == None:
                break
            else:
                result.append(m.start(1))
                i = m.end(1)
        return result
     
    c = "http://www.developpez.net//forums/toto/titi//tata//"
    print trouvedoubleslash(c)
    [25, 43, 49]
    Comme je ne savais pas s'il fallait seulement attraper un seul "//" ou tous (après le "http://"), j'ai fait "tous", d'où la boucle. La fonction renvoie la liste des indices du 1er caractère des sous-chaines trouvées (et [] si pas trouvé)

    Non seulement ce code évite le '//' de 'http://', mais aussi le 1er '//' quand il se trouve en début de chaine comme pour une adresse de réseau "//chemin_reseau/xxx//toto". Ainsi que les 3 '/' dans "file:///chemin_disque"

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Comme je ne savais pas s'il fallait seulement attraper un seul "//" ou tous (après le "http://"), j'ai fait "tous", d'où la boucle. La fonction renvoie la liste des indices du 1er caractère des sous-chaines trouvées (et [] si pas trouvé)

    Non seulement ce code évite le '//' de 'http://', mais aussi le 1er '//' quand il se trouve en début de chaine comme pour une adresse de réseau "//chemin_reseau/xxx//toto". Ainsi que les 3 '/' dans "file:///chemin_disque"
    Merci pour ta réponse et ton code tyrtamos,
    en fait, je me suis pas forcément bien exprimé par "capturer". Je veux simplement "remplacer" un double slash par un simple slash. Peut-on faire ça avec re.sub en utilisant le regex que tu proposes ?

    merci,
    Silvio

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par silvio7 Voir le message
    Je veux simplement "remplacer" un double slash par un simple slash.
    C'est plus "simple" (pour autant qu'on puisse utiliser cet adjectif pour les regex ). Le motif a été légèrement modifié:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import re
     
    def remplacedoubleslash(c):
        motif = r"([^./:])(//)([^/]?)"
        return re.sub(motif, r"\1/\3", c)
     
    c = "http://www.developpez.net//forums/toto/titi//tata//"
    print remplacedoubleslash(c)
    http://www.developpez.net/forums/toto/titi/tata/
     
    c = "//chemin_reseau//forums/toto/titi//tata//"
    print remplacedoubleslash(c)
    //chemin_reseau/forums/toto/titi/tata/
     
    c = "file:///chemin//forums/toto/titi//tata//"
    print remplacedoubleslash(c)
    file:///chemin/forums/toto/titi/tata/

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Par défaut
    super, ça marche, merci encore !

    Silvio

  6. #6
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Une question en passant. Dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return re.sub(motif, r"\1/\3", c)
    que représente/signiefie le ?
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  7. #7
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    C’est le motif de remplacement. Tout ce qu’aura “matché” la regex sera remplacé par ça –*c’est-à-dire le contenu des premier et troisième groupes capturés, séparés par un slash…

  8. #8
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Ok, c'est noté.
    Mon plongeon au coeur de Python m'a l'air d'être une marche dans la paumme de main de boudha
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  9. #9
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    C'est assez logique: on cherche une sous-chaine composée de:
    => n'importe quel caractère autre que '/' ou ':' => groupe1
    => '//' => groupe2
    => n'importe quel caractère autre que '/'. => groupe3

    On distingue ces 3 groupes grâce aux parenthèses dans le motif de recherche.

    Quand le '//' est trouvé, la sous-chaine à convertir est formée des 3 groupes. Par exemple pour "toto//titi", on trouve "o//t".

    Si on veut convertir '//' en '/', il faut ajouter dans la conversion le caractère avant (goupe1 => '\1') et le caractère après (groupe3 => '\3') sinon, ils sont "mangés".

    D'où la sous chaine de remplacement: r"\1/\3"

  10. #10
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    C'est assez logique: on cherche une sous-chaine composée de:
    => n'importe quel caractère autre que '/' ou ':' => groupe1
    => '//' => groupe2
    => n'importe quel caractère autre que '/'. => groupe3
    Oui, une fois qu'on comprends qu'il s'agit des groupes.
    Citation Envoyé par tyrtamos Voir le message
    On distingue ces 3 groupes grâce aux parenthèses dans le motif de recherche
    Voila au moins une chose qui est de moi connue dans les regex.
    Citation Envoyé par tyrtamos Voir le message
    Quand le '//' est trouvé, la sous-chaine à convertir est formée des 3 groupes. Par exemple pour "toto//titi", on trouve "o//t".

    Si on veut convertir '//' en '/', il faut ajouter dans la conversion le caractère avant (goupe1 => '\1') et le caractère après (groupe3 => '\3') sinon, ils sont "mangés".

    D'où la sous chaine de remplacement: r"\1/\3"
    Avec toutes ces explicatons, tout apparait limpide dans mon cerveau
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

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

Discussions similaires

  1. Expression régulière sur URL
    Par dany013 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 15
    Dernier message: 21/03/2011, 10h51
  2. [RegEx] Expression Régulière sur params url
    Par LeCaméléon dans le forum Langage
    Réponses: 4
    Dernier message: 14/11/2008, 14h40
  3. expression régulière sur une url
    Par Sh4dow49 dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 20/08/2008, 21h32
  4. expression régulière sur flux
    Par zais_ethael dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 19/09/2006, 23h38

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