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 :

expression régulière: le <<et>> et la <<négation>>


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Par défaut expression régulière: le <<et>> et la <<négation>>
    Bonjour
    Je me suis plongé dans les expressions régulières. Je pense avoir compris quelques syntaxes.
    Par contre, faut-il prévoir une fonction pour programmer l'occurence "mot1 et mot2" en tenant compte du <<et>> mais en ne tenant pas compte de l'ordre des mots.
    Par exemple, ci dessous:
    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
     
    import glob 
    import os
    import re
    # la chaine s ne contient pas "début" "fin" 
    s="je suis Pour l'instant \n moyennEment. TranQuILLe AvEC  les eXpressioNS \ REGULIERES. "
    s=s.lower()
    print("Au moins un mot")
    print("   0 mot")
    print(re.search(r"(\")|(début)",s,re.S)) # False
    print("   Un mot")
    print(re.search(r"(\.)|(début)",s,re.S)) #True
    print("   2 mots")
    print(re.search(r"(suis)|(instant)",s,re.S)) #True
    print("mot1 et mot2")
    print("   dans l'ordre")
    print(re.search(r"(suis).*(tranquil)",s,re.S)) #True
    print("   dans le désordre")
    print(re.search(r"(instant).*(suis)",s,re.S)) #False alors que je souhaiterais que çà soit True
    Dans le même régistre, existe-t-il une fonction prédéfinie (ou faut-il la créer) pour exclure la chaine si elle contient un mot; par exemple pour tester
    Chaine contient mot 1 et mot 2 et pas mot 3

    merci pour vos réponses.

    Gabriel Ruyneau

  2. #2
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 423
    Par défaut
    Pourquoi pas, tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print(re.search(r"instant",s,re.S) and re.search(r"suis",s,re.S))

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Par défaut
    Oui effectivement...

    Mais après si je dois tester des combinaisons de <<et>> et de <<ou>> puis du <<privé de>>, ça devient long.

    J'ai fini par réussir à faire un code qui permet de tester un ensemble de mot dans une chaine avec le langage logique:
    <<et>> devient @*
    <<ou>> devient @+
    <<privé de>> devient @!
    Il y a certainement mieux, mais sur le peu de test que j'ai fait, çà a l'air de fonctionner.
    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
    46
    47
    48
    49
     
    import glob 
    import os
    import re
     
    def v(mot,chaine):
        mot=mot.lower()
        chaine=chaine.lower()
        r=0
        if mot in chaine:
            r=1
        return r
     
    def recherche(exp_reguliere,chaine):
        exp_reguliere=exp_reguliere.lower()
        chaine=chaine.lower()
        exp_reguliere=exp_reguliere.replace(" ","")
        exp_val=exp_reguliere.replace("@("," ")
        exp_val=exp_val.replace("@+"," ")
        exp_val=exp_val.replace("@*"," ")
        exp_val=exp_val.replace("@)"," ")
        exp_val=exp_val.replace("@!"," ")
        exp_val=exp_val.split()
        for element in exp_val:
            exp_reguliere=exp_reguliere.replace(element,str(v(element,chaine)),1)
        exp_reguliere=exp_reguliere.replace("@!0","1")
        exp_reguliere=exp_reguliere.replace("@!1","0")
        exp_reguliere=exp_reguliere.replace("@(","(")
        exp_reguliere=exp_reguliere.replace("@)",")")
        exp_reguliere=exp_reguliere.replace("@+","+")
        exp_reguliere=exp_reguliere.replace("@*","*")
        while len(exp_reguliere)>1:
            exp_reguliere=exp_reguliere.replace("1*1","1")
            exp_reguliere=exp_reguliere.replace("1*0","0")
            exp_reguliere=exp_reguliere.replace("0*1","0")
            exp_reguliere=exp_reguliere.replace("0*0","0")
            exp_reguliere=exp_reguliere.replace("1+1","1")
            exp_reguliere=exp_reguliere.replace("1+0","1")
            exp_reguliere=exp_reguliere.replace("0+1","1")
            exp_reguliere=exp_reguliere.replace("0+0","0")
            exp_reguliere=exp_reguliere.replace("(0)","0")
            exp_reguliere=exp_reguliere.replace("(1)","1")            
        r=eval(exp_reguliere)
        return r
     
     
    # la chaine s ne contient pas "début" "fin" 
    s="je suis Pour l'instant \n moyennEment. TranQuILLe AvEC  les eXpressioNS \ REGULIERES. J'ai donc fait un petit programme"
    if recherche("@( @( suis @* instant @) @+ tranquil @) @* @!moi",s)==1 : print("OK")
    Si vous avez un avis...

    Merci
    Gabriel

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 696
    Par défaut
    Salut,
    Si vous avez un avis...
    Les expressions régulières ont disparu.
    Si vous voulez faire des opérations ensemblistes Python dispose de "set" et des opérations de réunion, intersection, ... Si vous passez par là, les tests ont déjà été fait pour vous.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Par défaut
    Mille merci. J'ai donc regardé la fonction set (qui se définit sur les listes)
    J'ai tapé le code suivant et effectivement, c'est pratique:
    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
     
    s="je suis Pour l'instant \n moyennEment. TranQuILLe AvEC  la reconnaissance de caractères. Sous votre conseil, j'ai utilisé la fonction set qui gère les listes comme des ensembles (par définition, énumération d'éléments dont l'ordre d'énumération n'intervient pas)."
    s=set(s.split())
    print("Ensemble formé à partir de la chaine:",s)
    ens1=set(["pour", "tranq", "moye"])
    print("Ensemble 1",ens1)
    ens2=set(["début"])
    ens3=set(["début","Fin", "moye"])
    ens4=set(["instant"])
    print("Ensemble 2",ens2)
    print("Ensemble 3",ens3)
    print 
    print("ens1 union ens2:",ens1|ens2)
    print("ens3 privé ens2:",ens3-ens2)
    print("ens2 privé ens3:",ens2-ens3)
    print("(ens1 union ens2) inter ens3:",(ens1|ens2)&ens3)
    print("ens1 union (ens2 inter ens3):",ens1|(ens2&ens3))
    Encore Merci
    Gabriel

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 696
    Par défaut
    Citation Envoyé par Ruyneau Voir le message
    Mille merci. J'ai donc regardé la fonction set (qui se définit sur les listes)

    Techniquement, lorsque vous faite set(qqc) le qqc peut être une liste mais il suffit que ce soit un "iterable" - qui est une chose qui ressemble à une liste mais qui est beaucoup plus "generique".
    Python 2.7 et 3.x permettent de construire les set plus simplement:
    ens1=set(["pour", "tranq", "moye"])
    peut s'écrire:
    ens1= { "pour", "tranq", "moye" }
    mais {} restant un dict "vide", un set vide reste set().
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. [RegEx] Expression régulières : Balises <SCRIPT>
    Par Gwipi dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2006, 23h25
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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