|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 213 ![]() |
Bonjour,
je réalise des REGEX pour normaliser des chaines de caractères complexes présentes dans mes données. J'ai écrit un bout de code avec des assertions arrières qui pose pas de problèmes voici un exemple Code :
Code :
Je voulais faire des variantes à deux caractères de mes balises* Par exemple je voulais que la regex reconnaisse non seulement *V* , *I* et *L* mais également *VN* , *IN* et *LN* Donc je me suis dit, c'est simple il suffit de remplacer la description de tes balises qui s'écrivent en [VIL]\* ou \*[VIL]\* par [VIL]N?\* ou \*[VIL]N?\* et là à ma grande surprise SAS n'accepte pas à la compilation Code :
Code :
([VIL]N?) par (?:[VIL]N|[VIL]) Code :
Code :
|
||||||||||||
|
|
00
|
|
|
#2 |
![]() ![]() Stéphane Consultant et formateur SAS et Cognos Inscription : avril 2009 Messages : 1 791 ![]() |
pourquoi tu fais des assertions arrières ?
Pourquoi tu n'attrapes pas déjà ce qui est entre deux * par _reg_etoile= prxparse('/*(.+)*/i'); pour voir déjà ?
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !Moteur de recherche dans les papiers SAS |
|
00
|
|
|
#3 | ||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 213 ![]() |
Pourquoi je fais des assertions arrières ?
Parce que je fais de la grammaire ! ![]() Le résultat obtenu dans la première proc print est bien celui que je veux dans les cas Code :
mais ne surtout rien toucher aux autres. Il y a des règles bien spéciales qui se cache derrière cette expression régulière. Il s'agit d'explorer une variable texte d'adresse en regroupant ses différentes composantes par catégories pertinentes. Pour comprendre un peu Par exemple 6 RUE DE LA MONTEE DU FORT RESIDENCE LE RICHELIEU LA RESIDENCE DU QUAI 6 RUE DE LA LIBERTE ALLEES DES RESIDENCES FLEURIES Elle se "dépiotte" classiquement avec des mots clés structurants présent dans les adresses comme "RUE" , "MONTEE" , "RESIDENCES" , "QUAI" , "ALLEES" 6 RUE DE LA MONTEE DU FORT RESIDENCE LE RICHELIEU LA RESIDENCE DU QUAI 6 RUE DE LA LIBERTE ALLEES DES RESIDENCES FLEURIES Seulement à priori on ne sait pas vraiment ou couper... Donc j'essaye de former des mots grâce aux articulations Premièrement je met mes balises 6 *V*RUE*V* DE LA *V*MONTEE*V* DU *L*FORT*L* *I*RESIDENCE*I* LE RICHELIEU LA *I*RESIDENCE*I* DU *V*QUAI*V* 6 *V*RUE*V* DE LA LIBERTE *V*ALLEES*V* DES *L*RESIDENCES*L* FLEURIES ensuite je réduis les articulations 6 *V*RUE*V* *D1 *V*MONTEE*V* *D2 *L*FORT*L* *I*RESIDENCE*I* *L1 RICHELIEU *L2 *I*RESIDENCE*I* *D2 *V*QUAI*V* 6 *V*RUE*V* *D1 LIBERTE *V*ALLEES*V* *D3 *L*RESIDENCES*L* FLEURIES Je vous passe les étapes, et à la fin je dois arriver à 6 RUE DE_LA_MONTEE_DU_FORT RESIDENCE LE_RICHELIEU LA RESIDENCE DU_QUAI 6 RUE DE_LA_LIBERTE ALLEES DES_RESIDENCES_FLEURIES Mais pour cela je dois désactiver dans certains cas certains balises préalablement mises "MONTEE" et "FORT" clairement articulées dans RUE DE LA MONTEE DU FORT et ne consituent ni une indication de lieu (FORT) ni de voie "MONTEE" De même que QUAI dans RESIDENCE DU QUAI et RESIDENCES DANS RUE DES RESIDENCES FLEURIES C'est ce à quoi me sert cette REGEX, mais pour désactiver une balise, faut il encore que je sache si il y a une balise auparavant, car si ce n'est pas le cas c'est que c'est bien une balise valide, comme RUE et RESIDENCE dans "6 RUE DE LA MONTEE DU FORT RESIDENCE LE RICHELIEU". D'où l'utilité des expressions arrières, non ? |
||
|
|
00
|
|
|
#4 |
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 213 ![]() |
Après quelques essais, je pense avoir trouvé la raison du problème, qui n'est cependant pas une explication.
Les assertions arrières ne semblent pas supporter les longueurs variables. Je n'ai aucune idée si ça viens de l'implémentation SAS des Regex de Perl, ou si c'est dans les spécifications de Perl. Je suis toujours à la recherche d'une solution pour contourner le problème, car je préfère suffixer mes balises *I* éventuellement en *IN* plutot qu'en *J* ce pour des raisons de souplesse et de clareté des traitements. Une autre solution serait de doubler la lettre ou de la suffixer par 0 pour exprimer qu'elle n'a pas de suffixe, *V* deviendrait *VV* ou encore *V0* *I* deviendrait *II* ou *I0* . Et mes alternatives se feraient sous longueur fixe, par exemple avec la suffixation en 0 [VIL][0N] à la place de [VIL] devrait pas poser de problème, je trouve ça néanmoins un peu lourd... |
|
|
00
|
|
|
#5 |
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 213 ![]() |
J'en ignore la raison, mais l'explication est ici
Look-Ahead and Look-Behind Behavior "specifies a zero-width, positive, look-behind assertion. For example, in the expression (?<=regex1) regex2, a match is found if both regex1 and regex2 match. regex1 is not included in the final match. Works with fixed-width look-behind only." http://support.sas.com/documentation...a003288497.htm Je n'avais donc pas à aller loin... et donc pas de longueur variables dans les assertions arrières, par contre elles sont acceptées dans les assertions avant... Résolu |
|
|
10
|
Copyright © 2000-2012 - www.developpez.com