Regex extraction d'un libellé importé

Discussions sur la création de règles dans iCompta et notamment l'élaboration d'expressions régulières
Répondre
jaladuvar
Messages : 180
Inscription : 19 février 2011, 08:35

Regex extraction d'un libellé importé

Message par jaladuvar »

Autre sujet:
Je récupère certaines opérations depuis les affichages dans mes divers comptes sur internet, certains n'ayant pas le statut de relevés pouvant être traités directement par iCompta.
Je récupère les informations dans un fichier csv que j'importe, mais le libellé(=nom pour icompta) est à la fois encombré et riche d'éléments que je souhaite soit éliminer, soit re-distribuer sur d'autres champs. Je bute actuellement sur la regex (ou les regex) qui me permettraient de traiter cette question.
En particulierJe souhaite rationaliser les noms, en en éliminant tout ce qui est variable, afin de pouvoir catégoriser les écritures correspondantes.En effet iCompta ne reconnaît les catégories que si les noms sont absolument identiques.

Je joins deux copies d'écran d'une "même" regex (la différence est entourée de rouge).
Dans le premier cas, seules les écritures comportant un montant "informatif" ( parfois le montant est répété dans le libellé ou est donné dans la monnaie de la transaction s'il s'agit d'opérations à l'étranger) sont traitées et de façon satisfaisante.
Dans le deuxième cas toutes les écritures sont traitées mais les montants ne sont pas exclus, donc les noms ne sont pas uniformisés.

Quelle devrait être ma regex ?
Regex_1.png
Regex_1.png (51.05 Kio) Consulté 9214 fois
Regex_2.png
Regex_2.png (60.33 Kio) Consulté 9214 fois
Détail du cas 1 où les valeurs de montant "parasites" sont bien identifiées
Regex_2_bis.png
Regex_2_bis.png (37.09 Kio) Consulté 9214 fois
ps: j'utilise pour tester l'outil disponible sur https://regex101.com/

question: iCompta utilise quoi pour les regex ? PCRE, javascript, python ?
jaladuvar

MacBook Pro (13-inch, 2018, Four Thunderbolt 3 Ports) 2,7 GHz - Intel Core i7 - 16 Go
Sonoma 14.0
Avatar de l’utilisateur
Angeman
Administrateur
Messages : 12436
Inscription : 28 décembre 2008, 21:28
Localisation : Toulouse, France
Contact :

Re: Regex extraction d'un libellé importé

Message par Angeman »

Le problème c'est que lorsque vous mettez * (qui veut dire au passage présent 0 ou n fois, donc il serait plus logique de mettre ? pour dire 0 ou 1 fois), le caractère - se retrouve matché par votre groupe précédent. Donc il faut indiquer au groupe précédent qu'on veut le matcher le minimum de fois possibles afin de laisser une chance aux 2 groupes suivants de matcher. Pour ça il faut mettre *? au lieu de juste * pour le 2ème * en partant de la fin.

C'est la théorie, je n'ai pas testé pour vérifier ;-)
jaladuvar a écrit : 26 novembre 2017, 16:02 question: iCompta utilise quoi pour les regex ? PCRE, javascript, python ?
ICU : http://userguide.icu-project.org/strings/regexp
jaladuvar
Messages : 180
Inscription : 19 février 2011, 08:35

Re: Regex extraction d'un libellé importé

Message par jaladuvar »

J'ai essayé, mais cela ne marche pas, je continue à chercher... mais suis reconnaissant d'avance à toute suggestion.
Si on rend optionnel la fin par des * ou *? on capte bien la partie libellé partout mais en totalité (y compris le montant sous la forme nnn,nn)
Si on rend cette partie "obligatoire" on isole bien le montant et l'autre partie du libellé mais seulement quand ce montant est présent.

À suivre...
jaladuvar

MacBook Pro (13-inch, 2018, Four Thunderbolt 3 Ports) 2,7 GHz - Intel Core i7 - 16 Go
Sonoma 14.0
Avatar de l’utilisateur
Angeman
Administrateur
Messages : 12436
Inscription : 28 décembre 2008, 21:28
Localisation : Toulouse, France
Contact :

Re: Regex extraction d'un libellé importé

Message par Angeman »

Au pire vous pouvez faire 2 regex différentes, une avec montant et la suivante sans montant.
jaladuvar
Messages : 180
Inscription : 19 février 2011, 08:35

Re: Regex extraction d'un libellé importé

Message par jaladuvar »

Je pense y être arrivé, mais quand je mets cette regex dans la règle, s'il y a des captures vides cela semble parfois polluer le résultat.
Elles sont remplacées par la dernière capture faite dans cette opération ?
A-t'on le moyen d'y remédier ?
Comme l'illustration est petite je mets la regex ici

Code : Tout sélectionner

([A-Z,0-9, ]*\d ){0,1}(?:(\d\d)(\d\d)\/){0,1}([a-z,A-Z,0-9, ,\-,',_,\.,\/ ,]*)(?<= )(?:(?:(\-|\+)(\d*,\d\d)){0,1}|(.*))
regexOK.png
regexOK.png (143.39 Kio) Consulté 9183 fois
mais dans iCompta
appliRegex.png
appliRegex.png (74.59 Kio) Consulté 9181 fois
jaladuvar

MacBook Pro (13-inch, 2018, Four Thunderbolt 3 Ports) 2,7 GHz - Intel Core i7 - 16 Go
Sonoma 14.0
Avatar de l’utilisateur
Angeman
Administrateur
Messages : 12436
Inscription : 28 décembre 2008, 21:28
Localisation : Toulouse, France
Contact :

Re: Regex extraction d'un libellé importé

Message par Angeman »

Pouvez-vous poster un fichier d'exemple avec juste 2 ou 3 opérations et votre règle que je regarde ça de plus près ?
jaladuvar
Messages : 180
Inscription : 19 février 2011, 08:35

Re: Regex extraction d'un libellé importé

Message par jaladuvar »

Bonjour, désolé mais cela m'a pris un peu de temps car j'étais occupé.

Voici le lien vers la regex essayée où tout est ok

https://regex101.com/r/ZXU6RK/17

Voici le lien vers le fichier de test avec les mêmes écritures.

https://www.dropbox.com/s/zkmqnxl10j27k ... t.cdb?dl=1

Au fait dommage qu'on ne puisse pas créer une variable MAregex contenant la regex et l'utiliser comme argument de "remplacer l'expression régulière" {{MAregex}}
jaladuvar

MacBook Pro (13-inch, 2018, Four Thunderbolt 3 Ports) 2,7 GHz - Intel Core i7 - 16 Go
Sonoma 14.0
Avatar de l’utilisateur
Angeman
Administrateur
Messages : 12436
Inscription : 28 décembre 2008, 21:28
Localisation : Toulouse, France
Contact :

Re: Regex extraction d'un libellé importé

Message par Angeman »

Bon alors ce qu'il manque surtout c'est ^ au début et $ à la fin de la regex pour dire que ça doit matcher le champ en entier. J'ai aussi modifié légèrement votre regex pour la simplifier mais vous êtes libre de conserver celle que vous voulez ;-)

Code : Tout sélectionner

^([A-Z,0-9, ]*\d )?(?:(\d\d)(\d\d)/)?([a-z,A-Z,0-9, ,\-,',_,\.,\/ ,\*]*?)( [\-\+]?\d+,\d\d)?$
Ce qui nous donne $1 pour le type, $4 pour le destinataire et $2/$3 pour la date.
jaladuvar
Messages : 180
Inscription : 19 février 2011, 08:35

Re: Regex extraction d'un libellé importé

Message par jaladuvar »

Merci ! Toujours un support 1ère classe ! :D

Cela marche bien et va m'être très utile, surtout pour la catégorisation "automatique".

Dans l'outil https://regex101.com/r/ZXU6RK/17 il faut que je choisisse le mode "Python" pour que cela fonctionne.
Je vais utiliser cela dans l'avenir
jaladuvar

MacBook Pro (13-inch, 2018, Four Thunderbolt 3 Ports) 2,7 GHz - Intel Core i7 - 16 Go
Sonoma 14.0
Avatar de l’utilisateur
Angeman
Administrateur
Messages : 12436
Inscription : 28 décembre 2008, 21:28
Localisation : Toulouse, France
Contact :

Re: Regex extraction d'un libellé importé

Message par Angeman »

Voilà le lien à jour : https://regex101.com/r/ZXU6RK/18
Répondre