Outils pour utilisateurs

Outils du site


cold:tutoriaux:regex

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
cold:tutoriaux:regex [2015/11/04 10:22]
florian
cold:tutoriaux:regex [2023/03/17 09:56] (Version actuelle)
Ligne 1: Ligne 1:
 ====== Préambule ====== ====== Préambule ======
  
-{{wiki:​icons:​info.png}} Les expressions ici utilisent la syntaxe reconnue par python qui suit le standard POSIX (à quelques exceptions près)((Article wikipedia sur les expression rationnelles https://​fr.wikipedia.org/​wiki/​Expression_rationnelle#​Python)).+{{wiki:​icons:​info.png}} Les expressions ici utilisent la syntaxe reconnue par python qui suit le standard POSIX \\ 
 +(à quelques exceptions près ((Article wikipedia sur les expression rationnelles https://​fr.wikipedia.org/​wiki/​Expression_rationnelle#​Python))).
  
-====== ​Parenthèses de groupement ​======+====== ​Capture ​======
  
-Les parenthèses ( ) de groupement ​+Les parenthèses ​**( )** de groupement ​permettent de délimiter un ensemble d'​alternatives et d'​opérer des captures. 
 +Le plus souvent si nous réalisons une capture nous voudrons pouvoir y faire référence via un nom que nous aurons choisi. 
 + 
 +En python la syntaxe qui permet cela est la suivante 
 +  (?​P<​nom_du_groupe_de_capture>​...) 
 + 
 +La sous-expression rationnelle(ici symbolisée par ...  ) qui aura été trouvée sera accessible par le nom **//​nom_du_groupe_de_capture//​** 
 + 
 +Dès lors nous pouvons y faire référence dans la suite de l'​expression rationnelle elle-même : 
 +  (?​P=nom_du_groupe_de_capture) 
 + 
 +Mais dans le cas de EzGED nous y ferons le plus souvent référence lors d'un post formatage grâce à la syntaxe [[cold:​reference:​groupname|@<​groupname>​]].\\ 
 + 
 +Tout de suite un petit exemple.  
 + 
 +===== Numéro de facture ===== 
 +Soit le texte extrait suivant 
 +<​file>​ 
 +RueDuCommerce SA                                                  
 +Facture 44-50, avenue du Capitaine Glarner 
 +93585 Saint-Ouen Cedex  
 +                                                                          EzDEV 
 +                                                                          2 Rue Adolphe Pégoud 
 +                                                                          90130 PETIT-CROIX 
 +         
 +        Numéro de facture : 56497        Référence client : 100132 
 +        Date de la facture : 04/​11/​2015 
 +</​file>​ 
 + 
 +Cet exemple illustre bien l'un des cas que vous retrouvez le plus souvent.  
 +Il s'agit de récupérer un numéro (ici de facture). 
 + 
 +Nous pourrions être tentés de faire une recherche avec le filtre de champ 
 +  Numero de facture : .* 
 + 
 +puis un post formatage 
 +  @keepdigits(@self) 
 +   
 +Mais dans notre exemple ci-dessus si la longueur du champ ou les paramétrage de positionnement sont trop laxistes nous avons le risque de récupérer aussi la référence client. 
 + 
 +Nous pouvons procéder autrement en capturant explicitement le premier numéro de la ligne: 
 +  Numero de facture : (?​P<​numero>​\d+)\D* 
 + 
 +Le premier numéro est la première suite de chiffres non interrompue. Elle prend fin dès lors que l'on rencontre autre chose qu'un chiffre (comme un espace ou une lettre). 
 + 
 +{{wiki:​icons:​info.png}} \D est équivalent à la séquence [^0-9]. Elle identifie tout caractère sauf un chiffre. 
 +   
 +===== Recherche multi-ligne ===== 
 + 
 +Prenons cet exemple de texte extrait  
 + 
 +{{:​cold:​tutoriaux:​capture_multiligne.png|}} 
 + 
 +Si l'on souhaite récupérer le numéro de facture on pourrait le faire assez simplement en utilisant la macro @relativeto. 
 +Ce serait une bonne solution mais il existe une alternative qui ne nous obligera pas à créer deux champs d'​analyse. 
 + 
 +Comme le montre la capture nous utilisons un champ de type variable et nous ciblons à l'aide des paramètres de position la zone de recherche. La zone de recherche est encadrée en rouge (l'​image est tronquée, elle s'​étend jusqu'​au bas du document). 
 + 
 +Et l'​expression rationnelle que nous utilisons est la suivante : 
 +  Facture N.([^\d]|\n)*(?​P<​num>​\d+) 
 + 
 +Décomposons l'​expression. 
 + 
 +^ Expression ^ Signification ^ 
 +| Facture N. | Ce que l'on recherche commence par cette chaîne. Le point remplace le signe ° qui n'est pas bien géré. | 
 +| %%([^\d]|\n)*%% | Ce qui suit doit être un caractère (excluant les chiffres) ou un retour à la ligne. Ce motif peut se répéter 0 ou plusieurs fois | 
 +| (?​P<​num>​\d+) | On doit trouver au moins un chiffre. Cette suite de chiffre est capturée dans la variable num | 
 + 
 + 
 +**En résumé :** Nous cherchons une chaîne qui **commence par** //​**"​Facture N"​**//,​ qui est suivit **éventuellement** (mais pas nécessairement) par **tout type de caractère sauf les chiffres** mais en **incluant les sauts de ligne** et cet enchaînement est suivi par **au moins un chiffre**. 
 + 
 +L'​exemple dans la capture ci-dessus nous renvoi comme valeur 
 +  681476
cold/tutoriaux/regex.1446632541.txt.gz · Dernière modification: 2023/03/17 09:56 (modification externe)