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. Introducción
Las expresiones regulares —regex (o, en raras ocasiones, regexp)— se usan en Checkmk para especificar nombres de servicios y en muchas otras situaciones.
Son patrones que producen coincidencias con un texto determinado o que no producen coincidencias (no producen coincidencias).
Puedes hacer muchas cosas prácticas con ellas, como formular reglas flexibles que se apliquen a todos los servicios que tengan foo o bar en su nombre.
Las expresiones regulares se confunden a menudo con los patrones de búsqueda de nombres de archivo, ya que los caracteres especiales * y ?, así como los corchetes y las llaves, pueden aparecer en ambos.
En este artículo te mostraremos las funciones más importantes de las expresiones regulares, por supuesto en el contexto de Checkmk. Dado que Checkmk utiliza dos componentes diferentes para las expresiones regulares, a veces el diablo está en los detalles. Básicamente, el core de monitorización utiliza la biblioteca C y todos los demás componentes utilizan Python 3. Cuando haya diferencias, te las explicaremos.
En Checkmk, las expresiones regulares están permitidas en los campos de entrada de varias páginas. Si no estás seguro, utiliza la ayuda contextualizada a través del menú «Help» (Help > Show inline help). Allí podrás ver si se permiten las expresiones regulares y cómo se pueden utilizar. |
Al trabajar con Plugins antiguos o de fuentes externas, puede ocurrir que estos utilicen Python 2 o Perl y se desvíen de las convenciones descritas aquí.
En este artículo te mostraremos las capacidades más importantes de las expresiones regulares, pero de ninguna manera todas ellas. Si las posibilidades que se muestran aquí no son suficientes, a continuación encontrarás referencias donde podrás leer todos los detalles relevantes. Y luego siempre está internet.
Si quieres programar tus propios Plugins que, por ejemplo, utilicen expresiones regulares para encontrar anomalías en archivos de registro, puedes usar este artículo como base. Sin embargo, al buscar en grandes volúmenes de datos, la optimización del rendimiento es un aspecto importante. En caso de duda, consulta siempre la documentación de la biblioteca de expresiones regulares que estés utilizando.
2. Trabajar con expresiones regulares
En esta sección usamos ejemplos concretos para mostrar cómo trabajar con expresiones regulares, desde simples coincidencias de caracteres o cadenas individuales hasta grupos complejos de caracteres.
2.1. Caracteres alfanuméricos
Con las expresiones regulares, siempre se trata de ver si un patrón coincide con un texto determinado (por ejemplo, el nombre del servicio). El ejemplo de aplicación más sencillo es una cadena de caracteres alfanuméricos. Estos (y el signo menos usado como guión) simplemente producen una coincidencia consigo mismos en una expresión.
Al buscar en el entorno de monitorización, Checkmk no suele distinguir entre mayúsculas y minúsculas.
En la mayoría de los casos, la expresión CPU load tiene una coincidencia con el texto CPU load y con cpu LoAd. Por otro lado,
las búsquedas en el entorno de configuración suelen distinguir entre mayúsculas y minúsculas.
Es posible que haya excepciones justificadas a estas normas, que se describen en la ayuda en línea.
En los campos de entrada sin expresiones regulares en los que se especifica una concordancia exacta (sobre todo con nombres del host), ¡siempre se distingue entre mayúsculas y minúsculas! |
2.2. El punto ( . ) como comodín
Además de las cadenas de caracteres de «texto sin formato», hay una serie de caracteres y cadenas de caracteres que tienen funciones «mágicas».
El carácter más importante de este tipo es el punto (.).
Realiza una coincidencia exacta con cualquier carácter arbitrario:
| Expresión regular | Coincidencia | Sin coincidencia |
|---|---|---|
|
|
|
|
|
|
2.3. Repetición de caracteres
A menudo te interesa definir que pueda aparecer una secuencia de caracteres de una longitud determinada. Para ello, se especifica el número de repeticiones del carácter anterior entre llaves:
| Expresión regular | Función | Coincidencia | No hay coincidencia |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Hay abreviaturas para las tres últimas condiciones anteriores: «
*» produce una coincidencia con el carácter anterior cualquier número de veces, «+» produce una coincidencia con al menos una aparición y «?» produce una coincidencia con como mucho una aparición.
También puedes usar el punto . con los operadores de repetición para buscar una secuencia de caracteres arbitrarios de una forma más definida:
| Expresión regular | Coincidencia | Sin coincidencia |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.4. Clases de caracteres, números y letras
Las clases de caracteres permiten que se realicen coincidencias en ciertas secciones del conjunto de caracteres, por ejemplo, «aquí debe ir un dígito». Para ello, coloca todos los caracteres que se deben coincidir entre corchetes. Con un signo menos también puedes especificar rangos. Nota: Se aplica la secuencia del conjunto de caracteres ASCII de 7 bits.
Por ejemplo, [abc] representa exactamente uno de los caracteres a, b o c, y [0-9] representa cualquier dígito; ambos se pueden combinar.
También es posible la negación del conjunto: con un ^ entre paréntesis, [^abc] representa entonces cualquier carácter excepto a, b, c.
Por supuesto, las clases de caracteres se pueden combinar con otros operadores. Empecemos con algunos ejemplos abstractos:
| Clase de caracteres | Función |
|---|---|
|
Exactamente uno de los caracteres a, b, c. |
|
Exactamente un dígito, una letra minúscula o un guión bajo. |
|
Cualquier carácter excepto a, b, c. |
|
Exactamente un carácter, desde un espacio en blanco hasta un guión, conforme al estándar ASCII. Los siguientes caracteres están dentro de este rango: |
|
Una secuencia de al menos una y como máximo 20 letras y/o dígitos en cualquier orden. |
Aquí tienes algunos ejemplos prácticos:
| Expresión regular | Coincidencia | Sin coincidencia |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Si necesitas uno de los caracteres |
2.5. Principio y fin: prefijo, sufijo e infijo
En muchos casos es necesario distinguir entre coincidencias al principio, al final o simplemente en algún punto dentro de una cadena.
Para una concordancia al principio de una cadena (concordancia de prefijo), usa el ^ (circunflejo); para el final (concordancia de sufijo), usa el $ (signo de dólar).
Si no se especifica ninguno de estos operadores, la mayoría de las bibliotecas de expresiones regulares usan la concordancia infix como valor predeterminado: se busca en cualquier parte de la cadena de caracteres.
Para concordancias exactas, usa tanto ^ como $.
| Expresión regular | Coincidencia | Sin coincidencia |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
En la monitorización y en la Consola de eventos, la concordancia infix es el estándar. En la monitorización, la concordancia infix es el estándar. Se encuentran las expresiones que aparecen en cualquier parte del texto, es decir, la búsqueda de «memory» también encuentra «kernel memory». En la GUI de configuración, por otro lado, al comparar expresiones regulares con nombres de servicios y otras cosas, Checkmk básicamente comprueba si la expresión coincide con el principio del texto (concordancia de prefijo); esto es normalmente lo que buscas:

Si necesitas una concordancia infix en lugares donde se ofrece la concordancia de prefijo, simplemente amplía tu expresión regular con .* al principio para que coincida con cualquier cadena prefijada:
| Expresión regular | Coincidencia | Sin coincidencia |
|---|---|---|
|
|
|
|
|
|
|
|
|
Consejo: Puedes anteponer «^» al inicio de una cadena y «.*» dentro de una cadena,
los intérpretes de expresiones regulares ignorarán los símbolos redundantes.
2.6. Enmascarar caracteres especiales con una barra invertida
Dado que el punto coincide con todo, naturalmente también coincide con un punto.
Si ahora quieres que coincida exactamente con un punto, tienes que enmascararlo con una barra invertida (\).
Esto se aplica de forma análoga a todos los demás caracteres especiales.
Estos son: \ . * + ? { } ( ) [ ] | & ^ y $.
Al escribir una barra invertida \, el carácter especial que le sigue se trata como un carácter normal:
| Expresión regular | Coincidencia | Sin coincidencia |
|---|---|---|
|
|
|
|
|
|
|
|
|
Atención, Python: dado que en Python la barra invertida en la representación interna de la cadena se enmascara internamente con otra barra invertida, estas dos barras invertidas deben enmascararse de nuevo, lo que da un total de cuatro barras invertidas:
| Expresión regular | Coincidencia | No hay coincidencia |
|---|---|---|
|
|
|
2.7. Valores alternativos
Con la barra vertical | puedes definir alternativas, es decir, usar una operación OR:
1|2|3coincide con 1, 2 o 3.
Si necesitas esas alternativas en medio de una expresión, agrúpalas entre paréntesis:
| Expresión regular | Coincidencia | No hay coincidencia |
|---|---|---|
|
|
|
|
|
|
2.8. Grupos de concordancia
Los grupos de concordancia (o grupos de captura) cumplen dos funciones:
La primera función es agrupar alternativas o coincidencias parciales, como se muestra en el ejemplo anterior.
También es posible anidar grupos.
Además, se pueden usar los operadores de repetición *, +, ? y {…} precedidos de paréntesis.
Así, la expresión (/local)?/share coincide tanto con /local/share como con /share.
La segunda función es «capturar» los grupos de concordancia en variables.
En la
Consola de eventos (EC), en
Business Intelligence (BI), en el renombramiento masivo de hosts
y en los mapeos piggyback, existe la posibilidad de utilizar la parte de texto
correspondiente a la expresión regular del primer paréntesis como \1 ,
la parte correspondiente al segundo paréntesis como \2 , y así sucesivamente.
El último ejemplo de la tabla muestra el uso de alternativas dentro de un grupo de concordancia.
| Expresión regular | Texto de coincidencia | Grupo 1 | Grupo 2 |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
La siguiente imagen muestra cómo renombrar varios hosts de una sola vez.
Todos los nombres del host que tengan una coincidencia con la expresión regular server-(.*)\.local se sustituirán por \1.servers.local.
Donde \1 representa exactamente el texto «capturado» por .* entre paréntesis:

En el ejemplo concreto, server-lnx02.local se convierte así en lnx02.servers.local.
Si no es necesario que un grupo de concordancia «capture» grupos de caracteres, por ejemplo, si solo se utiliza para estructurar, se puede usar ?: para convertirlo en un grupo de concordancia sin captura (grupo de concordancia sin captura): (?:/local)?/share.
2.9. Indicadores en línea
Con los indicadores en línea, se pueden establecer configuraciones específicas relativas al modo de evaluación dentro de una expresión regular.
El más relevante para trabajar con Checkmk es (?i), que switcha a la coincidencia sin distinción de mayúsculas y minúsculas para expresiones que, de otro modo, serían sensibles a las mayúsculas y minúsculas.
En casos muy raros, también querrás usar (?s) y (?m) para trabajar con cadenas de varias líneas.
Ten en cuenta que, desde la versión 3.11, Python espera que los indicadores en línea se coloquen al principio de una expresión regular —(?i)somestring— o que especifiquen el ámbito —(?i:somestring).
Dado que Checkmk, en algunos casos, combina expresiones regulares internamente para mejorar el rendimiento, te recomendamos encarecidamente que no uses indicadores en línea al principio de una expresión regular.
En su lugar, usa siempre la notación con ámbito —que, en caso de duda, se extiende a toda la expresión regular:
(?i:somestring).
Esta es una variante del grupo de concordancia sin captura.
3. Tabla de caracteres especiales
Aquí encontrarás una lista que resume todos los caracteres especiales y las funciones de expresiones regulares que usa Checkmk, tal y como se ha explicado anteriormente:
|
realiza coincidencias con cualquier carácter. |
|
Interpreta el siguiente carácter especial como un carácter normal. |
|
El carácter anterior debe aparecer exactamente cinco veces. |
|
El carácter anterior debe aparecer al menos cinco y como máximo diez veces. |
|
El carácter anterior puede aparecer cualquier número de veces (equivale a |
|
El carácter anterior puede aparecer cualquier número de veces, pero debe aparecer al menos una vez (equivalente a |
|
El carácter anterior puede aparecer cero o una vez (equivalente a |
|
Representa exactamente uno de los caracteres |
|
Representa exactamente uno de los caracteres |
|
Representa exactamente un dígito, una letra minúscula o el guión bajo. |
|
Representa exactamente un carácter, con excepción de la comilla simple o doble. |
|
Coincidencia con el final de un texto. |
|
Coincidencia con el principio de un texto. |
|
Hay una coincidencia con |
|
Coincide con la subexpresión A en un grupo de concordancia. |
|
Cambia el modo de evaluación de la subexpresión A a «sin distinción entre mayúsculas y minúsculas» mediante el indicador inline. |
|
Coincidencia con una tabulación. Este carácter suele aparecer en archivos de registro o tablas CSV. |
|
Realiza coincidencias con todos los espacios (ASCII utiliza 5 tipos diferentes de espacio). |
Los siguientes caracteres deben ir precedidos de una barra invertida,
si se quieren usar literalmente: \ . * + ? { } ( ) [ ] | & ^ $.
3.1. Unicode in Python 3
En particular, si se han copiado y pegado nombres propios en comentarios o textos descriptivos, y por lo tanto aparecen caracteres Unicode o diferentes tipos de espacios en el texto, las clases extendidas de Python son muy útiles:
|
Coincidencia con una tabulación (tabulador), que se encuentra en parte en archivos de registro o tablas CSV. |
|
Realiza coincidencias con todos los espacios (Unicode admite 25 espacios diferentes, ASCII 5). |
|
Invertir desde |
|
Realiza coincidencias con todos los caracteres que forman parte de una palabra, es decir, letras, y en Unicode también acentos, glifos chinos, árabes o coreanos. |
|
Inversión de « |
En los casos en los que Checkmk permite la coincidencia Unicode, «\w» resulta especialmente útil a la hora de buscar palabras con ortografía similar en diferentes idiomas, por ejemplo, nombres propios que a veces se escriben con acento y otras sin él.
| Expresión regular | Coincidencia | Sin coincidencia |
|---|---|---|
|
|
|
4. Probar expresiones regulares
La lógica de las expresiones regulares no siempre es fácil de entender, sobre todo cuando hay grupos de concordancia anidados, y surge la duda sobre el orden y qué extremo de la cadena se va a comparar. En lugar de ir probando a ciegas en Checkmk, hay dos formas de probar expresiones regulares: Los servicios online como regex101.com muestran las coincidencias de forma gráfica y explican el orden de evaluación en tiempo real:

El segundo método de prueba es el intérprete de Python, que viene con todas las instalaciones de Python. En Linux y Mac OS, Python 3 suele venir preinstalado. Precisamente porque las expresiones regulares en el intérprete de Python se evalúan exactamente igual que en Checkmk, no hay discrepancias en la interpretación, ni siquiera con anidamientos complejos. Con la prueba en el intérprete de Python siempre vas sobre seguro.
Una vez abierto, tienes que importar el módulo re.
En el ejemplo switchamos la distinción entre mayúsculas y minúsculas con re.IGNORECASE:
Para emular el comportamiento de las expresiones regulares de C, que también se usan en muchos componentes de Python, puedes restringir el uso a ASCII:
>>> re.ASCII
re.ASCIIAhora puedes usar la función re.match() para comparar directamente una expresión regular con una cadena y mostrar el grupo de concordancia:
group(0)representa la coincidencia completa, y group(1) la coincidencia que es la primera que coincide con la subexpresión entre paréntesis:
>>> 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. Documentación externa adicional
Ken Thompson, uno de los creadores de Unix allá por los años 60, fue el primero en desarrollar las expresiones regulares tal y como las conocemos hoy en día, entre otras cosas en el comando de Unix `grep`, que todavía se usa.
Desde entonces, se han creado numerosas extensiones y dialectos de expresiones regulares, incluyendo expresiones regulares extendidas, expresiones regulares compatibles con Perl, así como una variante muy similar en Python.
En los filtros de las vistas de tabla, Checkmk utiliza expresiones regulares extendidas POSIX (RE extendidas).
Estas se evalúan en el core de monitorización en C utilizando la función regex de la biblioteca C.
Puedes encontrar una referencia completa al respecto en la página del manual de Linux para regex(7):
En todos los demás lugares, están disponibles todas las funciones de las expresiones regulares de Python. Esto incluye, entre otras cosas, las reglas de configuración , las reglas de configuración de la Consola de eventos (EC) y la Business Intelligence (BI) .
Las expresiones regulares en Python son una extensión de las expresiones regulares extendidas y son muy similares a las de Perl.
Admiten, por ejemplo, la llamada «búsqueda negativa», un asterisco no codicioso de * o la distinción entre mayúsculas y minúsculas.
Los detalles de las capacidades de estas expresiones regulares se pueden encontrar en la ayuda en línea de Python para el módulo re, o con más detalle en la documentación en línea de Python:
Puedes encontrar una explicación muy detallada de las expresiones regulares en un artículo de Wikipedia.
