Découpage de groupes de mots

Webperegrino

XLDnaute Impliqué
Supporter XLD
Bonjour Le Forum,

Sur Le Forum, une application m’a permis de personnaliser mon fichier dont voici un exemplaire. Je suis désolé de ne pas pouvoir rappeler ici le concepteur ; je pense que c’était TIBO qui avait permis son amélioration. J’ai ainsi pu m’en servir de référence pour ce que vous allez visiter.

Toutefois je m’acharne sur la ligne suivante :

VB:
EXPRESSION = _
"\b((S[ALRS]{2,4}|S[A.L.R.S.]{2,8}|S[A.LR.S.]{2,7}|(\s(SA)|(M[M]{2,2})|(M[ME]{2,3})|(M[me]{2,3})|M[M.]{2,2}|M[r]{2,2}|M[Mr]{2,2}|(M[MR]{2,3}))\b)"

En effet le résultat souhaité en colonne B ne se fait pas correctement par exemple lorsque Mr précède un groupe de mots de la colonne A.
Les autre civilité cela fonctionne bien.

Quelqu’un peut-il aussi me faire de la pédagogie sur la conception de cette ligne si particulière de la macro-commande VBA? Pourquoi par exemple la macro ne prend pas en compte MR ou Mr ou encore M. (avec un point) et comment faut-il procéder pour que cela fonctionne aussi pour ces civilités à retirer dans le résultat en colonne B ?

Merci à l’avance,
Webperegrino
 

Pièces jointes

  • DÉCOUPAGE DE GROUPE DE MOTS.xls
    51.5 KB · Affichages: 34
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Découpage de groupes de mots

Bonsoir

Tibo est un excellentissime formuliste, mais je ne crois pas qu'il ait encore céder aux charmes de RegExp
Par contre JNP ou david84 sont eux deux regexpiens avertis et passionnés par le pattern débridé et alambiqué ;)

Alors qui de ces deux Grand Maîtres du "String Régalien" a commis ce superbe pattern ?
"\b((S[ALRS]{2,4}|S[A.L.R.S.]{2,8}|S[A.LR.S.]{2,7}|(\s(SA)|(M[M]{2,2})|(M[ME]{2,3})|(M[me]{2,3})|M[M.]{2,2}|M[r]{2,2}|M[Mr]{2,2}|(M[MR]{2,3}))\b)"
 

Webperegrino

XLDnaute Impliqué
Supporter XLD
Re : Découpage de groupes de mots

Bonjour LE FORUM et STAPLE1600
Merci STAPLE1600 pour ton intervention,

Sans savoir comment fonctionne cette belle et si étrange formule, voici ce que j'ai tenté :
- avec }|(M[MR ]{2,2} ça bug complètement
- avec un espace derrière mes parties à problème et en gardant 3 en pos n°2 de cette façon ...
|(M[MR ]{2,3}
...la macro fait parfaitement le travail.
Mon problème est ainsi réglé

VB:
EXPRESSION = _
"\b((S[ALRS]{2,4}|S[A.L.R.S.]{2,8}|S[A.LR.S.]{2,7}|(\s(SA)|(M[M]{2,2})|(M[ME]{2,3})|(M[me]{2,3})|M[M. ]{2,3}|M[Mr ]{2,3}|(M[MR ]{2,3}))\b))"

Je reste toujours preneur d'une bonne explication pour ce code pour pouvoir étendre une utilisation dans d'autres applications, et avec intelligence.
Bonne journée
Webperegrino
 

Staple1600

XLDnaute Barbatruc
Re : Découpage de groupes de mots

Bonjour Webperegrino

Je m'occupe de prévenir les grands gourous du Pattern Régulier.
Nous reviendrons t'aider incessamment sous peu.

EDITION: Bonjour BrunoM45
Note pour plus tard:
  • A l'avenir ne pas oublier la FAQ XLD et les trésors WIKI du Grand Michel ;)
Merci pour cette piqûre de rappel ;), BrunoM45.
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Découpage de groupes de mots

Bonjour,
pas le temps actuellement.
Je regarderai cela ce soir ou demain si tu n'as pas réglé ton problème.
Note manuellement les résultats attendus pour que l'on puisse envisager les différentes solutions.
Teste cela au cas où pour commencer (si cela peut te faire avancer de ton côté)
Code:
EXPRESSION = "(\s|^)(S.?A.?(R.?L.?)?|M.|MME)(\s|$)"
et place
Code:
.Global = True
.ignorecase = True
.Pattern = EXPRESSION
A+
 

JNP

XLDnaute Barbatruc
Re : Découpage de groupes de mots

Bonjour le fil :)
Merci Jean-Marie de ton appel, mais je pense que ni David ni moi n'en sommes le géniteur, je ne comprends pas pourquoi on aurait fait une classe avec plusieurs fois le même caractère, [A.L.R.S.] s'écrivant normalement [ALRS.]... :eek:
De plus, en ce qui me concerne, je privilégie les fonctions aux sub dans ces cas-là :)
Je me souviens avoir travailler sur quelque chose de ce type, mais j'utilisais une liste exhaustive...
Maintenant, en plus, jouer sur des combinaisons, je ne suis pas sûr que ça ne "mange pas" quelque chose en trop... l'enseigne Mr Bricolage va être tronquée, alors qu'elle ne devrait pas exister, vu que Mr signifie Mister en anglais, alors qu'en bon français, ce devrait être M. :rolleyes:...
Le motif de David est meilleur, simplement j'aurait ajouté Mlle, et précisé 0 ou 1 pour M. :)
Code:
"(\s|^)(S.?A.?(R.?L.?)?|M.?|MME|MLLE)(\s|$)"
Bonne suite :)
PS : IgoreCase ? Excellent David, encore un pas en avant :)
 

Staple1600

XLDnaute Barbatruc
Re : Découpage de groupes de mots

Re,

Juste pour remercier les grands gourous regexpiens d'être venus à la rescousse.
Du coup, j'ai plus d'excuse pour échapper à la corvée de lessive et tutti quanti ;)

Mais que ne ferait-on pas pour honorer le Grand Pattern de Derrière les Fagots ;) ?!
Merci les gars et à plus tard.

PS1: Webperegrino, reviens vite goûter ces patterns , ils sont tout frais, ce ne sont pas des patterns en boite.
Désolé, je sors ;)

PS2: Bonjour en passant à JCGL ;)
 

Webperegrino

XLDnaute Impliqué
Supporter XLD
Re : Découpage de groupes de mots

Bonsoir Le Forum,
Bonsoir Les Amis qui êtes venus dans cette conversation : j'ai maintenant de la nourriture pour expérimenter.
Le code VBA que j'ai placé en #3 a été expérimenté dans mon application : et ça fonctionne ! (j'ai même ajouté EURL, E.U.R.L.).
Je vais aussi essayer l'expression de David84 et la proposition complémentaire de JNP (j'approuve sa remarque pour le M. ou M français à employer chez nous, même ici en Bretagne !).
Je vous remercie tous de vos suggestions ; me voilà comblé et je dois maintenant rechercher l'expression la plus pratique.
Par souçis de perfectionnisme, ou du moins de diversité de création, peut-être même les emploierai-je toutes dans mes prochaines applications similaires...
C'est vraiment sympa à vous de vous être attardés sur ma requête. Je vous souhaite tous un excel_lent week-end,
Webperegrino
 

david84

XLDnaute Barbatruc
Re : Découpage de groupes de mots

Re
Le code VBA que j'ai placé en #3 a été expérimenté dans mon application : et ça fonctionne ! (j'ai même ajouté EURL, E.U.R.L.).
ne pas confondre et le fait qu'il fonctionne avec le fait qu'il soit fonctionnel :
Code:
"\b((S[ALRS]{2,4}|S[A.L.R.S.]{2,8}|S[A.LR.S.]{2,7}|(\s(SA)|(M[M]{2,2})|(M[ME]{2,3})|(M[me]{2,3})|M[M. ]{2,3}|M[Mr ]{2,3}|(M[MR ]{2,3}))\b))"
4 exemples parmi d'autres :
Code:
S[ALRS]{2,4}
prend en compte SA,SL,SR,SS,SAL,SLR,SSS,SLL,SRA,SSSS,SAAA,SLLL, etc.
Code:
S[A.L.R.S.]{2,8}
aucun intérêt par rapport au précédent (qui est lui-même très approximatif), si ce n'est qu'il accepte le "."
Code:
M[M]{2,2}
:{2,2} doit s'écrire {2} et ce motif accepte M ou MMM : quel intérêt par rapport à ta demande ?

Aucun intérêt de décliner les possibilités en majuscules ou en minuscules : IgnoreCase=true est fait pour cela.

J'arrête là mais ce motif manque pour le moins de précision, de concision et de factorisation.

En conclusion : utilise IgnoreCase comme indiqué et part sur la proposition de JNP si tu veux traiter "M" sans point et MLLE.
Il te suffira ensuite d'enrichir le pattern si nécessaire.
A+

Edit: dans le message de Michel Xld ici, le lien vers la démo de Michel_m ne mène nul part...quelqu'un aurait-il ce fichier en sa possession ?
 
Dernière édition:

Statistiques des forums

Discussions
312 799
Messages
2 092 239
Membres
105 299
dernier inscrit
doudounapnap