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 :

Caractère obligatoire mais n'importe où dans une RE


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Caractère obligatoire mais n'importe où dans une RE
    Bonjour,

    Je cherche à écrire une expression régulière permettant de détecter des strings du genre:
    a - 2487 - (hfsfdye5?ksj7) - z
    a - 8529 - () - z
    a - 9254 - (ggd6 7#g54e$0"8) - z
    c'est à dire qu'entre le deuxième signe - suivi d'un blanc et le troisième signe - précédé d'un blanc, il doit y avoir une expression de 0 à 15 caractères entre deux parenthèses, suivie de suffisamment de blancs pour que le troisième signe - soit toujours à la même place.
    Je veux une RE qui s'assure qu'il y a une parenthèse fermante ) après la parenthèse ouvrante ( ET que le nombre de caractères entre les deuxième et troisième signes - est 19.

    Pour le début, j'ai écrit
    p= 'a \d{4} - (
    mais pour la fin je ne sais pas.
    Si j'écrivais p = 'a \d{4} - (.{16} - z' , cela ne vérifierait pas la présence de ).

    Merci pour un tuyau

  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 erratum
    Je cherche à écrire une expression régulière permettant de détecter des strings du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a - 2487 - (hsfdye5?ksj7)    - z
    a - 8529 - ()                - z
    a - 9254 - (ggd6 7#g54e$0"8) - z

  3. #3
    Invité
    Invité(e)
    Par défaut
    Hello !!!

    Voilà ce que je peux te proposer. L'expression régulière va chercher une chaine :
    • Commençant par "a - "
    • Suivi de * chiffres
    • Suivis de " - "
    • Suivi de 0 à 15 caractères quelconques entre parenthèses
    • Suivis de " - z"



    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
    #! /usr/bin/python
    # -*- coding: UTF-8 -*-
     
    import re
     
    listeTexte = [ 'a - 2487 - (hfsfdye5?ksj7) - z',
              'a - 8529 - () - z',
              'a - 9254 - (ggd6 7#g54e$0"8) - z',
              'a - 9254 - (ggd6 7#g54e$5d4refdrf46fzd64zfe40"8) - z' ]
     
    motif = "a - [0-9].*? - \(.{0,15}?\) - z"
    p = re.compile(motif)
     
     
    for texte in listeTexte:
     
        try:
            if p.search(texte) != None:
                print "'", texte, "' >>> CORRESPOND A LA REGEXP"
            else:
                print "'", texte, "' >>> NE CORRESPOND PAS A LA REGEXP"
     
        except:
            print "Erreur lors du traitement de la regexp"

    Voilà en espérant que ça réponde à tes attentes... Je commence à aimer les regexps moi c'est fou

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Par défaut
    Voilà en espérant que ça réponde à tes attentes... Je commence à aimer les regexps moi c'est fou
    Cool, je les adores.

    Mais ton expression ne vérifie pas les conditions qu'il a demandé.
    Alors les conditions étaient:
    1-commence avec un 'a - '
    2-4chiffres (remarque l'expression qu'il a donné'
    3-suivis d'une chaine qui doit etre:
    • entre deux '-'
    • le premier '-' est suivit d'un blanc
    • le second (final) est précédé par DES blancs
    • le nombre de caractères entre le premier et le second est de 19 (les deux blancs inclus)
    • présence obligatoir d'une paranthèse ouvrante et une fermante
    • le nombre de caractères entre les deux paranthèse est au max 15
    • si le nombre est inferieur à 15 remplir l'exterieur des paranthèses (après la fermante) par des blancs pour remplire la condition iv

    ^^

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Par défaut
    Ok, c'était un peut ... mais c'est fait
    Alors le problème réside dans le fait qu'il doit y avoir i caractères entre les '()' et 19-i espace après le ')', le fait que ce soit 19 (un nombre fini) implique l'existance d'une expression réguliere, mais elle est longue, il faut prendre en compte tous les cas (pas de caractère et 15 espace, 1 caractère et 14 éspace...)
    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
     
    # -*- coding: utf-8 -*-
    import re
    listeTexte = [ 'a - 2487 - (hsfdye5?ksj7)    - z', #devra vérifier
                   'a - 8529 - () - z',                #ne devra pas car position du 3ème '-' non valide
                   'a - 8529 - ()                - z',  #vérifie 
                   'a - 8529 - (                 - z',  #ne vérifie pas, il manque un ')'
                   'a - 9254 - (ggda bxgv"exdfe) - z', #vérifie
                   'a - 9254 - (ggd6 7#g54e$5d4refdrf46fzd64zfe40"8) - z' #ne vérifie pas
                   ]
     
    motif = r"a - \d{4} - \(((\)\s{15})"
    for i in range(1,16):
        motif+="|(.{%s}\)\s{%s})"%(i,15-i)
    motif+=") - z"
     
    p = re.compile(motif)
     
     
    for texte in listeTexte:
     
        try:
            if p.search(texte) != None:
                print "'", texte, "' >>> CORRESPOND A LA REGEXP"
            else:
                print "'", texte, "' >>> NE CORRESPOND PAS A LA REGEXP"
     
        except:
            print "Erreur lors du traitement de la regexp"
    Notre output

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ' a - 2487 - (hsfdye5?ksj7)    - z ' >>> CORRESPOND A LA REGEXP
    ' a - 8529 - () - z ' >>> NE CORRESPOND PAS A LA REGEXP
    ' a - 8529 - ()                - z ' >>> CORRESPOND A LA REGEXP
    ' a - 8529 - (                 - z ' >>> NE CORRESPOND PAS A LA REGEXP
    ' a - 9254 - (ggda bxgv"exdfe) - z ' >>> CORRESPOND A LA REGEXP
    ' a - 9254 - (ggd6 7#g54e$5d4refdrf46fzd64zfe40"8) - z ' >>> NE CORRESPOND PAS A LA REGEXP

Discussions similaires

  1. [MySQL] Importer XML dans une base de données
    Par stardeus dans le forum XQUERY/SGBD
    Réponses: 17
    Dernier message: 12/07/2011, 11h14
  2. importer CSV dans une base
    Par altair8080 dans le forum Ruby on Rails
    Réponses: 8
    Dernier message: 20/09/2009, 14h51
  3. Importer Interface dans une coclasse
    Par akbar dans le forum Delphi
    Réponses: 6
    Dernier message: 25/04/2007, 13h12
  4. Réponses: 2
    Dernier message: 17/04/2007, 11h44
  5. Réponses: 3
    Dernier message: 13/12/2006, 18h05

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