Cuando te enfrentas a un análisis de datos, existen muchas situaciones en las que, bien por las limitaciones de las herramientas, bien porque necesitamos unificar instrucciones, no nos queda otra que recurrir a las expresiones regulares, regex o regexp.
Cómo vamos a ver a continuación, es posible que al principio resulten complicadas y den algo de miedo, sobre todo si estamos acostumbrados a las opciones de búsqueda habituales del tipo «Contiene» o «Empieza por». Debemos pensar que las regex hacen exactamente lo mismo que estas opciones mencionadas, y mucho más.
Las expresiones regulares básicas ya nos sirven para poder para implementar búsquedas de datos que empiecen de determinada manera, que contengan una palabra o carácter y, lo que para mí es más importante, sobre todo si alguna vez te enfrentar a una migración SEO, unificar búsquedas para patrones detectados en el análisis.
Imagina que con una sola instrucción puedes resolver cientos de problemas. Para eso utilizamos las expresiones regulares. Antes de empezar a desgranar el tema, debo decir que existen multitud de caracteres que son válidos con determinados lenguajes de programación y no con otros, en el caso de este artículo voy a utilizar aquellos que son compatibles principalmente con Google Analytics
Vamos a hablar de...
¿Qué son las expresiones regulares?
Las expresiones regulares son secuencias de caracteres que conforman patrones de búsqueda. Para aclararnos un poco más, se trata de construcciones en las que, utilizando una serie de símbolos y caracteres con significados, conseguimos abarcar una serie de elementos comunes con una sola consulta.
Un ejemplo claro sería buscar en Google Analytics todas las url cuyo path empieza por /comprar/ y termina por .html. Podríamos crearlo utilizando dos opciones de búsqueda unidas por un Y, o utilizar una expresión regular en la que, con un solo ^/comprar/(.*)\.html$, ya tendríamos las dos opciones.
Cómo construir expresiones regulares básicas
Las expresiones regulares básicas, como comentaba antes, se construyen utilizando una serie de símbolos que tienen determinados significados. Dominarlas no significa otra cosa que conocer el significado de los mismos y concatenar hasta formar la consulta que deseamos.
Si pruebas y pruebas pero no consigues sacar los resultados que buscas, no te rindas, pues siempre es recomendable utilizar herramientas que nos permitan probar nuestras expresiones regulares antes de realmente utilizarlas, por ejemplo, en un segmento o una agrupación de contenidos.
Para ello, os recomiendo que utilicéis regex101.com y configuréis las expresiones regulares para RE2. Posteriormente exportáis, por ejemplo, la lista de urls sobre las que queréis trabajar, y comenzáis a hacer pruebas hasta que consigáis el resultado deseado. Solo con práctica vais a conseguir que cada vez hagan falta menos pruebas.
Meta caracteres o comodines
Regex | Descripción | Ejemplo |
. | 1 carácter | a. |
* | 0 o más veces | .* |
+ | 1 o más veces | .+ |
? | 0 o 1 vez | .? |
| | OR | a|b |
Lo meta caracteres o comodines son los principales elementos que vamos a utilizar para concentrar patrones en las expresiones regulares. Mientras que el punto representa a un carácter alfanumérico cualquiera, el asterisco, la suma o el interrogante son multiplicadores que nos permitirán indicar cuántas veces se puede repetir el primero. De igual manera, la barra nos servirá para especificar condiciones disyuntivas.
Anclas
Regex | Descripción | Ejemplo |
^ | Empieza por | ^/blog/ |
$ | Termina con | /blog/$ |
Las anclas nos permiten establecer comienzos y finales para nuestras consultas. Mientras que el acento circunflejo (^) nos indica que la cadena debe comenzar por lo que viene a continuación, el símbolo $ indica que la misma debe terminar por lo que va inmediatamente antes.
Grupos
Regex | Descripción | Ejemplo |
() | Coincide con lo que haya entre paréntesis en el mismo orden o agrupa otras regex. | (a|b|c) |
[] | Coincide con lo que haya entre corchetes en cualquier orden. | [abc] |
– | Intervalo | [a-z], [0-9] |
Las agrupaciones e intervalos son útiles para ordenar las consultas y establecer rangos de cumplimiento de las búsquedas. En el caso de los paréntesis, nos permite agrupar otras expresiones regulares, mientras que los corchetes establecen un obligado cumplimiento de lo que va en su interior, pudiendo establecer esos intervalos mencionados.
Escape
Regex | Descripción | Ejemplo |
\ | Interpretación literal | producto\.html |
Finalmente, el escape o \ (\\ en Data Studio) nos sirve simplemente para indicar que algunos caracteres que se pueden interpretar como partes de una expresión regular, por ejemplo el punto, se interpreten de manera literal. Muy útil cuando tenemos que filtrar urls con puntos o interrogantes de parámetros.
Expresiones regulares básicas
Bueno, llegados a este punto en el que ya hemos visto los caracteres básicos que vamos a utilizar en la creación de nuestras expresiones regulares, a continuación voy a explicar algunas de ellas con ejemplos. Las combinaciones pueden ser miles y dependerán del objetivo de la expresión regular, sin embargo, con las que os voy a comentar a continuación podremos resolver la mayoría de situaciones del día a día.
Regex básica para una cadena que puede ir precedida y seguida de más caracteres o no
.*cadena-de-texto-a-localizar.*
.*/blog/.*
.*/blog/categoría/.*
Utilizamos el . para indicar que hay 1 caracter que se multiplica, o no, infinitas veces. El comodín .* viene a ser algo así como «cualquier carácter o caracteres alfanuméricos», en este caso, que vayan antes o después de la cadena.
Expresión regular básica para una cadena que puede contener o no uno o varios caracteres
/zapatos?/.*
/collar(es)?/.*
En este caso utilizamos el multiplicador ? para indicar que el caracter que le precede, es decir, la s, puede estar o no estar (0 o 1 vez). Es una búsqueda útil cuando tenemos productos con nombres en común en singular y plural, por ejemplo.
Regexp para una cadena que comienza y/o acaba de determinada manera
^https://www.midominio.com/productos/.*
^https://www.midominio.com/productos/$
En estos casos, obligamos a que la cadena comience por todo el texto hasta el último slash (/). En el primer ejemplo hacemos que empiece así y continúe de cualquier manera con el ya explicado .*, mientras que en el segundo ejemplo hacemos que acabe con /productos/.
Expresión regular para una cadena con diferentes coincidencias en mayúsculas y minúsculas
.*/[zZ]apatos/.*
En este ejemplo, obligamos a que haya un z o una Z en la ubicación donde hemos colocado los [] de manera obligatoria.
Regex básica una cadena que no contenga caracteres de un intervalo específico
.*/talla-1[^2-5]/$
Esta consulta nos sacaría resultados como 10, 16 y 17, pero ni 12 ni 13 ni 14 ni 15. Es algo útil cuando tenemos cadenas o urls numeradas pero solo queremos conocer la información de algunas de ellas.
Expresión regular para cadenas que tienen que cumplir varias condiciones
^/((zapatos?-(blancos?|azul(es)?|negros?))|botas?-(montana|moto|molona))/.*
Veamos. Establecer una consulta que cumpla diferentes condiciones no deja de ser una concatenación de expresiones regulares básicas. En este caso, he obligado a que la url comience por / y, a continuación, he establecido que puedan ser zapatos de diferentes colores en singular y plural o botas de diferentes tipos. Pero la consulta no acabe ahí, sino que también cuenta todo lo que cuelgue a continuación de una u otra ruta con .*. Sacaría resultados como /zapatos-azules/con-cremallera/ o /bota-montana/marron/, por ejemplo.
Expresiones regulares para fechas
Hay casos, por ejemplo cuando en una migración SEO debemos trasladar una clasificación de artículos bajo directorios de fechas a categorías u otras opciones, en las que tenemos que localizar todas las fechas de un plumazo. Voy a tratar de explicar un caso a continuación en el que las expresiones regulares se pueden usar también para fechas y ahorrar muchísimo trabajo con una sola consulta.
Quiero localizar directorios que tengan fechas incluidas en formato dd/mm/yyyy
^https://www.midominio.com/((0[1-9])|(1[0-9])|(2[0-9])|3([0-1]))(/|-|\.)(([0-1][0-9]))(/|-|\.)(([0-2][0-9][0-9][0-9]))/.*
Como veis, seguimos con el ejemplo de que la cadena de texto comience con una host normal, pero después del slash tras el .com empezaría una fecha. Imaginemos una url del tipo /12/09/2021/. Y ahora os explico el ejemplo.
En primer lugar abrimos una agrupación en la que indicamos, por cada posición de un carácter, que dd puede ser 0 seguido de cualquier número que vaya de 1 a 9 (0[1-9]); así podemos localizar días del mes del 1 al 9 en formato dd (01, 02, 03, etc.). Luego creamos un OR con | y contemplamos que vaya del 10 al 19 con (1[0-9]); finalmente otro | y contemplamos del 20 al 29 con (2[0-9]) y del 30 al 31 con (3[0-1]). Con esto resolvemos todos los casos posibles de dd.
Antes de explicar mm, en el ejemplo he tenido en cuenta que la unión pueda ser /, . o -. En el caso de una url lo más seguro es que sea un guion o un slash, pero así os sirve para localizar textos. En este caso simplemente es una regex disyuntiva entre los tres símbolos, (/|-|\.). Antes del punto he metido un escape \ para que interprete el punto literalmente. Si nos diese igual el símbolo, poniendo un punto (.) ya contemplaríamos cualquier carácter alfanumérico.
El caso de mm es más sencillo, solo tenemos 12 meses, por lo que podemos tener meses del 01 al 09 con un solo carácter válido (que no sea 0) y del 10 al 12 con dos. Por ello, el primer carácter puede ser solo 0 o 1, [0-1]. El segundo puede ser 0, 1 o 2, por lo que lo resolvemos con un intervalo de [0-9]. Y solucionado. Aquí podría darse también la combinación 00 o 19, si queremos evitarlas podríamos hacerlo de la misma manera que hemos montado el dd. Y metemos otra unión como la ya explicada. Sería algo así: (0[1-9]|1[1-2]).
Finalmente, el caso del año en formato yyyy, lo resolveríamos carácter a carácter estableciendo segmentos. El primero de 0 a 2 [0-2] (de momento estamos en el segundo milenio), el segundo, el tercero y el cuarto, de 0 a 9 con [0-9]. Cerramos todas las agrupaciones y podríamos concatenar un .* o acabar con un $, depende de si buscamos más elementos.
En una migración, continuaríamos con un (.*) que utilizaríamos con el constructor $1 en la correspondiente 30x.
Cómo utilizarlas en el análisis digital con Google Analytics
Hasta aquí todo muy guay, seguramente se haya quitado ya ese miedo inicial a las expresiones regulares. Los ejemplos de arriba os van a salvar más de una vez, pero este mundillo de las regex, insisto, es infinito: depende del objetivo de la consulta, del lenguaje de programación, del contexto donde se utiliza, etc. Pero si nos ceñimos a herramientas como Google Analytics o Data Studio, nos van a servir.
De Data Studio hablaré en otro artículo, pero en Google Analytics las expresiones regulares se pueden utilizar en diferentes lugares de la herramienta que nos pueden facilitar la vida. En este punto no me voy a extender más, que el artículo está quedando ya demasiado largo, pero sí me gustaría hacer un pequeño repaso que ampliaré en un futuro post.
En Google Analytics podemos utilizar expresiones regulares básicas y no tan básicas en:
- Filtros de vistas: podemos filtrar una vista directamente para recoger datos que cumplan una consulta, tanto básicos como avanzados con campos y constructor.
- Objetivos: podemos crear objetivos de destino y de evento utilizando expresiones regulares que condicionen su cumplimiento. Por ejemplo que visiten varias páginas concretas o un evento que introduzca una etiqueta que puede ser dinámica desde Google Tag Manager.
- Segmentos: aunque las regex se pueden usar en todos los tipos de segmentos, siempre recomendaré ir directamente a las opciones avanzadas para establecer tus propias condiciones y secuencias. Con seleccionar «coincide con la expresión regular» o «no coincide con la expresión regular», ya podremos utilizarlas.
- Audiencias: al final, es parecido a la creación de un segmentos, así que el funcionamiento es igual que lo ya explicado.
¡Y hasta aquí! Espero que el artículo os haya servido para coger algo más de confianza con las expresiones regulares. Recordad que si queréis seguir profundizando no debéis separaros de herramientas como regex101.com. ¡Nos leemos!