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

Langage PHP Discussion :

Expression régulière conditionnelle [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut Expression régulière conditionnelle
    Bonjour,

    j'aurais aimé savoir si il était possible de faire une regexp qui permet de matcher un patern dans certaines conditions.
    Je m'explique:
    - si j'ai la phrase: "6789 mon mot: ...", je veux matcher "6789 mon"
    - si j'ai la phrase: "6789 mon mot ...", je veux matcher "6789 mon mot"
    Dites-moi si je ne suis pas assez clair et je tenterai d'être un peu plus explicite.

    Merci d'avance

  2. #2
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut
    bonjour,
    Tu peux faire des 'ou' avec '|'.
    je pense que qq chose comme ca devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (((6789 mon)mot:)|(6789 mon mot))
    Z.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    le probleme est que j'ai besoin de qqch de générique :/

  4. #4
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut
    pourrais-tu definir exactement ce que tu recherches a capturer ?
    Dans le pire des cas, tu peux toujours ecrire 2 regex. Il ne faut pas être avard :p

  5. #5
    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
    ceci doit convenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '\d+ mon(.*?[^:](?= ))?'

    PS

    vouloir utiliser les regex sans connaître le assertions avant et arrière, positives et négatives,
    ni l’assertion conditionnelle
    c’est “Mission Infaisable“ pour certains cas de figures.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    En fait je veux matcher dans un texte des codes postaux et villes
    Je pensais a une assertion négative mais ... impossible de la mettre en place...

    Pour le moment ma regexp ressemble a ceci: ([[:digit:]]{4,6}[ \t]+[\- [:alpha:]]+)
    Je veux donc matcher des digits, suivi d'espaces/tabulations et d'un ensemble d'espaces, tirets, caracteres alphabétiques. Ce que je cherche donc c'est de pas matcher les mots suivies directement d'un ":"
    J'ai testé de rajouter l'assertion négative (?!\: ) (enlevez l'espace apres le : mais ca fait un joli petit smiley sinon ^_^) mais ce n'est pas vraiment concluant, ca ne me matche juste pas la derniere lettre

    Donc par exemple si j'ai: "13000 Marseille motànepasmatcher:"
    Je veux m'arrêter à matcher "13000 Marseille"
    J'espere avoir été plus clair

  7. #7
    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
    Pourquoi écris-tu :digit: au lieu de \d ?
    Pourquoi :digit: est entre crochets ?
    Pourquoi des crochets autour de [:digit:] ?

    D’où sort la notation :alpha: ? C’est une notation PHP ? Je ne l’ai pas trouvée dans le manuel:
    http://fr2.php.net/manual/fr/book.pcre.php

    Pourquoi définir une classe contenant le tiret, un blanc et une lettre (:alpha ? et faire répéter ça par + ?



    Je ne vois rien de compliqué à utiliser la RE de mon précédent post pour construire une RE qui fait ce que tu veux faire:
    en Python ça donne ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import re
     
    ch = "lettre vers 13000   - Marseille motanepasmatcher:"
     
    pat = re.compile('\d{4,6}[ \t]+\- [a-zA-Z]+(.*?[^:](?= ))?')
     
    print pat.search(ch).group()

    Excusez moi de mettre en Python, c’est une facilité que je m’accorde. Mais comme je comprends le PHP que je lis, à peu près, je pense que vous n’aurez aucun mal à comprendre du Python.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    Il existe des classes de définition en php (http://www.zytrax.com/tech/web/regex.htm)

    Les crochets sont obligatoires, sinon on obtient une erreur "Compilation failed: POSIX named classes are supported only within a class at offset ..."

    La classe constitué du alpha, espace et tiret était la pour matcher les nom de villes pouvant tenir sur plusieurs mots avec comme separateur espace ou tiret

    J'ai modifié ma regexp comme ceci pour le moment
    ([[:digit:]]{4,6}|[[:digit:]]{2} [[:digit:]]{2,4})[ \t]+([[:alpha:]öôëêéèâäàîïçûü\']|[\- ]){4,}(?!\
    sauf que ca me supprime uniquement la dernière lettre juste avant le ":"
    J'ai testé ce que vous m'avez dit, en effet sous python ca fonction alors qu'en php... non

+ 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