|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 212 ![]() |
Bonsoir,
J'essaye de nettoyer une variable contenant beaucoup d'abréviations "espacées". Par exemple séparés par des espaces : "E H P A D" à la place de "EHPAD" ou bien par des points : "O.N.U" à la place de "ONU" et quelque fois combinaison des deux (sans être mélangés) "O.T.A.N O.N.U" à la place de "OTAN ONU" Pour être clair dans mon exemple théorique je cherche à supprimer les blancs ou les points entre les lettres isolées par des points ou des blancs et uniquement dans ces cas là, sachant que dans une même abréviation le séparateur est soit "espace" de partout soit "." de partout mais pas les deux mélangés, par contre dans une même modalité on peut avoir un mélange avec une abréviation séparée avec des points et une autre par des espaces comme dans l'observation n°21 Je ne cherche pas non plus à remplacer tous les points par des espaces (trop facile )J'ai réalisé un code qui fonctionne... Enfin qui fonctionne presque ! Car dans certains cas il ne fonctionne pas contre toute attente Deux exemples sont donnés par les observations n°22 et 25. Dans le premier cas I.M.E n'a pas été remplacé par IME et dans le deuxième cas E.H.P.A.D n'a pas été remplacé par EHPAD alors que la même expression régulière a marché pour l'abréviation juste à gauche... Je ne vois pas où est mon erreur... Et ensuite j'aimerais savoir si quelqu'un a des idées pour optimiser le code car je le trouve très lourdingue pour faire une chose somme toute assez simple (mais j'avoue que je n'ai pas trouvé plus simple Comment avoir un code plus compact ? Par récursivité ? (si ça existe dans les expressions régulières...) Edit : Si vous avez une solution sans expressions régulières je suis aussi preneur, mais a moins d'une fonction SAS ad-hoc que je ne connaitrais pas, il me semble que ce soit pas si simple que ça à programmer sans expressions régulières(ou alors je n'ai pas pris le problème par le bon côté). Le code Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bonjour Jérôme.
Je te propose ces transformations qui me semblent un peu plus simples à suivre, mais j'espère qu'elles couvrent tous les cas. Il s'agit de repérer les lettres isolées, séparées de celle de gauche et de celle de droite par un point ou par un espace. Code :
Bon courage. Olivier |
||
|
|
00
|
|
|
#3 | ||||||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 212 ![]() |
Bonjour Olivier, et bien ya de l'idée
, c'est effectivement beaucoup plus simple, mais ton code ne fait pas encore tout a fait le résultat demandé.Code :
Pour les observations 1,2,3,6,8 et 20. Une précision supplémentaire, dans mon esprit la séparation "." est prioritaire par rapport à la séparation en " ". Par exemple "A B.C D" doit devenir "A BC D" et non "AB.CD". Par contre rajouté à mon code du début, ton code vient en "patch" là où mon code ne fonctionnait pas (c'était un peu le but). Si quelqu'un a plus court ? Code :
Code :
SAUF QUE si cela fait toutes les choses souhaitées..., cela fait des choses non souhaitées aussi... par exemple dans le cas "mot1+séparateur+lettre+séparateur+mot2" transformé en "mot1+lettre+mot2" cette transformation n'étant pas souhaité en théorie (bon dans la pratique je pense qu'on peut faire avec) Code :
|
||||||||
|
|
00
|
|
|
#4 | ||
|
Membre confirmé
![]() Inscription : janvier 2010 Messages : 185 ![]() |
Bonjour,
je propose cette solution qui utilise les assertions avant et arrière : Code :
une lettre isolée est :
(?<!\w) et (?!\w{2}) sont de longueurs nulles : ils servent à décrire les lettres constitutives des acronymes mais ne sont pas "recouverts" par l'expression régulière entière. Donc remplacer (?<!\w)(\w)\s(?!\w{2}) par la capture $1 a pour conséquence de supprimer le blanc \s qui suit (\w). |
||
|
|
30
|
|
|
#5 |
![]() ![]() Stéphane Consultant et formateur SAS et Cognos Inscription : avril 2009 Messages : 1 791 ![]() |
on a officiellement trouvé notre champion du monde en expressions rationnelles.
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !Moteur de recherche dans les papiers SAS |
|
00
|
|
|
#6 | ||
|
Membre confirmé
![]() Inscription : janvier 2010 Messages : 185 ![]() |
@datametric: merci pour la ola et pour le titre
que je m'empresse de remettre en jeu.Pour repartir sur le sujet, j'ai réglé un peu vite le cas des points en les supprimant sans autre forme de procès. En fait le problème est le même que pour les espaces. On peut donc leur appliquer le même traitement. Code :
|
||
|
|
20
|
|
|
#7 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Même si les chinois nous envahissent, ça reste du chinois pour moi
chapeau sasadm
|
|
|
00
|
|
|
#8 | ||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 212 ![]() |
AHHH voici un code plus plaisant !
Génial ! Merci sasadm ! Etant en congés quelques jours je repasse la semaine prochaine, j'ai encore quelques cas que je n'avais pas prévu et qui me posent problème, mais je verais tout cela plus tard, car il s'agit juste de raffinement. Par exemple Code :
Code :
|
||||
|
|
00
|
|
|
#9 | ||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 212 ![]() |
double poste pour la fin, j'ai rajouté une reg0 au code de sasadm pour traiter les derniers cas qui me souciaient, le code ne fait pas à 100% ce que je voulais mais à 99,5% , le reste (quelques disparitions non voulues de points en rouge) je m'en arrangerais autrement et sont au final sans trop d'importance par rapport à l'utilisation que je veux en faire
Code :
Code :
![]() ![]() ![]() ![]() Merci !!!! |
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com