Recherche sans tenir compte des accents

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Recherche sans tenir compte des accents

Message par Marc56 »

Hello,

Voici pour ceux que ça peut intéresser, voici la méthode rapide que j'ai mis au point pour mon programme, pour effectuer la recherche de texte sans tenir compte ni des majuscules, ni des accents. (Il en existe sûrement des mieux, mais j'aime réinventer la roue)

Je ne traite ici que les 16 caractères accentués de la langue française, donc à adapter au besoin.

Le pseudo code est très simple:
- Lire la chaine à trouver lettre par lettre
- Si une lettre correspond à un motif, on la remplace par le motif (ex: "a" => "[aàâä]")
- Sinon on la laisse sans modification
- L'expression régulière est créée avec la nouvelle chaine (elle ignore les majuscules/minuscules)
- Si au moins un terme est trouvé, on quitte

Le code est volontairement explicite:
[aàâä] = Lettre "normale" suivi des déclinaisons.

La ligne ExtractRegularExpression(0, Txt$, Resultat$()) ici ne sert ici que comme affichage de Debug, car dans mon application, je me contente de surligner les branches du TreeGadget dont le titre ou le texte contient le terme cherché.

(Le texte exemple ci-dessous est celui de l'aide de la page sur les expressions régulières)

Code : Tout sélectionner

Txt$ = "Les expressions régulières permettent de rechercher, extraire ou remplacer n'importe quel texte "     +
       "dans une chaîne de caractères qui correspond à un motif (pattern) donné. "                            + 
       "Ces motifs sont souvent assez difficiles à écrire et à appréhender, "                                 + 
       "mais quand ils sont correctement utilisés ils rendent beaucoup de manipulations autour des chaînes "  +  
       "de caractères plus aisées. De fait, cette bibliothèque n'est pas pour les néophytes et il est "       +
       "conseillé d'avoir de solides bases en PureBasic et en programmation en général pour l'utiliser. "

Terme$ = "chaine"

a$ = "[aàâä]"
c$ = "[cç]"
e$ = "[eéèêë]"
i$ = "[iîï]"
o$ = "[oôö]"
u$ = "[uùûü]"
y$ = "[yÿ]"

For i = 1 To Len(Terme$)
     Lettre$ = Mid(Terme$, i, 1)
     Select Lettre$
          Case "a"
               RegEx$ + a$
               
          Case "c"
               RegEx$ + c$      
               
          Case "e"
               RegEx$ + e$          
               
          Case "i"
               RegEx$ + i$   
               
          Case "o"
               RegEx$ + o$               
               
          Case "u"
               RegEx$ + u$              
               
          Case "y"
               RegEx$ + y$     
               
          Case "i"
               RegEx$ + i$
               
          Default
               RegEx$ + Lettre$
     EndSelect
Next

Debug "Cherche: " + Terme$
Debug "RegEx  : " + RegEx$

CreateRegularExpression(0, RegEx$, #PB_RegularExpression_NoCase)

; Une seule occurence suffit 
If MatchRegularExpression(0, Txt$)
     ; --- Ici je met en surbrillance la branche de mon TreeGadGet
     ; --- SetGadgetItemColor(#Tree_0, ID_Note, #PB_Gadget_BackColor, $00FFFF)
     
     ; --- Ceci, ci-dessous sert juste ici à afficher le résultat de l'exemple
     Debug "Au moins une occurence a été trouvée."
     Dim Resultat$(0)
     ExtractRegularExpression(0, Txt$, Resultat$())
     Debug "Première correspondance trouvée: [" + Resultat$(0) + "]"
Else
     Debug "Aucune occurence trouvée."
EndIf

FreeRegularExpression(0)

End
Code utilisé dans la version 0.99.32 de mon TreeNote

PS. Mon programme TreeNote cafouille si on déplace une branche contenant des sous-branches. C'est la prochaine étape.

:wink:
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Recherche sans tenir compte des accents

Message par falsam »

Marc a écrit :j'aime réinventer la roue
C'est agréable de trouver soi même je suis d'accord.

Regarde quand même le poids d'un code qui embarque une expression régulière. Certes ce n'est pas énorme mais surprenant.

J'ai une méthode sans expression régulière si ça t’intéresse.

Code : Tout sélectionner

Procedure.s DisableAccent(Buffer.s)
  Protected i
  Protected CharToFind.s="àáâãäåçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝŸ"
  Protected CharToReplace.s="aaaaaaceeeeiiiinooooouuuuyyAAAAAACEEEEIIIINOOOOOUUUUYY"

  For i=1 To Len(CharToFind) 
   ReplaceString(Buffer, Mid(CharToFind,i,1), Mid(CharToReplace,i,1),#PB_String_InPlace, 1)
  Next
  ProcedureReturn Buffer
EndProcedure

Txt$ = "Les expressions régulières permettent de rechercher, extraire ou remplacer n'importe quel texte "     +
       "dans une chaîne de caractères qui correspond à un motif (pattern) donné. "                            + 
       "Ces motifs sont souvent assez difficiles à écrire et à appréhender, "                                 + 
       "mais quand ils sont correctement utilisés ils rendent beaucoup de manipulations autour des chaînes "  +  
       "de caractères plus aisées. De fait, cette bibliothèque n'est pas pour les néophytes et il est "       +
       "conseillé d'avoir de solides bases en PureBasic et en programmation en général pour l'utiliser. "

Debug DisableAccent(Txt$)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Recherche sans tenir compte des accents

Message par Zorro »

ma version :)

Code : Tout sélectionner

Declare.s transforme_find(chaine$,terme$)
Txt$ = "Les expressions régulières permettent de rechercher, extraire ou remplacer n'importe quel texte "     +
"dans une chaîne de caractères qui correspond à un motif (pattern) donné. "                            +
"Ces motifs sont souvent assez difficiles à écrire et à appréhender, "                                 +
"mais quand ils sont correctement utilisés ils rendent beaucoup de manipulations autour des chaînes "  +
"de caractères plus aisées. De fait, cette bibliothèque n'est pas pour les néophytes et il est "       +
"conseillé d'avoir de solides bases en PureBasic et en programmation en général pour l'utiliser. "
Terme$ = "chaine"
retour$=transforme_find(Txt$,terme$)
Debug "Cherche: " + Terme$
debug retour$
Procedure.s transforme_find(chaine$,terme$)
		;by Zorro
		ref$ = "àâäéèêëêëîïçôöùûüÿ"
		ref2$="aaaeeeeeeiicoouuuy"
		chaine_copie$=chaine$      
		chaine_copie2$=Terme$
		For i=1 to len(ref$)
				car$=mid(ref$,i,1)
				car_replace$=mid(ref2$,i,1)
				chaine_copie$=ReplaceString(chaine_copie$,car$,car_replace$)
				chaine_copie2$=ReplaceString(chaine_copie2$,car$,car_replace$)
		Next i      
		pos=FindString(chaine_copie$,chaine_copie2$,1,#PB_String_NoCase       )
		if pos>0
				sortie$= "le terme :"+chr(34)+terme$+chr(34)+" a été trouvé a la position :"+str(pos)
		Else
				sortie$="rien trouvé"
		Endif
		ProcedureReturn sortie$
EndProcedure

ha bah... lucky luck est passé par là :)
Dernière modification par Zorro le mer. 11/oct./2017 10:22, modifié 1 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Recherche sans tenir compte des accents

Message par Marc56 »

Merci pour ces idées.

@Falsam: Intéressant, mais ta méthode suppose de remplacer tout le texte cible, ce qui dans le cas de recherche sur plusieurs pages va peut-être prendre plus de temps. (Je vais tester)
Quant à l'augmentation de taille due à l’embarquement de la lib PCRE, mon prog a pris seulement 82 Ko de plus :)

@Zorro: Le problème de ta méthode est que si tu cherches avec les accents (Terme$ = "chaîne") alors cela ne fonctionne pas.

Ma méthode marche dans les deux cas (recherche stricte ou sans accents)
8)

Pourquoi cette aversion pour les expressions régulières alors que comme pour le Basic, ça permet d'aller au plus simple en peu de mots ?
Ce n'est pas une nouvelle méthode, ça existe depuis les années 40, soit 25 ans avant l'invention du premier basic
(on n'est pas forcé de lire le bouquin de référence (300 pages) pour s'en servir)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Recherche sans tenir compte des accents

Message par Kwai chang caine »

Bon......."vieux motard que jamais" :oops:

Merci beaucoup MARCO pour ce code 8)
Je cherchais un truc de ce genre et je me suis dit que le pistolero du regex avait surement posé ça "cake" part sur le FR :idea: "j'm'est" pas trompé :wink:

Parce que je cherche à être le plus rapide possible pour normaliser un texte ou bien pour rechercher un texte dans un autre sans tenir compte de certains caracteres
Au debut j'utilisais une daube de ma création à moi :mrgreen:

Code : Tout sélectionner

Procedure.s NormaliseTexteSansEspace(Phrase.s)
 
 Texte.s = ReplaceString(Phrase, "é", "e")
 Texte = ReplaceString(Texte, "è", "e")
 Texte = ReplaceString(Texte, "ë", "e")
 Texte = ReplaceString(Texte, "ê", "e")
 Texte = ReplaceString(Texte, "à", "a")
 Texte = ReplaceString(Texte, "ä", "a")
 Texte = ReplaceString(Texte, "â", "a")
 Texte = ReplaceString(Texte, "ç", "c")
 Texte = ReplaceString(Texte, "ö", "o")
 Texte = ReplaceString(Texte, "ü", "u")
 Texte = ReplaceString(Texte, "ù", "u")
 Texte = ReplaceString(Texte, "û", "u")
 Texte = ReplaceString(Texte, "ï", "i")
 Texte = ReplaceString(Texte, "î", "i")
 Texte = RemoveString(Texte, Chr(32))
 Texte = RemoveString(Texte, "-")
 Texte = RemoveString(Texte, ".")
 Texte = RemoveString(Texte, ";")
 Texte = RemoveString(Texte, ",")
 
 Texte = UCase(Trim(Texte))
 ProcedureReturn Texte
 
EndProcedure
Mais maintenant que je suis à plus de 15000 lignes à chercher (je veux pas utiliser de BDD :oops: ) et ben dire que ça rame un tantinet serait faire quelque peu usage de mauvaise foi :mrgreen:

J'ai même essayé de threader la normalisation des 15000 lignes avec le code ci dessus, mais même là c'est encore trop long :?

Donc en partant de ton super code, j'ai créé ça

Code : Tout sélectionner

Procedure TexteEstPresent(Texte.s, Recherche.s)
 
 RegEx$ = ""
 a$ = "[aàâä]"
 c$ = "[cç]"
 e$ = "[eéèêë]"
 i$ = "[iîï]"
 o$ = "[oôö]"
 u$ = "[uùûü]"
 y$ = "[yÿ]"
 
 For i = 1 To Len(Recherche)
 
  Lettre$ = Mid(Recherche, i, 1)
  
  Select Lettre$
   Case "a"
    RegEx$ + a$
   Case "c"
    RegEx$ + c$     
   Case "e"
    RegEx$ + e$         
   Case "i"
    RegEx$ + i$   
   Case "o"
    RegEx$ + o$               
   Case "u"
    RegEx$ + u$             
   Case "y"
    RegEx$ + y$     
   Case "i"
    RegEx$ + i$
   Default
    RegEx$ + Lettre$
  EndSelect
  
 Next

 CreateRegularExpression(0, RegEx$, #PB_RegularExpression_NoCase)
    
 If MatchRegularExpression(0, Texte)
  Trouve = #True
 Else
  Trouve = #False
 EndIf
 
 FreeRegularExpression(0)
 
 ProcedureReturn Trouve
 
EndProcedure
Et là déjà, grâce à toi, je revis :D

Alors outre le remerciement bien mérité, j'aurais une question subsidiaire ...
Dans ma procédure, je teste aussi les virgules, points espaces, tiret, etc... j'aimerais aussi traiter toutes la daubes qui ne serait pas des lettres...
Que faudrait il rajouter pour que ça ne tienne compte que des lettres et casse non sensible bien sur
Et si c'est possible (par miracle) plusieurs mots dans la même recherche et pas le même ordre

De sorte que si je recherche "franç|clau" il me sorte la phrase qui contient
"Claude|François" ou
"Claude François" ou
"François Claude" ou
"Claude|Francois" ou
"Claude-François" ou
"Claude-Francois" et cetera ...et cetera ...et cetera ...

Image

Oui je sais...je suis goulu :mrgreen:
The KeyMasterOfRegex a écrit :Pourquoi cette aversion pour les expressions régulières alors que comme pour le Basic, ça permet d'aller au plus simple en peu de mots ?
Pour faire une réponse la plus courte possible

Image

Parce que c'est trop dur ...ouinnnn....
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Recherche sans tenir compte des accents

Message par Shadow »

Ah Kcc tu ne cessera de me faire rire ^^
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
zaphod_b
Messages : 76
Inscription : mar. 09/déc./2014 20:02

Re: Recherche sans tenir compte des accents

Message par zaphod_b »

Salut,

uniquement pour windows (api) de pdwyer sur le forum us :

Code : Tout sélectionner

UTFChar.s ="éèàéùç"
*OutBuff = AllocateMemory(Len(UTFChar) * 3)
ActualSize = WideCharToMultiByte_(932, 0, @UTFChar, Len(UTFChar), *OutBuff, Len(UTFChar) * 3, 0, 0)
Debug ActualSize
Debug PeekS(*outbuff,actualsize,#PB_Ascii)
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Recherche sans tenir compte des accents

Message par Marc56 »

Dans ma procédure, je teste aussi les virgules, points espaces, tiret, etc... j'aimerais aussi traiter toutes la daubes qui ne serait pas des lettres...

Code : Tout sélectionner

Procedure TexteEstPresent(Texte.s, Recherche.s)
     
     RegEx$ = "\b"
     a$ = "[aàâä]"
     c$ = "[cç]"
     e$ = "[eéèêë]"
     i$ = "[iîï]"
     o$ = "[oôö]"
     u$ = "[uùûü]"
     y$ = "[yÿ]"
     
     For i = 1 To Len(Recherche)
          
          Lettre$ = Mid(Recherche, i, 1)
          
          Select Lettre$
               Case "a"
                    RegEx$ + a$
               Case "c"
                    RegEx$ + c$     
               Case "e"
                    RegEx$ + e$         
               Case "i"
                    RegEx$ + i$   
               Case "o"
                    RegEx$ + o$               
               Case "u"
                    RegEx$ + u$             
               Case "y"
                    RegEx$ + y$     
               Case "i"
                    RegEx$ + i$
               Default
                    RegEx$ + "."
          EndSelect    
     Next
     RegEx$ + "\b"
     
     Debug ~"\nCherche: " + Recherche + ~"\nRegEx: " + RegEx$ + #CRLF$
     CreateRegularExpression(0, RegEx$, #PB_RegularExpression_NoCase)
     If ExamineRegularExpression(0, Texte)
          While NextRegularExpressionMatch(0)
               Debug "  Trouvé >>>" + RegularExpressionMatchString(0) + "<<<"
          Wend      
     EndIf
     
     If MatchRegularExpression(0, Texte)
          Trouve = #True
     Else
          Trouve = #False
          Debug "  Aucune correspondance"
     EndIf
     
     FreeRegularExpression(0)
     ProcedureReturn Trouve
EndProcedure 

Txt$ = " Claude|François ou" +
       " Claude François ou" +
       " François Claude ou" +
       " Claude|Francois ou" +
       " Claude-François ou" +
       " Claude--François ou" +
       " Claude-Francois et cetera ...et cetera ...et cetera ..."

TexteEstPresent(Txt$, "Claude|François")
TexteEstPresent(Txt$, "Claude|+François")
TexteEstPresent(Txt$, "franç|clau") ; Ne peut fonctionner car le système ne peut pas savoir si séparateur de colonne ou 'ou'
Et si c'est possible (par miracle) plusieurs mots dans la même recherche et pas le même ordre
Plus compliqué car il faut indiquer si le pipe '|' doit être interprété comme l'expression régulière 'ou' ou comme un caractère littéral.
Le plus simple est alors de passer 2 expressions l'une après l'autre.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Recherche sans tenir compte des accents

Message par Kwai chang caine »

Tout d'abord merci à tous de votre réponse 8)
Dans l'ordre :
Ombré a écrit :Ah Kcc tu ne cessera de me faire rire ^^
C'est un peu le but :D
L'humour noir, c'est la politesse du désespoir (De Achille Chavée)
Merci mon grand :wink:

@ZAPHOD_B
Waooouuuh ! il a pensé à ça aussi l'adolescent boutonneux à lunettes de 80 ans 8O

Image

Merci beaucoup ZAPHOD !!! j'adore les API, je vais aussi l'essayer et la garde précieusement 8)
Et merci aussi à PDWYER bien évidemment :wink:

@MARC56
Merci beaucoup d'avoir si rapidement modifié ton code 8)
J'ai réfléchi à ta question et sondé au plus profond de "moa m'aime" (Expression fétiche de l'égocentrique exacerbé :mrgreen: )

En fait, les REGEX, c'est comme moult sujets de l'informatique.
Je les comparent un peu à l'ASM, le C, les Prototrucs, le SQL, la POO, ...
Ce sont des sujets qui m'attirent pour certains, voir même que j'adorent pour d'autres, que j'essaie depuis des années d'utiliser, avec plus ou moins de succès....
Disons moins ou moins de succès serait plus proche de la réalité :mrgreen:
Mais qui ont une difficulté inversement proportionnelle à la fréquence de leur utilisation.
Et je reste triste devant mon incapacité, maintes fois renouvelée :cry:

Ce sont pour moi des trombines neurones, j'arrive, avec de l'aide, parfois au cout de plusieurs jours, à faire à peu prés ce que je voulais faire, je suis heureux (tache dans la culotte), je crois que j'ai compris, et six mois, plus tard, j'en ai de nouveau besoin et c'est le désert de gergovi 8O :oops: :|
Ce genre de choses, pour s'en servir, soit tu les comprends et maitrise tout de suite, soit il faut les utiliser quotidiennement de façon à ce que cela devienne un espèce d'automatisme.

Ce sont des sujets extrêmement difficiles, j'en veux pour preuve que pour l'ASM, FRED a créé PB, pour la POO de nombreuses personnes ne la maitrise pas réellement, malgré un certain nombre d'années qu'elle existe, et les REGEX et SQL, certains membres ont même créé des logiciels pour tenter de les simplifier.
D’ailleurs pour ce qui est des REGEX, un membre de l'US a créé apparemment un truc de ouf, qui apparemment simplifie à mort, et apparemment aussi est génial, aux dires des autres membres 8)

Pourquoi, je dis apparemment ?
Parce que moi, je l'ai lancé, le cœur battant, la tête pleine d'espoir, le croupion tendu comme un soir de première conquête, me disant que enfin je pourrais maitriser ces envahisseurs : ces êtres étranges venus d’une autre planète. Leur destination : mon PC. Leur but : en faire leur univers. KCC les a vus.
Pour lui, tout a commencé par une nuit sombre, le long d’un bureau solitaire dans la ville, alors qu’il cherchait une réduction de texte que jamais il ne trouva.
Et bien même ce super code, plein de promesses, une fois lancé....j'ai rien compris à l'interface :cry:

Moi j'me dit, quant on fait ce genre de programme, c'est que l'on s'adresse à des handicapés du sujet, donc il faut se mettre à leur niveau...c'est à dire proche du plat ventre :mrgreen:
Et mettre deux boutons, des combos avec des choix bien explicites, une ergonomie qui ne laisse aucune place au hasard, comme l'a fait ZAPHOD pour sa MINILIB, bouton 1, Bouton 2, Bouton 3, comme ça tout le monde peut l'utiliser et dans le bon ordre.
Son logiciel est surement exceptionnel, mais il s'adresse déjà à des personnes qui comprennent ce qu'elle écrivent...donc peut être des personnes qui n'en ont pas vraiment besoin :|

Je sais, c'est extrêmement difficile de se mettre au niveau des nuls, j'ai le même problème avec ma belle mère en ce moment (et oui y'a pire que moi)
Mais on diras tout le mal que l'on veut, du boutonneux du dessus, mais lui, il a su le faire, à une époque ou utiliser un ordinateur relevait du championnat du monde d’athlétisme neuronal.
Des fenêtres qui bougent sans texte, des boutons, de la couleur, etc....
Bon après, il a peut être dérapé, mais l'intention du départ était la, contrairement à LINUX qui n'a pas pris ce parti du début et qui s'y met quand même un peu d’où son succès de plus en plus conséquent pour les personnes étanches à l'informatique 8)

Regarde ACCESS, il a su faire un générateur de SQL tout en texte, ou glissez déposé, etc...n'importe quelle blonde dégénérée, peut quant à elle générer une requête SQL en bon et due forme...on marche sur l'eau tous les jours dans les bureaux de direction 8O :mrgreen:
Regarde EXCEL, son filtre hyper évolué est un peu un REGEX, avec ses choix "Contient/Ne contient pas/Est différent/Est égal/Est supérieur/Est inférieur/Est ta sœur/Elle bat le beurre/A cent sous de l'heure/..."
Bref....que des trucs qui causent aux gens 8O et ça marche.... 8)

Après donner la possibilité de les modifier dans un mode dit "expert" c'est un plus qui aurait aussi son utilité...et voir même donnerait envie de mettre les mains dans le cambouis
Regarde aussi FRED, qui a eu la géniale idée de laisser la porte ouverte à l'ASM dans PB...qui de nous n'a pas eu des démangeaisons de taper un jour du texte rouge directement dans l'IDE ? que celui ci me jette la première souris :)

Image

Bah.. moi aussi !!! .... :D

Trouver un jour ces genres de giciels, simples, qui donnent en ce qui concerne les REGEX, la puissance et l’accès à cette merveilleuse invention, sans l'inconvénient de la difficulté incommensurable de ces 300 pages
Mais aussi pour tous les autres martiens de la prog....pour l'ASM y'a PB.....il reste encore des trous dans mon panier :wink:

En tout cas, en attendant, encore merci de ta précieuse aide MARC 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Recherche sans tenir compte des accents

Message par Zorro »

entre parentheses , je viens de me taper la totalité des episodes de Mr Vincent
et ça fini en queue de poisson , je suis tres déçus ....
le dernier episode de la saison 2 (oui il n'y a eu que 2 saisons )
je pensais voir repartir les gens au petits doigt tout raide , et ben non
, le dernier episode est comme tout les autres épisode , on voir le malheureux "jamais crus"
repartir en etant toujours a la recherche de la solution finale (entendre , l'eradication des gens bizarres qui viennent nous envahir ) :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Recherche sans tenir compte des accents

Message par Marc56 »

Trouver un jour ces genres de giciels, simples, qui donnent en ce qui concerne les REGEX, la puissance et l’accès à cette merveilleuse invention, sans l'inconvénient de la difficulté incommensurable de ces 300 pages
Logiciels: Oui, simple: Non

Tout simplement parce que comme pour un générateur de code, un générateur d'expression régulière n'est pas capable d'avoir une vision globale du problème à résoudre: il analyse de gauche à droite, et créé quelque-chose qui fonctionne mais qui est souvent difficile à éditer.

C'est là où l'intelligence artificielle montre ces limites. Le générateur d'expression va faire une seule expression compliquée là ou le programmeur va envisager plusieurs solutions en regardant tout le texte et par exemple faire deux passages successifs avec 2 expressions simples (une deuxième expression filtrant le résultat d'une première tout comme on fait en SQL en filtrant un résultat plutôt qu'utiliser des jointures)
L'humain est capable de repérer les limites (\b) immédiatement quelque soit leur forme alors que le programme doit encore analyser caractère par caractère.

Les didacticiels ne manquent pas, commencer par wikipedia
S'il faut choisir une implémentation à apprendre, prendre PCRE (Perl) c'est la plus courante et celle utilisée par PB

Note que tout comme M. Jourdain qui faisait de la prose, tu as sans doute fais des expressions régulières depuis des années: "Dir *.*" c'est une certaine forme de regex :wink:
Avatar de l’utilisateur
MLD
Messages : 1105
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Recherche sans tenir compte des accents

Message par MLD »

Bonjour a tous
Je vient jouer un peu dans votre coure. :P (Avec retard)
Avec un code simple, mais rapide :lol:

Code : Tout sélectionner

Txt$ = "Les expressions régulières permettent de rechercher, extraire ou remplacer n'importe quel texte "     +
       "dans une chaîne de caractères qui correspond à un motif (pattern) donné. "                            +
       "Ces motifs sont souvent assez difficiles à écrire et à appréhender, "                                 +
       "mais quand ils sont correctement utilisés ils rendent beaucoup de manipulations autour des chaînes "  + 
       "de caractères plus aisées. De fait, cette bibliothèque n'est pas pour les néophytes et il est "       +
       "conseillé d'avoir de solides bases en PureBasic et en programmation en général pour l'utiliser. "

Procedure.s Rtext(Txt$)
 B$ = "" 
 For z = 1 To Len(Txt$)
   If Asc(Mid(Txt$,z,1)) > 31 And Asc(Mid(Txt$,z,1)) <125
     BB$ = Mid(Txt$,z,1)
   Else
   Select Mid(Txt$,z,1)
    Case "à","á","â","ã","ä","å"
      BB$ = "a"
    Case "À","Á","Â","Ã","Ä","Å"
      BB$ = "A"
    Case "ç"
      BB$ = "c"
    Case "Ç"
      BB$ = "C"
    Case "è","é","ê","ë"
      BB$ = "e"
    Case "È","É","Ê","Ë"
      BB$ = "E"
    Case "ì","í","î","ï"
      BB$ = "i"
    Case "Ì","Í","Î","Ï" 
      BB$ = "I"
    Case "ñ"
      BB$ = "n"
    Case "Ñ"
      BB$ = "N"
    Case "ò","ó","ô","õ","ö" 
      BB$ = "o"
    Case "Ò","Ó","Ô","Õ","Ö"
      BB$ = "O"
    Case "ù","ú","û","ü" 
       BB$ = "u"
     Case "Ù","Ú","Û","Ü"
       BB$ = "U"
     Case "ý","ÿ"
       BB$ = "y"
     Case "Ý","Ÿ"
         BB$ "Y"
    EndSelect
  Endif
  B$ = B$ + BB$
 Next 
 ProcedureReturn B$
EndProcedure
Txt$ = Rtext(Txt$)
Debug Txt$
Dernière modification par MLD le mer. 11/oct./2017 13:47, modifié 1 fois.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Recherche sans tenir compte des accents

Message par Zorro »

Marc56 a écrit : @Zorro: Le problème de ta méthode est que si tu cherches avec les accents (Terme$ = "chaîne") alors cela ne fonctionne pas.
j'ai juste eu a ajouter 2 lignes de codes pour que ce soit possible ;)
(voir mon code)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Recherche sans tenir compte des accents

Message par Kwai chang caine »

Zorro a écrit :entre parentheses , je viens de me taper la totalité des episodes de Mr Vincent
et ça fini en queue de poisson , je suis tres déçus ....
le dernier episode de la saison 2 (oui il n'y a eu que 2 saisons )
je pensais voir repartir les gens au petits doigt tout raide , et ben non
, le dernier episode est comme tout les autres épisode , on voir le malheureux "jamais crus"
repartir en etant toujours a la recherche de la solution finale (entendre , l'eradication des gens bizarres qui viennent nous envahir ) :)
Je suppose qu'ils devaient penser faire une saison 3 ?
C'est comme pour kung fu, quant tu penses que les premiers ne sont même pas traduit et la dernière saison non plus....truc de dingue 8O
Quant tu vois qu'on traduit des navets comme "amour gloire et beauté" depuis des dizaines d'années pour des grand mères qui dorment devant la télé quand ça passe :lol:
Et que le seul, l'unique, l'irremplaçable Kung fu restera in vitam eternam en VOST :|
En ce moment, je suis comme toi, ce doit être l'approche du sapin ou un truc "çacomme", j'ai envie des séries qui ont construit mes fondations
Je me suis regardé quelques "Au cœur du temps" 8) et surtout le pilote (qui était pas dans l'avion non plus celui là :lol:)

@MARC56
Merci pour tes explications, je me doutais bien de cette réponse :|
En tout cas, le mec qu'a pensé ça, il devait boire le même biberon que celui qui a inventé la fonction "PrintF" du C
Tellement de choses et de combinaisons, en si peu de lignes....au final..je me demande si je préférè pas les instructions longues moi :oops:
Mais ce qui est valable dans ce genre de fonctions, c'est leur optimisation poussée à l’extrême, par des pros du pot, donc leur rapidité, une vraie lib à elles seules 8)

@MLD
Perso j'aurais aussi fait comme ça, sans REGEX, mais j'ai peur que cette methode ai ses limites dans le cas d'analyse de milliers de lignes. :|
Les REGEX doivent surement être plus rapide....
Quoi qu'il en soit, merci pour le code 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Recherche sans tenir compte des accents

Message par Marc56 »

Exact: mettre tous les mots en majuscules est possible pour des petits texte, mais pas pour un grand.
Exemple avec la liste des mots français (et grammaire) soit 295 000 mots
Sur mon petit i3: 0.17 secondes pour trouver le dernier avec les expressions régulières.

Code : Tout sélectionner

Cherche: oterent
RegEx  : \b[oôö]t[eéèêë]r[eéèêë]nt\b
Match: otèrent
    Position: 3383870
    Longueur: 7
Temps: 0.17 seconde(s)

Code : Tout sélectionner

; http://www.lexique.org/listes/liste_mots.php
; Liste des mots fusionnée (295 000 entrées)


If Not OpenFile(0, "c:\tmp\liste_mots_mix.txt")
     Debug "Fichier non chargé"
     End
EndIf

While Not Eof(0)
     Txt$ = ReadString(0, #PB_Ascii | #PB_File_IgnoreEOL)
Wend
CloseFile(0)

start = ElapsedMilliseconds()

Terme$ = "oterent"

a$ = "[aàâä]"
c$ = "[cç]"
e$ = "[eéèêë]"
i$ = "[iîï]"
o$ = "[oôö]"
u$ = "[uùûü]"
y$ = "[yÿ]"

RegEx$ = "\b"

For i = 1 To Len(Terme$)
     Lettre$ = Mid(Terme$, i, 1)
     Select Lettre$
          Case "a"
               RegEx$ + a$
               
          Case "c"
               RegEx$ + c$     
               
          Case "e"
               RegEx$ + e$         
               
          Case "i"
               RegEx$ + i$   
               
          Case "o"
               RegEx$ + o$               
               
          Case "u"
               RegEx$ + u$             
               
          Case "y"
               RegEx$ + y$     
               
          Case "i"
               RegEx$ + i$
               
          Default
               RegEx$ + Lettre$
     EndSelect
Next

RegEx$ + "\b"

Debug "Cherche: " + Terme$
Debug "RegEx  : " + RegEx$

If CreateRegularExpression(0, RegEx$)
     If ExamineRegularExpression(0, Txt$)
          While NextRegularExpressionMatch(0)
               Debug "Match: " + RegularExpressionMatchString(0)
               Debug "    Position: " + Str(RegularExpressionMatchPosition(0))
               Debug "    Longueur: " + Str(RegularExpressionMatchLength(0))
          Wend
     EndIf
Else
     Debug RegularExpressionError()
EndIf

FreeRegularExpression(0)

Debug "Temps: " + StrF((ElapsedMilliseconds() - start) / 1000.0, 2) + " seconde(s)"

End 
Répondre