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] petite incompréhension


Sujet :

Python

  1. #1
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut [regex] petite incompréhension
    salut,

    voici une regex dont le résultat obtenu n'est pas celui escompté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> p_blind = re.compile('''(.*?) posts (?=small)|(?=big) blind \[\$(.*?) USD\]\.''')
    >>> p_blind.findall('cinthia001 posts small blind [$0.01 USD].')
    [('cinthia001', '')]
    En effet, le résultat escompté étant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [('cinthia001', '0.01')]
    Voyez-vous où ça coince ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bonsoir,


    Il doit y avoir deux erreurs:

    - le OU étend ses ailes aussi loin qu'il lui est laissé loisir de le faire à droite et à gauche. Si on veut le limiter, il faut mettre des parenthèses

    - tu as dû mettre '?=' au lieu de '?:'

    J'écrirais donc:

    p_blind = re.compile('''(.*?) posts (?:small|big) blind \[\$(.*?) USD\]\.''')



    \[\$([.\d]+) USD\]\. serait mieux que \[\$(.*?) USD\]\. de mon point de vue

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Premier problème: (?=...) ne consomme pas les caractères matchés.
    Second problème: la précédence de | est plus faible que ce que tu attends.

    Si je ne m'abuse, la partie à droite du | ne pourra jamais matcher car le string devrait contenir la chaîne 'big' et à la même place la chaîne ' blind'.

    Il faut donc écrire de (small|big), mais si tu ne veux pas créer un groupe, il faut utiliser (?:...).

    Cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> p_blind = re.compile('''(.*?) posts (?:small|big) blind \[\$(.*?) USD\]\.''')
    >>> p_blind.findall('cinthia001 posts small blind [$0.01 USD].')
    [('cinthia001', '0.01')]
    EDIT: grillé

  4. #4
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Ok... Merci à vous , j'en aurais appris un peu plus sur les regex : je suis assez nul avec ces dernières comme vous avez pu vous en rendre compte

    - le OU étend ses ailes aussi loin qu'il lui est laissé loisir de le faire à droite et à gauche
    bon moyen memo technique

    Premier problème: (?=...) ne consomme pas les caractères matchés.
    Qu'entends-tu par "ne consomme pas" ?

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par N.tox Voir le message
    Qu'entends-tu par "ne consomme pas" ?
    Pendant que le pattern est en cours de reconnaissance, on peut visualiser un curseur qui pointe dans la chaîne dans laquelle on cherche. Un pattern (qui matche) fait normalement avancer ce curseur; le pattern (?=...) ne le fait pas (ou plutôt, le curseur revient en arrière une fois que ce motif est trouvé).

    Par exemple le pattern (?=a). ne consomme qu'un seul caractère. Il matche n'importe quel caractère (.) ... à condition que ce soit un a

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

Discussions similaires

  1. regex petit problème de compilation
    Par doommick31 dans le forum C++
    Réponses: 1
    Dernier message: 27/08/2009, 15h21
  2. petite incompréhension de code
    Par jackall dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 13/08/2008, 07h51
  3. Petite incompréhension de config Apache
    Par DevServlet dans le forum Apache
    Réponses: 3
    Dernier message: 14/05/2008, 12h31
  4. [Debutant] Petit incompréhension
    Par Tronche dans le forum Langage
    Réponses: 2
    Dernier message: 23/09/2006, 12h51
  5. [regex] petite reg ex pas trop violente je pense ;)
    Par Spoutnik dans le forum Langage
    Réponses: 8
    Dernier message: 04/08/2006, 14h00

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