Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
cold:tutoriaux:regex [2015/11/04 09:32] florian créée |
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. | + | {{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 capturantes ====== | + | ====== Capture ====== |
+ | 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 |