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

Algorithmes et structures de données Discussion :

Expression régulière (comparaison de deux chaînes de caractères)


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Expression régulière (comparaison de deux chaînes de caractères)
    Bonjour, dans le cadre d'un projet de développement, je dois travailler avec des expressions régulières. A partir du contenu d'un document, je dois trouver son espace de rangement associé.

    Je souhaite donc établir une règle de rangement pour chaque type de document.

    Au départ, je voulais réaliser une correspondance du type :

    Exemple 1:
    Si j'ai "Ingrédient" et "Oeuf" et "Temps de cuisson" -> Mon document est de type "Recette"

    Deux problèmes se sont posés, le premier celui des opérateurs ET(logique) qui n'existent pas en regex.
    Le second trouver des mot différents dans un fichier à des positions différentes sans utiliser de position absolue.
    C'est à dire en utilisant, des position relatives. (Oeuf à la ligne 1 2 ou 42).

    Pour le moment voici ce que j'ai réalisé,

    (?:^|\r|\n|\r\n)Ingrédient(?:^|\r|\n|\r\n)

    Elle me permet de chercher l’élément ingrédient dans tous mon document à des positions relatives. J'aimerai à présent ajouter le fait que "Oeuf" et "temps de cuisson" soit aussi présent au moins une fois dans le document.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 655
    Points : 188 665
    Points
    188 665
    Par défaut


    La syntaxe d'une expression régulière dépend beaucoup du moteur qui se charge de l'exécution . Des expressions régulières Perl ou JS ne se ressembleront pas, n'auront pas les mêmes fonctionnalités… Quel langage utilises-tu ?

    (Maintenant, bon, si tu ne fais que de la recherche d'une chaîne de caractères exacte, les expressions régulières… c'est un peu le bazooka pour tuer une mouche !)
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Je suis obligé d'utiliser des expressions régulières car mon projet l'impose.

    Les expressions régulières qui peuvent être saisies pour rechercher une séquence de caractères dans le nom, la localisation (chemin) ou le contenu du fichier doivent être exprimées dans un format compris par les expressions régulières de Java (voirhttp://cyberzoide.developpez.com/tutoriels/java/regex/).

    Je suis bien d'accord que l'utilisation d'expression régulière est exagéré, mais je n'ai pas le choix

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 258
    Points : 13 510
    Points
    13 510
    Par défaut
    Bonjour

    D'un point de vue "théorique" algorithmique, je ne sais pas.
    Mais d'un point de vue "manipulation de fichiers texte", les habitués du sous-forum Linux/"Shell et commandes GNU" font la répartition des fichiers en fonction de leur contenu, les doigts dans le nez avec awk, par exemple.

    Exemple de commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{i=0;o=0;t=0;} /Ingrédient/{i++;} /Oeuf/{o++;} /Temps de cuisson/{t++;} ENDFILE{print "Le fichier contient",i,"ingrédients,",o,"oeufs,",t,"temps de cuisson.";i=0;o=0;t=0;}' fichiers
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 885
    Points : 6 618
    Points
    6 618
    Par défaut
    Tu devrais poster un ou deux exemples significatifs de documents pour bien expliquer ton problème (et permettre des tests) et demander à un modérateur de déplacer ta question dans le forum Java (car je plussoie dourouc05 quant à la particularité de chaque moteur d'avoir et sa propre syntaxe, et son propre lot de possibilités, ses propres méthodes, mais aussi ses propres comportements).

    D'autre part, il est préférable pour éviter toute confusion avec la notion d'"expression régulière" des sciences de l'informatique qui se cantonne à la description de langages dits réguliers, de lui opposer le terme de "regex" qui lui désigne plutôt les expressions utilisées en pratique par les outils actuels et qui peuvent outrepasser, pour certains, cette limitation (ce n'est pas le cas de tous car il y a des avantages et des désavantages de part et d'autre). C'est par exemple le cas en ce qui concerne le moteur de regex de Java.

    C'est vraiment dommage que tu sois obligé d'en passer absolument par une regex, car du point de vue de la performance pour ce que tu cherches à faire ce n'est vraiment pas la panacée. Ce serait bien plus rapide de chercher les mots un par un avec des fonctions basiques.

    Pour garantir la présence de plusieurs mots dans une même chaîne, on utilise généralement quelque chose comme ça, à base de tests avant (lookahead):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \A(?s)(?=.*mot1)(?=.*mot2)(?=.*mot3)
    d'ailleurs on peut s'en passer pour le dernier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \A(?s)(?=.*mot1)(?=.*mot2).*mot3
    Un lookahead n'a pas de largeur et ne consomme pas de caractères. C'est juste un test qui permet de savoir si à partir de la position courante, une sous-pattern réussi ou non (le but est de contrôler ce qui se passe plus avant). Passé ce test, le reste de la pattern est étudié à partir de la même position.

    Le \A désigne le début de la chaîne, (?s) est un modificateur "en ligne" (inline modifier) qui stipule que le point peut représenter tous les caractères y compris le caractère \n (LF).

    (?=...) est donc le test avant (qui ne consomme pas de caractères, il se contente de tester pour voir si la sous-pattern qu'il contient réussie à la position actuelle et revient à cette position ensuite ou fait échouer la pattern si la sous-pattern échoue.)

    Si on veut s'assurer que mot1, mot2, mot3 sont bien des mots à part entière et ne font pas partie d'un autre mot, on peut aussi les encadrer avec des limites de mots (word boundaries: faire une recherche pour bien comprendre ce dont il s'agit et leur relation avec la classe de caractère \w):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \A(?s)(?=.*\bmot1\b)(?=.*\bmot2\b).*\bmot3\b
    Ces patterns sont écrites pour la méthode find(). L'idéal serait d'utiliser la méthode lookingAt() en enlevant le \A qui serait alors implicite. Pour ce qui est de la méthode matches(), enlève le \A et ajoute .* à la fin pour décrire toute la chaîne.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Pour être un peu plus complet dans les informations que je vous ai fournis.
    Voici un exemple de document que j'ai extrais

    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
    Fichier PDF d'exemple
    Le Portable Document Format (qui se traduit de l'anglais en « format de document
    portable »), généralement abrégé PDF, est un format de fichier informatique créé par
    Adobe Systems. C'est un format ouvert dont les spécifications sont publiques et
    utilisables librement (certains éléments sont à disposition sur le site Adobe). Il est
    dérivé du format PostScript et contient des données au format XML.
    Le format PDF est un format de fichier qui préserve les polices, les images, les objets
    graphiques et la mise en forme de tout document source, quelles que soient l'application
    et la plate-forme utilisées pour le créer. Les fichiers PDF peuvent être créés avec des
    options personnalisées, tant aux niveaux de la compression des images et des textes,
    de la qualité d'impression du fichier, ainsi que du verrouillage (interdiction d'impression,
    de modification...).
    Le format PDF n'est pas un format statique mais un format interactif. Il est en effet
    possible (grâce à Acrobat Pro) d'incorporer des champs de textes, des menus
    déroulants, des choix, des calculs... sur un document universel PDF : on parle alors de
    formulaire PDF.
    Le PDF est consultable sur de très nombreux appareils communicants (ordinateurs,
    assistants personnels numériques / PDA, nouveaux téléphones hybrides...). En effet, le
    lecteur gratuit, nommé « Adobe Reader » est disponible sur de très nombreuses
    plateformes et systèmes d'exploitations : Mac OS, Windows, Linux, Palm OS, Pocket PC,
    Symbian OS, Sun Solaris Sparc, IBM AIX, HP-UX, OS/2 / Warp... De nombreux autes
    lecteurs dont certains sont des logiciels libres, existent également. La génération de
    documents dans ce format est possible à l'aide de logiciels spécialisés, d'imprimantes
    virtuelles mais elle est également possible automatiquement dans certaines suites
    bureautiques. C'est ainsi que ce format universel est considéré comme le format
    mondial d'échange (et d'archivage) de documents électroniques.
    Il existe des variantes du format PDF de base, dit PDF 1.3 ou 1.4, des versions «
    rastérisées » (la rastérisation consiste à transformer les textes modifiables en images
    matricielles figées accompagnées des images d'illustration) dites PDF-IT et PDF-X. Cette
    version est principallement utilisée dans l'industrie graphique lors de la séparation des
    couleurs en quadrichromie, au niveau du RIP.
    Une nouvelle forme de fichiers PDF voit actuellement le jour. Dans ce dernier, le fichier
    image du texte est transformé en vecteurs au lieu d'un fichier bitmap, ce qui permet
    l'allégement du fichier ainsi que la capacité d'être agrandi à l'envie.
    En gros j'ai fais un Ctrl+A et Ctrl+V dans un sublime texte et j'effectue mes tests dessus.

    Par exemple si mon expression régulière trouve "adobe reader"+"pdf" = TRUE (règle de rangement)
    Je range mon fichier dans le dossier "Adobe".

    En gros je voudrais réaliser des règles de rangements de fichier par rapport à leur contenu.
    Si l'expression régulière est vrai, j'associe le fichier à son espace de rangement favoris (géré par ailleurs).

    Plusieurs informations utiles, je ne peu pas faire appel à des fonctions tels que matches() ou find() dans ma zone de saisie regex.

    J'ai essayé ton code Cosmo, mais je n'ai pas l'impression que ça fonctionne. J'ai pris une ligne au hasard dans le texte en remplaçant les trois mots par des mots de la ligne.
    Le test regex me renvois

    "[]".

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 258
    Points : 13 510
    Points
    13 510
    Par défaut
    Mouai. Tu ne précises pas grand chose. Ce que tu dis, nous l'avions compris.

    Si tu mets les "Adobe reader" dans "Adobe" et les "Silverlight" dans "Silverlight", si un texte contient les deux, est-ce que tu mets le texte dans les deux ? Un dossier spécial de regroupement ? Seulement le plus présent ?...

    Est-ce que tu as un fichier csv qui associe les expressions et le dossier qui leur est associé comme cible ?

    Est-ce que tu peux préciser ton système d'exploitation ? ton langage de programmation ? Bref, le contexte technique précis ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    J'ai juste besoin de faire la règle car le reste est déjà fais.

    Après je peux décrire le fonctionnement pour l'intérêt général, mais moi ça ne m'aide pas dans mon projet.

    Je travail dans une GED (gestionnaire en ligne de document).

    Elle fonctionne comme ça:

    je prends le document
    je le test à la règle de rangement n°1 : si vrai, je range et je passe au fichier suivant sinon, je passe à la règle n°2
    je le test à la règle de rangement n°2 : si vrai, je range et je passe au fichier suivant sinon, je passe à la règle n°3
    ...
    Je n'ai pas trouvé de règle me permettant de dire à quel espace de rangement le fichier est associé donc je met le fichier dans le dossier "A ranger manuellement".


    J'espère que ça vous aidera.

    J'ai effectuer des tests supplémentaires sur le code que tu as fournis Cosmo, mes règles fonctionnent.
    J'ai remarqué que ta regex fonctionne dans cet ordre : mot1, mot2, mot3
    Penses-tu qu'il serait possible de la faire fonctionner dans n'importe quel ordre ?
    Certainement avec un retour chariot à chaque fois qu'il trouve un mot?

    Je vais poursuivre mes tests.

    Voici un exemple de test concret :

    Nom : devcom.PNG
Affichages : 1553
Taille : 42,8 Ko

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/08/2013, 23h30
  2. Réponses: 4
    Dernier message: 07/06/2007, 22h35
  3. Comparer deux chaînes de caractères
    Par camoa dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 10/12/2006, 14h30
  4. Réponses: 11
    Dernier message: 24/03/2006, 11h12
  5. comparaison de deux chaines de caractères
    Par zazou41 dans le forum C++
    Réponses: 6
    Dernier message: 27/02/2006, 14h26

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