GREP – Lookbehind & Lookahead

Beaucoup de personnes ont des difficultés avec la notion de Lookbehind & Lookahead. Voici ici une autre approche avec quelques exemples.

Lookbehind et Lookahead permettent de sélectionner un motif uniquement s’il est suivi (ou précédé) par un autre motif spécifique (un motif est un caractère, une chaine de caractères ou encore un groupe de mots).

Dans la phrase suivante, je voudrais sélectionner le mot “gris” uniquement s’il est précédé du mot “chat” :

Le chat gris joue avec le chat blanc. Le cheval blanc court derrière le cheval gris.

Pour ce faire, nous allons regarder ce qui précède le mot “gris”. Si c’est le mot “chat”, alors je sélectionne, si c’est autre chose que le mot “chat”, je ne sélectionne pas.

Lookbehind / Lookahead – où dois-je regarder ?

Ceci est un peu contrintuitif : behind en anglais signifie derrière, tandis que ahead signifie devant.

Lookbehind = qu’est-ce qui se trouve juste derrière moi ? (regarder ce qui suit, dans le sens de la lecture).
Lookahead = qu’est-ce qui se trouve juste devant moi ? (regarde ce qui précède, dans le sens de la lecture).

Positif / Négatif – est-ce qu’il y a quelque chose qui correspond ?

Il y a la notion de positif (j’ai trouvé le motif) et de négatif (je n’ai pas trouvé le motif). 

Positif = Oui, le motif est présent.
Négatif = Non, le motif n’est pas présent.

Quelques exemples

Lookbehind positif (?<=)

(?<=chat) gris ne sélectionne le mot “gris” uniquement s’il est précédé par le mot “chat”.

Le chat gris joue avec le chat blanc. Le cheval blanc court derrière le cheval gris.

Lookbehind négatif (?<!)

(?<!chat) gris ne sélectionne le mot “gris” uniquement s’il n’est pas précédé du mot “chat”.

Le chat gris joue avec le chat blanc. Le cheval blanc court derrière le cheval gris.

Lookahead positif (?=)

chat (?=gris) sélectionne le mot “chat” uniquement s’il est suivi du mot “gris”.

Le chat gris joue avec le chat blanc. Le cheval blanc court derrière le cheval gris

Lookahead négatif (?!)

chat (?!gris) ne sélectionne le mot “chat” uniquement s’il n’est pas suivi par le mot “gris”.

Le chat gris joue avec le chat blanc. Le cheval blanc court derrière le cheval gris.

Petit truc

On reconnait les Lookaround grâce au point d’interrogation se trouvant derrière une parenthèse ouvrante.

(?<=)
(?<!)
(?=)
(?!)

Lorsque le point d’interrogation est suivi d’un signe plus petit que (<), il s’agit d’un Lookbehind.
Lorsque le point d’interrogation est suivi d’un signe égal (=) ou d’un point d’exclamation (!), il s’agit d’un Lookahead.

Le signe égal (=) signifie une correspondance positive, tandis que le point d’exclamation (!) est utilisé quand le caractère suivant (ou précédent) ne doit pas être présent.

Tableau récapitulatif

Exemples concrets

Mettre en forme le numéro des chapitres

Vous travaillez dans un document séparé en différents chapitres. Vous voulez trouver tous les chiffres qui suivent le mot “Chapitre” pour les mettre en couleur par exemple. Il faut alors utiliser un Lookbehind positif (?<=)

(?<=Chapitre\h)\d+

Chapitre 12

Explication : je cherche tous les chiffres uniquement s’ils sont précédés du mot Chapitre. Le métacaractère \h sélectionne toutes les espaces horizontales (y compris la tabulation).

Mettre en forme le début d’un paragraphe jusqu’à…

Vous désirez mettre en forme tous les mots depuis le début de paragraphe jusqu’aux deux points :

^.+?(?=\h:)

Composition : Chaque comprimé contient[…].

Indications : Ce médicament est […].

La posologie quotidienne : La dose de […].

Note: ceci peut être réalisé également avec les styles imbriqués (voir l’article consacré aux styles imbriqués).

L’Ancien Testament (ou le Nouveau)?

Dans le texte qui suit, je voudrais sélectionner le mot Testament uniquement s’il n’est pas précédé par le mot Ancien.

(?<!Ancien\h)Testament

L’expression « Ancien Testament » est donc tout à fait légitime […] certains ont voulu substituer l’expression traditionnelle « Ancien Testament » par […] que vient l’expression « Premier Testament ». […] chacun peut utiliser les expressions qu’il préfère, mais chacun doit être conscient de ce qu’il dit. « Ancien Testament » et « Nouveau Testament » peuvent se […].

Mise en garde

1- On ne peut pas utiliser de quantificateurs dans un lookbehind

En effet, lookbehind n’acceptent pas les répétitions, comme (années?)pour rechercher année ou années ou (\d+) pour rechercher un ou plusieurs chiffres. Ils n’acceptent pas non plus le caractère d’alternative | comme (année|années). En revanche, si les motifs ont la même longueur, ça fonctionne : (le|la|ce) ou (les|des|ces).

2- Ne pas faire trop vite un “Tout remplacer”

Il peut-être “dangereux” d’utiliser des correspondances négatives.
Par exemple (?<!Madame\h)Petit trouve Mademoiselle Petit, Monsieur Petit mais ne trouve pas Madame Petit. Mais cette requête trouve également Olivier Petit, ainsi que “Petit” au début de cette phrase :

Petit à petit, l’oiseau fait son nid.

Rien à voir ici avec Monsieur, Madame ou Mademoiselle Petit.

Lookbehind positif \K

Il y a encore un métacaractère particulier et non documenté : \K. Il s’utilise grosso modo de la manière suivante : tous les motifs avant \K sont pris en compte. La grand force de \K par rapport au lookbehind, c’est qu’il accepte les quantificateurs.

Par exemple, vous avez plusieurs textes qui légendes vos tableaux et figures dans votre document. Ils sont écrits comme ceci :

Tableau 9 : Liste des […]
Figure 12 : Charge moyenne […].

Et vous désirez insérer une espace spéciale entre le chiffre et le deux-points.

(Figure|Tableau)\h\d+\K\h(?=:)

Cette requête sélectionne l’espace quelconque qui se trouve juste avant les deux-points. En décomposant le requête, cela donne ceci : je sélectionne l’espace quelconque \h qui se trouve avant le mot Figure ou le mot Tableau (Figure|Tableau), suivi d’une espace quelconque \h suivis d’un ou plusieurs chiffres \d+ suivi d’une espace quelconque \h suivie d’un deux-points (ouf!).

N’oublions pas que le \K agit comme un lookbehind positif, et qu’il ne sélectionne l’espace que s’il trouve ce qui est avant lui…
Dans notre cas : (Figure|Tableau)\h\d+.

Conclusion

J’espère que ces explications vous aideront dans votre travail. Cela demande un peu de gymnastique au début, mais permet d’accélérer considérablement le processus de mise en page.

Merci à Serge et Stéphane pour leurs conseils… Et un merci particulier à Laurent Tournier qui m’a donné quelques conseils. Il a écrit un document sur le sujet : GREP et InDesign – Rechercher, remplacer et formater en un clic. Rendez-vous sur le site de l’auteur pour l’acheter (10 €, vite rentabilisé).

N’hésitez pas à me laisser un commentaire ci-dessous…


Laisser un commentaire