This is a machine translation based on the English version of the article. It might or might not have already been subject to text preparation. If you find errors, please file a GitHub issue that states the paragraph that has to be improved. |
1. Introduction
Les expressions régulières — regex (ou, plus rarement, regexp) — sont utilisées dans Checkmk pour spécifier les noms des services et dans de nombreuses autres situations.
Il s’agit de modèles qui saisissent un certain texte ou qui ne saisissent pas (non-saisie).
Elles permettent de réaliser de nombreuses opérations pratiques, telles que la formulation de règles flexibles s’appliquant à tous les services dont le nom contient foo ou bar.
Les expressions régulières sont souvent confondues avec les modèles de recherche de noms de fichiers, car les caractères spéciaux * et ?, ainsi que les crochets et les accolades, peuvent apparaître dans les deux.
Dans cet article, nous vous présenterons les fonctions les plus importantes des expressions régulières, bien sûr dans le contexte de Checkmk. Étant donné que Checkmk utilise deux composants différents pour les expressions régulières, le diable se cache parfois dans les détails. En substance, le noyau de supervision utilise la bibliothèque C et tous les autres composants utilisent Python 3. Lorsque des différences existent, nous les expliquerons.
Dans Checkmk, les expressions régulières sont autorisées dans les champs de saisie de différentes pages. En cas de doute, utilisez l’aide contextuelle via le menu «Help» (Help > Show inline help). Vous pourrez y voir si les expressions régulières sont autorisées et comment les utiliser. |
Lorsque vous travaillez avec des plugins plus anciens ou provenant de sources externes, il peut arriver que ceux-ci utilisent Python 2 ou Perl et s'écartent des conventions décrites ici.
Dans cet article, nous vous présenterons les fonctionnalités les plus importantes des expressions régulières — mais en aucun cas toutes. Si les possibilités présentées ici ne vous suffisent pas, vous trouverez ci-dessous des références où vous pourrez consulter tous les détails pertinents. Et puis, il y a toujours internet.
Si vous souhaitez programmer vos propres plugins qui, par exemple, utilisent des expressions régulières pour détecter des anomalies dans des fichiers journaux, vous pouvez vous appuyer sur cet article. Toutefois, lors de la recherche dans de grands volumes de données, l’optimisation des performances est un aspect important. En cas de doute, consultez toujours la documentation de la bibliothèque d’expressions régulières utilisée.
2. Utilisation des expressions régulières
Dans cette section, nous utilisons des exemples concrets pour montrer comment utiliser les expressions régulières, depuis la saisie simple de caractères ou de chaînes uniques jusqu'aux groupes de correspondance complexes de caractères.
2.1. Caractères alphanumériques
Avec les expressions régulières, il s’agit toujours de déterminer si un motif saisit un texte donné (par exemple, le nom du service). L’exemple d’application le plus simple est une chaîne de caractères alphanumériques. Ces caractères (ainsi que le signe moins utilisé comme trait d’union) saisissent simplement eux-mêmes dans une expression.
Lors d’une recherche dans l’environnement de supervision, Checkmk ne fait généralement pas la distinction entre majuscules et minuscules.
Dans la plupart des cas, l’expression CPU load saisit aussi bien le texte CPU load que cpu LoAd. En revanche,
la recherche dans l’environnement de configuration tient généralement compte de la casse.
Des exceptions justifiées à ces règles sont possibles et sont décrites dans l’aide en ligne.
Dans les champs de saisie sans expression régulière où une correspondance exacte est spécifiée (principalement avec les noms de domaine), la distinction entre majuscules et minuscules est toujours appliquée ! |
2.2. Le point ( . ) en tant que caractère générique
Outre les chaînes de caractères « en texte brut », il existe un certain nombre de caractères et de chaînes de caractères dotés de fonctions « magiques ».
Le caractère le plus important parmi ceux-ci est le point (.).
Il saisit exactement n’importe quel caractère unique :
| Expression régulière | Correspondance | Pas de correspondance |
|---|---|---|
|
|
|
|
|
|
2.3. Répétition de caractères
On souhaite très souvent définir qu’une séquence de caractères d’une certaine longueur puisse apparaître. À cette fin, on spécifie le nombre de répétitions du caractère précédent entre accolades :
| Expression régulière | Fonction | Correspondance | Pas de correspondance |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Il existe des abréviations pour les trois dernières conditions ci-dessus : «
*» saisit le caractère précédent un nombre indéfini de fois, « + » saisit au moins une occurrence et « ? » saisit au plus une occurrence.
Vous pouvez également utiliser l'.e du point avec les opérateurs de répétition pour rechercher une séquence de caractères arbitraires de manière plus précise :
| Expression régulière | Correspondance | Pas de correspondance |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.4. Classes de caractères, chiffres et lettres
Les classes de caractères permettent de saisir certaines sections du jeu de caractères, par exemple « il doit y avoir un chiffre ici ». Pour ce faire, placez tous les caractères à saisir entre crochets. À l'aide d'un signe moins, vous pouvez également spécifier des plages. Remarque : la séquence du jeu de caractères ASCII 7 bits s'applique.
Par exemple, [abc] représente exactement l’un des caractères a, b ou c, et [0-9] représente n’importe quel chiffre — les deux peuvent être combinés.
Une négation de l’ensemble est également possible — avec un signe « - » entre parenthèses, [^abc] représente alors n’importe quel caractère sauf a, b, c.
Les classes de caractères peuvent bien sûr être combinées avec d’autres opérateurs. Commençons par quelques exemples abstraits :
| Classe de caractères | Fonction |
|---|---|
|
Exactement l’un des caractères a, b, c. |
|
Exactement un chiffre, une lettre minuscule ou un trait de soulignement. |
|
Tout caractère autre que a, b, c. |
|
Exactement un caractère, allant d'un espace à un tiret, conforme à la norme ASCII. Les caractères suivants font partie de cette plage : |
|
Une séquence d'au moins un et d'au plus 20 lettres et/ou chiffres, dans n'importe quel ordre. |
Voici quelques exemples concrets :
| Expression régulière | Correspondance | Pas de correspondance |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Si vous avez besoin de l'un des caractères |
2.5. Début et fin — préfixe, suffixe et infixe
Dans de nombreux cas, il est nécessaire de distinguer les correspondances au début, à la fin ou simplement quelque part au sein d’une chaîne.
Pour une correspondance au début d’une chaîne (correspondance de préfixe), utilisez l’^ (accent circonflexe) ; pour la fin (correspondance de suffixe), utilisez l’$ (signe dollar).
Si aucun de ces opérateurs n’est spécifié, la plupart des bibliothèques d’expressions régulières utilisent la correspondance d’infixe par défaut — la recherche s’effectue n’importe où dans la chaîne de caractères.
Pour des correspondances exactes, utilisez à la fois ^ et $.
| Expression régulière | Correspondance | Pas de correspondance |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Dans la supervision et l'Event Console, la correspondance d'infixe est la norme. Dans la supervision, la correspondance d'infixe est la norme. Les expressions apparaissant n'importe où dans le texte sont trouvées ; par exemple, la recherche de « memory » trouve également « kernel memory ». Dans l'interface graphique de configuration, en revanche, lors de la comparaison d'expressions régulières avec les noms des services et d'autres éléments, Checkmk vérifie essentiellement si l'expression correspond au début du texte (correspondance de préfixe) — c'est généralement ce que vous recherchez :

Si vous avez besoin d’une correspondance d’infixe là où la correspondance de préfixe est proposée, il vous suffit d’étendre votre expression régulière en ajoutant «.*» au début pour qu’elle saisisse n’importe quelle chaîne préfixée :
| Expression régulière | Correspondance | Pas de correspondance |
|---|---|---|
|
|
|
|
|
|
|
|
|
Astuce : vous pouvez faire précéder toute recherche au début d’une chaîne par ^ et toute recherche au sein d’une chaîne par .*,
les interpréteurs d’expressions régulières ignoreront les symboles redondants.
2.6. Masquage des caractères spéciaux à l'aide d'une barre oblique inversée
Étant donné que le point correspond à tout, il correspond naturellement aussi à un point.
Si vous souhaitez désormais faire correspondre exactement un point, vous devez le masquer avec un \ (barre oblique inversée).
Cela s'applique de manière analogue à tous les autres caractères spéciaux.
Il s'agit de : \ . * + ? { } ( ) [ ] | & ^ et $.
Le codage d'une barre oblique inversée \ a pour effet que le caractère spécial qui la suit est traité comme un caractère normal :
| Expression régulière | Correspondance | Pas de correspondance |
|---|---|---|
|
|
|
|
|
|
|
|
|
Attention Python : Étant donné qu'en Python, la barre oblique inversée dans la représentation interne de la chaîne est masquée en interne par une autre barre oblique inversée, ces deux barres obliques inversées doivent être masquées à nouveau, ce qui conduit à un total de quatre barres obliques inversées :
| Expression régulière | Correspondance | Pas de correspondance |
|---|---|---|
|
|
|
2.7. Valeurs alternatives
Avec la barre verticale |, vous pouvez définir des alternatives, c'est-à-dire utiliser un opérateur OU :
1|2|3saisit 1, 2 ou 3.
Si vous avez besoin de telles alternatives au milieu d'une expression, regroupez-les entre parenthèses :
| Expression régulière | Correspondance | Pas de correspondance |
|---|---|---|
|
|
|
|
|
|
2.8. Groupes de correspondance
Les groupes de correspondance (ou groupes de capture) remplissent deux fonctions :
La première fonction consiste à regrouper des alternatives ou des correspondances partielles, comme le montre l'exemple précédent.
Des regroupements imbriqués sont également possibles.
De plus, les opérateurs de répétition *, +, ? et {…} peuvent être utilisés précédés de parenthèses.
Ainsi, l'expression (/local)?/share correspond à la fois à /local/share et à /share.
La deuxième fonction consiste à « capturer » les groupes de correspondance de caractères dans des variables.
Dans l’
Event Console (EC),
l’informatique décisionnelle (BI), lors du renommage en masse d’ordinateurs hôtes
et dans les affectations de ferroutage, il est possible d’utiliser la partie de texte
correspondant à l’expression régulière dans la première parenthèse comme \1 ,
la partie correspondant à la deuxième parenthèse comme \2 , et ainsi de suite.
Le dernier exemple du tableau illustre l'utilisation d'alternatives au sein d'un groupe de correspondance.
| Expression régulière | Texte à saisir | Groupe 1 | Groupe 2 |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
L'image suivante illustre un tel renommage de plusieurs ordinateurs hôtes en une seule opération.
Tous les noms de domaine correspondant à l'expression régulière server-(.*)\.local seront remplacés par \1.servers.local.
Où l'\1e correspond exactement au texte « capturé » par l'.*e entre parenthèses :

Dans l'exemple concret, server-lnx02.local est donc converti en lnx02.servers.local.
Si un groupe de correspondance n'est pas censé « capturer » des groupes de caractères, par exemple s'il est uniquement utilisé à des fins de structuration, ?: peut être utilisé pour le convertir en un groupe de correspondance sans capture (non-capturing match group) : (?:/local)?/share.
2.9. Indicateurs en ligne
Les indicateurs en ligne permettent de définir des paramètres spécifiques concernant le mode d’évaluation au sein d’une expression régulière.
Le plus pertinent pour l’utilisation de Checkmk est (?i), qui active la correspondance insensible à la casse pour les expressions qui, autrement, seraient sensibles à la casse.
Dans de très rares cas, vous souhaiterez également utiliser (?s) et (?m) pour travailler avec des chaînes multilignes.
Notez que depuis la version 3.11, Python attend des indicateurs en ligne soit au début d'une expression régulière — (?i)somestring — soit en spécifiant la portée — (?i:somestring).
Étant donné que Checkmk combine dans certains cas les expressions régulières en interne pour améliorer les performances, nous vous recommandons vivement de ne pas utiliser d'indicateurs en ligne au début d'une expression régulière.
Utilisez plutôt toujours la notation avec la portée — qui, en cas de doute, s'étend à l'ensemble de l'expression régulière :
(?i:somestring).
Il s'agit d'une variante du groupe de correspondance sans capture.
3. Tableau des caractères spéciaux
Vous trouverez ici une liste récapitulative de tous les caractères spéciaux et fonctions d'expressions régulières utilisés par Checkmk, comme expliqué ci-dessus :
|
saisit n'importe quel caractère. |
|
Considère le caractère spécial suivant comme un caractère normal. |
|
Le caractère précédent doit apparaître exactement cinq fois. |
|
Le caractère précédent doit apparaître au moins cinq fois et au plus dix fois. |
|
Le caractère précédent peut apparaître un nombre quelconque de fois (correspond à |
|
Le caractère précédent peut apparaître un nombre quelconque de fois, mais doit apparaître au moins une fois (équivalent à |
|
Le caractère précédent peut apparaître zéro ou une fois (équivalent à |
|
Représente exactement l'un des caractères |
|
Représente exactement l'un des caractères |
|
Représente exactement un chiffre, une lettre minuscule ou le trait de soulignement. |
|
Représente exactement un caractère, à l'exception des guillemets simples ou doubles. |
|
Saisit la fin d'un texte. |
|
Saisit le début d'un texte. |
|
Saisit |
|
Fait correspondre la sous-expression A à un groupe de correspondance. |
|
Modifie le mode d'évaluation de la sous-expression A pour qu'elle ne tienne pas compte de la casse, via l'indicateur inline. |
|
Saisit un caractère de tabulation. Ce caractère apparaît souvent dans les fichiers journaux ou les tableaux CSV. |
|
Saisit tous les espaces (l'ASCII utilise 5 types d'espaces différents). |
Les caractères suivants doivent être masqués par une barre oblique inversée,
s'ils doivent être utilisés littéralement : \ . * + ? { } ( ) [ ] | & ^ $.
3.1. Unicode in Python 3
En particulier, si des noms propres dans des commentaires ou des textes descriptifs ont été copiés-collés, et que par conséquent des caractères Unicode ou différents types d’espaces apparaissent dans le texte, les classes étendues de Python sont très utiles :
|
Saisit une tabulation (tabulateur), notamment dans les fichiers journaux ou les tableaux CSV. |
|
Saisit tous les espaces (Unicode prend en charge 25 espaces différents, ASCII 5). |
|
Inverse la recherche de |
|
Saisit tous les caractères qui font partie d'un mot, c'est-à-dire les lettres, et en Unicode également les accents, les glyphes chinois, arabes ou coréens. |
|
Inversion de « |
Dans les cas où Checkmk autorise la saisie Unicode, l'\w est particulièrement utile pour rechercher des mots s'écrivant de manière similaire dans différentes langues, par exemple des noms propres qui s'écrivent parfois avec et parfois sans accent.
| Expression régulière | Correspondance | Pas de correspondance |
|---|---|---|
|
|
|
4. Tester les expressions régulières
La logique des expressions régulières n'est pas toujours facile à comprendre, notamment dans le cas de groupes de correspondance imbriqués, ainsi que pour la question de l'ordre et de l'extrémité de la chaîne à faire correspondre. Plutôt que de procéder par essais et erreurs dans Checkmk, il existe deux façons de tester les expressions régulières : Des services en ligne tels que regex101.com présentent les correspondances sous forme graphique et expliquent l'ordre d'évaluation en temps réel :

La deuxième méthode de test est l'invite Python, fournie avec chaque installation de Python. Sous Linux et Mac OS, Python 3 est généralement préinstallé. C'est précisément parce que les expressions régulières à l'invite Python sont évaluées exactement comme dans Checkmk qu'il n'y a pas de divergences d'interprétation, même en cas d'imbrication complexe. Avec le test dans l'interpréteur Python, vous jouez toujours la carte de la sécurité.
Après l'ouverture, vous devez importer le module re.
Dans l'exemple, nous désactivons la distinction entre majuscules et minuscules avec re.IGNORECASE :
Pour émuler le comportement des expressions régulières de C, qui sont également utilisées dans de nombreux composants Python, vous pouvez vous limiter à l'ASCII :
>>> re.ASCII
re.ASCIIVous pouvez désormais utiliser la fonction re.match() pour faire correspondre directement une expression régulière à une chaîne et afficher le groupe de correspondance :
group(0)désigne la correspondance complète, et group(1) la première correspondance qui correspond à la sous-expression entre parenthèses :
>>> x = re.match('M[ae]{1}[iy]{1}e?r', 'Meier')
>>> x.group(0)
'Meier'
>>> x = re.match('M[ae]{1}[iy]{1}e?r', 'Mayr')
>>> x.group(0)
'Mayr'
>>> x = re.match('M[ae]{1}[iy]{1}e?r', 'Myers')
>>> x.group(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: no such group
>>> x = re.match('server-(.*)\.local', 'server-lnx23.local')
>>> x.group(0)
'server-lnx23.local'
>>> x.group(1)
'lnx23'5. Documentation externe complémentaire
Ken Thompson, l’un des créateurs d’Unix dans les années 1960, a été le premier à développer les expressions régulières sous leur forme actuelle, notamment dans l’instruction Unix «grep», qui est toujours utilisée aujourd’hui.
Depuis lors, de nombreuses extensions et variantes des expressions régulières ont vu le jour, notamment les expressions régulières étendues, les expressions régulières compatibles avec Perl, ainsi qu’une variante très similaire en Python.
Dans les filtres des vues de la table, Checkmk utilise les expressions régulières étendues POSIX (extended REs).
Celles-ci sont évaluées dans le noyau de supervision en C à l’aide de la fonction regex de la bibliothèque C.
Vous trouverez une référence complète à ce sujet dans la page de manuel Linux de la commande regex(7) :
Partout ailleurs, toutes les fonctions des expressions régulières de Python sont disponibles. Cela inclut, entre autres, les règles de configuration , les règles de configuration de l'Event Console (EC) et l'informatique décisionnelle (BI) .
Les expressions régulières en Python constituent une extension des expressions régulières étendues et sont très similaires à celles de Perl.
Elles prennent en charge, par exemple, ce qu’on appelle le « negative lookahead », un astérisque non glouton dans les expressions régulières, ou encore la distinction entre majuscules et minuscules.
Vous trouverez des détails sur les capacités de ces expressions régulières dans l’aide en ligne Python du module `re`, ou de manière plus approfondie dans la documentation en ligne de Python :
Vous trouverez une explication très détaillée des expressions régulières dans un article de Wikipédia.
