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 :

REGEX-Repérer des chaînes simples à la sauce Python


Sujet :

Python

Vue hybride

rambc REGEX-Repérer des chaînes... 11/01/2012, 08h44
mont29 Bah, j’avais juste oublié que... 11/01/2012, 10h00
mont29 Bon, du coup, je propose de... 11/01/2012, 10h18
rambc Bonsoir. Cela ne marche... 11/01/2012, 18h10
mont29 Indeed… J’ai dû tester un peu... 11/01/2012, 19h39
rambc Merci, cela semble faire... 12/01/2012, 10h16
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut REGEX-Repérer des chaînes simples à la sauce Python
    Bonjour,
    le code suivant contient un début de regex pour chercher des regexs à la sauce Python.

    Cela ne fonctionne pas. J'ai mis des tests montrant les problèmes avec la regex utilisée.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #! /usr/bin/env python3
     
    # Source : http://www.developpez.net/forums/d1173336/autres-langages/python-zope/general-python/regex-recuperer-contenu-entre-guillemets-possibilite-dutiliser/#post6443734
     
    import re
     
    # ``(...)`` sert à grouper des directives.
    # ``.`` indique n'importe quel caractère.
    # ``.*`` indique une suite éventuellement vide 
    # de caractères quelconques.
    # ``?<!...`` demande de vérifier que le caractère
    # en cours d'analyse n'est pas précédé de ...
    PATTERN = re.compile(r'"(.*?)(?<!\\)"')
     
    someTexts = [
        r'Un petit texte et "autre chose \"entre des guillemets\" pour tester"' \
        + ' et voilà c\'est fini...',
            # OK
        r'Un petit texte et "et attention à ""r...',
            # OK
        r'Un petit texte et "et attention à \\"r...',
            # PAS OK : Chaîne bien fermée mais ce n'est pas vu
            # car ``\"`` est échapée alors que ``\\`` c'est qu'il est.
        r'Un petit texte et "et attention à \"r...',
            # OK
        r'Un petit texte et "et attention à \\""r...',
            # PAS OK : Chaîne fermée au mauvais endroit
            # car ``\"`` est échapée alors que ``\\`` c'est qu'il est.
        r'Un petit texte et "et attention à \""r...',
            # OK
    ]
     
    for oneText in someTexts:
        search = re.search(PATTERN, oneText)
     
        print('---', oneText, sep="\n")
     
        if search:
            s = search.start()
            e = search.end()
     
            print(oneText[:s], oneText[s:e], oneText[e:], sep = ">>>")
     
        else:
            print('<< NOTHING FOUND ! >>')

  2. #2
    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
    Bah, j’avais juste oublié que le backslash pouvait lui aussi être échappé…

    Suffit donc, dans le lookbehind négatif, de vérifier sur deux chars: "a\" passe pas, mais "\\" passe*:



    [EDIT] À la réflexion, ça ne passe pas s‘il y a trois backslashes de rang…Vais voir si on peut trouver plus générique (le problème étant que les lookbehind ne supportent malheureusement pas les patterns de longueur variable…).

  3. #3
    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
    Bon, du coup, je propose de laisser tomber le lookbehind, qui n’est plus assez souple…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r'"(.*?(?:[^\\](?:\\\\)*)+)"'
    Ici, on cherche n’importe quoi en mode non-glouton, éventuellement suivi d’un nombre pair de backslashes. Ça m’a l’air de faire l’affaire.

  4. #4
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonsoir.

    Cela ne marche pas dans le cas ci-dessous...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ---
    Un petit texte et "et attention à \\""r...
    Un petit texte et >>>"et attention à \\"">>>r...
    En effet, on devrait juste obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ---
    Un petit texte et "et attention à \\""r...
    Un petit texte et >>>"et attention à \\">>>"r...

  5. #5
    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
    Indeed… J’ai dû tester un peu vite. Mais je n’ai pas épuisé ma réserve de perversité retorse, et propose donc maintenant ceci*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r'"(.*?(?=([^\\](?:\\\\)*)")[^\\](?:\\\\)*)"'
    Puisque, ô rage, ô désespoir, il ne peut y avoir de lookbehind à géométrie variable, on va faire un lookahead (qui, lui, supporte n’importe quel type de motif), pour arrêter ce malgré tout trop glouton “n’importe quoi” dès qu’il trouve un guillemet précédé d’un nombre pair de backslashes (zéro inclus), puis consommer les dits backslashes (et le guillemet, mais hors groupe de capture, évidemment)…

    Là, ça commence à devenir tordu… C’est le genre de regex qu’il faut sérieusement commenter, sous peine de remettre à chaque fois une heure à comprendre comment elle marche*!

  6. #6
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Merci, cela semble faire l'affaire.

    Je posterais ici une version commentée de la regex pour quelqu'un qui passerait par ici.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/04/2014, 19h44
  2. REGEX - Repérer des mots avec des lettres accentuées
    Par rambc dans le forum Général Python
    Réponses: 2
    Dernier message: 16/07/2011, 15h33
  3. [D6] Comment remplacer des chaînes dans un fichier ?
    Par fabien25 dans le forum Langage
    Réponses: 4
    Dernier message: 15/06/2005, 13h37
  4. Passage des chaînes de caractères à une application CGI
    Par Thom@s dans le forum Composants VCL
    Réponses: 10
    Dernier message: 03/12/2004, 00h13
  5. [Regex] reconnaitre une chaîne non complète
    Par EdoBvD dans le forum Collection et Stream
    Réponses: 19
    Dernier message: 13/07/2004, 17h14

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