13 Feb 2018
Expresiones regulares para SEO
Lectura: 26 mins.
|
Dificultad:

Expresiones regulares para SEO (Introducción)

Escribir un post, al menos uno de cierta calidad, lleva muchas horas. En Aukera nos encantaría poder publicar artículos en nuestro blog con mayor asiduidad, compartir conocimiento es parte de nuestra filosofía, pero el día a día —el trabajo para nuestros clientes— hace que no dispongamos de excesivo tiempo para ello.

Cuando detectamos un tema especialmente interesante lo “apuntamos” como pendiente para escribir a futuro sobre él. El caso de las expresiones regulares es uno de esos temas de los que a menudo hablamos en la oficina y hace ya tiempo que teníamos pendiente escribir sobre el tema. Pero el tiempo es tan escaso…

Así que cuando descubrí que nuestros amigos de Elephate se nos adelantaron, les propuse adaptar su contenido y publicarlo en castellano. Es gente profesional y simpática así que no me pusieron ninguna pega (¡gracias chicos!). Así que vaya por delante que este post es una adaptación de su post original en inglés publicado por Tomasz Rudzki a finales de 2017.

Lo cierto es que lo hemos reestructurado ligeramente, hemos añadido alguna cosita (alguna hemos quitado también) y le hemos dado un toque más ameno, más Aukera. Pero el mérito sigue siendo de Tomasz y compañía, que nos inspiraron y nos animaron a realizar esta adaptación que con tanto cariño compartimos contigo.

Qué son las expresiones regulares

Las expresiones regulares son una herramienta poderosa y facilitadora de nuestra actividad como SEO y en otras muchas facetas del marketing digital. Gracias a ellas, ahorraremos mucho tiempo a la hora de buscar cadenas de caracteres.

Al usar expresiones regulares podemos definir un patrón y encontrarlo así rápidamente en un documento o conjunto de documentos. Por ejemplo, nos puede servir para encontrar y extraer todas las direcciones de correo electrónico que haya en un informe o para detectar todos los URL que se encuentren en una página (tengan un enlace o no).

En resumidas cuentas, las RegEx serán una herramienta indispensable para ahorrar grandes cantidades de tiempo al trabajar con datos desordenados e información “a lo bulk”.

Este artículo nos enseñará lo siguiente:

  • Cómo buscar los códigos de estado (Status Code) de URL.
  • Cómo extraer los textos ancla (Anchor Text) de los enlaces.
  • Cómo filtrar las visitas de Googlebot en nuestros logs.
  • Cómo usar un simple editor de texto para reemplazar fragmentos de texto.

¿Es difícil aprender y utilizar las expresiones regulares?

En Internet somos un poco cabroncetes. Hacemos de casi todo un chiste y el sarcasmo está a la orden del día. Seguramente por eso hay tantos memes sobre las expresiones regulares, donde se satiriza sobre su dificultad a la hora de escribirlas y leerlas.

Memes sobre expresiones regulares

 

Pero, ¿son en realidad tan complicadas? No exactamente. Como casi todo, dependerá del grado de profundización en la materia. Puedes hacer un montón de cosas con unos conocimientos básicos de expresiones regulares. Y, sobre todo, pueden facilitar y mejorar tu trabajo como SEO.

Herramientas que soportan el uso de expresiones regulares

Existen infinidad de herramientas RegEx ready que soportan el uso de expresiones regulares y que están íntimamente ligadas al trabajo del SEO y el marketing digital. Por ejemplo:

  • Crawlers para optimización on-page, como Screaming Frog, DeepCrawl o Ryte (antes Onpage.org). Con las expresiones regulares podemos extraer información selectivamente; por ejemplo, para extraer el campo “Precio” al rastrear un ecommerce o para detectar páginas donde no se haya implementado el seguimiento analítico.
  • Google Analytics y otras herramientas de tracking. Nuevamente se pueden fijar filtros customizados según necesidades concretas de cada proyecto.
  • Editores de texto. Sí, esos programas tan básicos tipo “bloc de notas” como Notepad++, Gedit, Atom, o incluso en el mismísimo Word.
  • Google Sheets (que no “Google shits”, no seáis malos). Estas hojas de cálculo son cada vez más potentes y necesarias para el trabajo del SEO.
  • La mayoría de lenguajes de programación. En Aukera tenemos auténticos frikis expertos manejando estos patrones RegEx en PHP, JavaScript y Python.

Chuleta RegEx (Cheat Sheet)

A continuación dejamos la “cheat sheet” (en Bilbao seguimos diciendo “chuleta”; ¡cómo nos gusta el yantar, dios mio!) introductoria de expresiones regulares.

No pasa nada si te cuesta un poco entenderlo, más adelante explicaremos paso a paso de qué va todo esto. Una vez que asimiles esos principios podrás volver a esta chuleta y sacarle todo el partido.

Para quéEjemplo
Caracteres
\dCoincide con un número (0-9).\d coincide con 0,1,2,3,4,5,6,7,8,9

Es equivalente a [0-9] y a [0123456789].

.Un punto (.) coincide con cualquier carácter, excepto con una nueva línea.“.EO” coincide con SEO y CEO.
\.“.” coincide con cualquier carácter. Entonces, ¿cómo puedo buscar un punto? Utiliza “\” seguido de un punto.“Sin descripción de producto\.” coincide con “Sin descripción de producto.”
\sCoincide con cualquier espacio en blanco (espacio, nueva línea, tabulador, etc.).“\sSEO” busca un espacio en blanco seguido por “SEO”. Coincide con ” SEO”, pero no con “SEO”.
\wCoincide con cualquier carácter alfanumérico, incluyendo el guión bajo.\w coincide con “s”,”seo” y “1”. Es útil en casos específicos.
[ … ]Coincide con cada carácter dentro de los corchetes.[dl] coincide con “d” y con “l”.

[cs]eo coincide con “ceo” y “seo”.

[x-y]Coincide con cualquier carácter entre “x” e “y”.[0-9] coincide con 0,1,2,3,4,5,6,7,8,9.
[^x]Coincide con cualquier carácter que no sea “x”.
  • [^c]eo coincide con “seo”, pero no con “ceo”
  • [^5-9] coincide con cualquier carácter, excepto 5,6,7,8,9. Por lo que coincide con 0,1,2,3,4, además de con cualquier letra.
Cuantificadores
+Busca el carácter precedente 1 o más veces.[0-9]+ coincide con cualquier número, como 2, 301 y 1554455454545.
*Busca el carácter precedente 0 (cero) o más veces.
?Busca el carácter precedente 0 (cero) o 1 (una) vez.
  • “Links?” coincide con “Link” y con “Links”.
  • “Https?” coincide con “Http” y con “Https”.
{n}Coincide exactamente con n ocurrencias de la expresión.[0-9]{3} coincide con 200,301,404, pero no con 10
{m,n}Coincide con m a n ocurrencias de la expresión, ambas inclusive..{3,4} coincide con cualquier carácter repetido de 3 a 4 veces. Coincide con “301”, “seo”, “SEO”, “link”. Pero no coincide con “Google”.
{m,}Al menos m ocurrencias de la expresión.
Otros caracteres importantes
^Coincide con el comienzo de una cadena.^http coincide con “http” en “http://wikipedia.org”.

Pero no coincide con “http” en esta frase: “Google no soporta el protocolo HTTP/2″.

$Coincide con el final de una cadena.http.+\d+$

coincide con URLs que terminan con un número, por ejemplo, http://sitioweb.com?id=55456

O con http://sitioweb.com/product/454545

()Captura un grupo.
Clases especiales (negaciones)
\DCoincide con cualquier carácter no numérico.\D+ coincide con cualquier cadena que no contenga dígitos.
\SCoincide con todo menos con caracteres de espacio.

¡Descárgate la chuleta!

Ejercicios prácticos: aprendiendo Regex

Empezaremos con algunos ejemplos muy básicos. Para llevarlos a cabo, lo primero que necesitaremos será un software para testar expresiones regulares. En este caso, proponemos la herramienta online Regex101, que además es totalmente gratuita.

Regex 101

Encontrar “SEO” y “CEO” con una única expresión regular

Pongamos que el objetivo es encontrar los términos “SEO” y “CEO” dentro de un archivo de texto. Vale, podríamos buscar primero un término y luego el otro. Pero estamos aquí para aprender expresiones regulares y agilizar este trabajo.

Con una sencilla expresión regular podemos encontrar ambos términos basándonos en sus similitudes escriturales. Simplemente, plantearemos encontrar cualquier término que empiece por “S” o por “C” y que siga por “EO”. Lo vemos:

Regex []

Grosso modo, podemos decir que “[…]” casará con cualquiera de los caracteres individuales que incluyamos dentro de los corchetes. Por ejemplo, “[0123456789]” casará con cualquier dígito de una cifra.

En este caso, la expresión ha sido muy útil porque a menudo es complicado diferenciar entre un SEO, un CEO y un pringao… ¡Miradme a mí! (Que conste que en la versión original del pantallazo las palabras eran “seo”, “ceo” y “sex symbol”, pero luego pequé de falsa humildad).

El punto que todo lo valida

También podemos utilizar “.” (un punto) para casar con cualquier carácter. De esta forma “.EO” servirá para validar tanto “SEO” como “CEO”.

Regex .

IMPORTANTE: El punto también puede utilizarse como parte de la cadena de caracteres literales que deseamos encontrar. Simplemente, lo precederemos de una contrabarra y así perderá su poder omni-validador.

Es decir, si queremos encontrar el texto literal “Punto final.” tendremos que utilizar la expresión “Punto final\.”. No es tan complicado, ¿no?

Los operadores “+” y “?”

Utilizamos los operadores del símbolo “más” (+) y de la interrogación de cierre (?) para evitar las repeticiones de conjuntos de caracteres y/o controlar cuántas veces aparecen.

  • El símbolo “+” significa “una o más ocurrencias” de aquello que le precede.
  • El símbolo “?” significa “cero o una ocurrencias” de aquello que le precede.

Pongamos un ejemplo práctico, partiendo de un listado de URL:

  • https://aukera.es
  • https://aukera.es/?id=123
  • https://aukera.es/blog
  • https://aukera.es/blog/pag1
  • https://aukera.es/blog/pag2

Imaginemos que nosotros mismos hemos definido la arquitectura inicial de URLs del sitio, en la cual no hubo lugar para los números en los URL canónicos e indexables. Sin embargo, hemos detectado que se están generando páginas no deseables cuyo patrón común es la existencia de números (es habitual: paginaciones, parámetros, identificadores de sesión, etc.).

Para buscar estos URLs utilizaremos una expresión regular del tipo:

  • http.+[0-9]+

Regex .[0-9]+

Así, le habremos dicho que nos encuentre cualquier string que comience por “http”, seguido de cualquier cosa (el punto) cualquier número de veces (el “más”), seguido de cualquier número (dentro del corchete hemos establecido un rango de números desde el cero hasta el nueve, es decir, todos) cualquier número de veces.

¿Qué pasa? Que esto está muy bien para los URL que terminan en un número. Pero si después del número hubiese más letras (u otros caracteres) la regla no funcionaría correctamente para ese URL. Ampliemos el conjunto de URL con ese caso concreto:

  • https://aukera.es
  • https://aukera.es/?id=123
  • https://aukera.es/blog
  • https://aukera.es/blog/pag1
  • https://aukera.es/blog/pag2
  • https://aukera.es/blog/pag2/?id=1&hl=es

Para que la expresión regular funcione correctamente habrá que añadir, al final de ésta, una condición para que coja todo lo que sigue al número, de esta forma:

  • +[0-9]+(.+)?

Regex +[0-9]+(.+)?

Vaya, esto empieza a crecer. Repasemos la sintaxis: cualquier cosa que empiece por “http”, seguido de cualquier carácter (“.) cualquier número de veces (“+”), seguido de cualquier dígito ([0-9]) cualquier número de veces (“+”), seguido de cualquier conjunto de caracteres (“.+”, como antes) de manera opcional (“?”), es decir, cero o una veces.

En otras palabras, la interrogación hace opcional la aparición de lo que está entre los paréntesis que le preceden. Si quitamos la interrogación estaríamos eliminando de los resultados positivos aquellos URLs que terminaran en un dígito, ya que estaríamos imponiendo algún carácter tras ese dígito.

Y como ya habrás adivinado, los paréntesis nos sirven para generar subexpresiones dentro de las expresiones regulares, a las cuales podremos aplicarles operadores.

Acabamos de aprender de una sentada para qué sirve el símbolo “?” y también los paréntesis. ¡No está nada mal! (Si eres un listillo o si te preguntas por qué aparece eso en verde, más adelante ampliamos el tema de los paréntesis; tranquilidad y buenos alimentos).

Solo URLs del blog

Siguiendo el mismo ejemplo y si sólo quisiéramos detectar las paginaciones (o cualquier otro número en URLs) que se están dando para el contenido del blog (subcarpeta “/blog/” en nuestra arquitectura) simplemente añadiremos la condición a la expresión regular, de esta forma:

  • http.+\/blog\/.+[0-9]+(.+)?

Regex http.+\/...\/.+[0-9]+(.+)?

Así le estaremos diciendo que nos interesa todo lo que empiece por “http”, seguido de cualquier carácter cualquier número de veces, seguido de “/blog/”, seguido de cualquier carácter cualquier número de veces, seguido de cualquier dígito cualquier número de veces, seguido opcionalmente de cualquier carácter cualquier número de veces. ¡¡Tachán!!

¡Ay, amigo! Pero aquí existe una pequeña fisura. Esta RegEx no servirá si después del subdirectorio “blog” lo primero que nos encontramos en el URL es un dígito (ej: https://aukera.es/blog/5). Podríamos subsanarlo haciendo opcional (“?”) el string de caracteres posterior al subdirectorio, así:

  • http.+\/blog\/(.+)?[0-9]+(.+)?

Incluir versiones http y https para un subconjunto de URLs

Imaginemos ahora un conjunto de URL, de los cuales queremos extraer únicamente un subconjunto concreto, pero tanto en su versión http como https. Puede ser el caso de un informe de backlinks donde encontramos un listado de URL destino como este:

  • http://aukera.com
  • http://aukera.es
  • http://aukera.es/blog
  • http://aukera.es/blog/post
  • http://eureka.es
  • http://eureka.es/blog
  • https://aukera.es
  • https://aukera.es/blog

Nos interesará discriminar los URL que realmente apuntan a nuestro dominio “aukera.es”, tanto en su versión http como https (al no ser los dueños del resto de dominios misspelling como “aukera.com” o “eureka.es”, no podremos redirigir esos URL a los correctos, así que tocará contactar con los webmasters del sitio de origen). Para ello determinamos la siguiente expresión regular:

  • https?:\/\/aukera\.es(.+)?

Regex https

De esta forma, el comando devolverá aquello que empieza por “http” más una “s” opcionalmente, seguido de los dos puntos (“:”), las dos barras (ponemos delante de cada una la pertinente contrabarra para que se entienda que nos referimos al carácter barra), seguido de “aukera”, seguido de un punto (le tenemos que poner la contrabarra también para especificar que nos referimos al caracter literal), seguido de “es” y seguido de cualquier conjunto de caracteres (“.+”)… pero opcionalmente (de ahí la interrogación final). Es decir, que el string buscado puede incluir o no algo después del “.es” (en este caso, el URL siempre llevará algo después, salvo en el caso de los links que apuntan a nuestra Home).

Es un poco más largo, pero igualmente sencillo desde el punto de vista sintáctico. Para cualquier duda que os surja, podéis dejarnos un comentario al final del post e intentaremos aclararla.

Cuantificadores

Hemos dicho que “[0-9]” significa cualquier número de un único dígito, como 4 o 7. Pero claro, habrá muchas ocasiones en las que necesitemos especificar un número de equis dígitos. ¿Un ejemplo? Los códigos de estado HTTP (no acabo de acostumbrarme a usar el término en castellano, generalmente me refiero a ellos como “status code”), que están formados por tres dígitos (código 200, 301, 404…).

¿Cómo lo hacemos? Es un poco absurdo escribir “[0-9][0-9][0-9]”, especialmente cuando contamos con herramientas como los cuantificadores. Estos consisten en un número que define el total de ocurrencias colocado entre llaves. En este caso: “{3}”.

  • [0-9]{3}

De esta forma la expresión “[0-9]{3}” validaría los status code “200”, “301”, “302”, “404”, “410”, “503”… por nombrar algunos de los más habituales, aunque en realidad sirve para validar cualquier número de tres dígitos.

Regex [0-9]{3}

Problema (que se veía venir=: aquí tenemos un match parcial (“2001”) para los números que están compuestos por más de tres dígitos. La solución, a continuación.

Límite de palabra

Cuando queremos delimitar la longitud o posición de una palabra, podemos delimitar dónde empieza y dónde termina esta, utilizando “\b”. De esta forma tenemos:

  • \b[0-9]{3}\b

Regex \b[0-9]{3}\b

Así estamos especificando que no genere un match cuando la condición (tres dígitos) no coincida con los límites de una palabra. Es decir, la condición impuesta tiene que corresponder a una palabra (string) individual, precedido y seguido de un espacio en blanco (también validaría cualquier otro símbolo no estandarizado, como un guión medio o una eñe… ¡cuidado con eso!).

Mínimo de ocurrencias (equis o más)

Imagina que utilizas un software de rastreo on-page que te devuelve los informes en un formato de texto plano en lugar de utilizar hojas de cálculo o similar. Por ejemplo, un informe de enlaces salientes como éste:

155 external links to http://forocoaches.com

72 external links to http://viquepedia.org

123 external links to http://instaglam.com

5 external links to http://telecirco.es

4895 external links to http://inflojobs.net

101 external links to http://facekedin.com

0 external links to http://googleplus.com

Quizá nos interese saber los sitios masivamente enlazados y, para ello, establecer aquellos dominios destino a los que apuntan más de 100 enlaces. Sería tan sencillo como detectar cadenas de dígitos con un mínimo de 3 elementos (número “100” y superiores).

Para ello, simplemente habrá que añadir una coma al número de elementos que definimos dentro de las llaves, así:

  • [0-9]{3,}

RegEx [0-9]{3,}

Captura de grupos (paréntesis capturadores)

Todo lo anterior está muy bien para encontrar cadenas de caracteres dentro de un texto. Pero en la práctica querremos hacer cosas con esas búsquedas, como extraer parte de la información de esas cadenas de caracteres que encontramos.

Un ejemplo sencillo sería encontrar todos los enlaces dentro del código de una página y extraer su anchor text (lo siento pero me niego a decir “texto ancla”) para luego… lo que sea. Veamos:

<a href=”https://aukera.es”>la mejor agencia de analítica web y marketing online</a>

<a href=”https://aukera.es/quienes-somos/”>equipo profesional y sumamente atractivo</a>

<a href=”https://aukera.es/blog/”>sitio web de referencia en marketing digital</a>

<a href=”https://aukera.es/contacto/”>llama y llevarán tu negocio a otro nivel</a>

Dentro de las expresiones regulares, es sumamente importante el papel de las funciones para captura de grupos. Para ello se utilizan —giro inesperado— ¡los paréntesis!

Pero a ver, Eneko, ¿no decías que los paréntesis servían para agrupar subexpresiones dentro de las RegEx y poder así aplicar operadores a esas subexpresiones?

Sí, también. Lo que pasa es que he hecho un poco de trampa. El uso de paréntesis tal y como hemos visto antes sirve para capturar porciones de información (algo así como un buffer); es decir, eso de color verde que aparecía en los pantallazos anteriores era un grupo de caracteres (el correspondiente al paréntesis) que estaba siendo “memorizado”.

Apliquemos una expresión regular para extraer los anchor text anteriores y así lo veremos mejor:

  • <a href.+>(.+)<\/a>

RegEx <a href.+>(.+)<\/a>

Pues bien, lo que está ocurriendo internamente es esto:

RegEx Group Match

Estamos guardando un grupo de porciones de información (los anchor text, denominados “Group 1”) que posteriormente podremos exportar de manera conjunta. Aquí es donde empezamos a sacarle partido a las expresiones regulares.

Cómo definir subexpresiones sin capturarlas (paréntesis no capturadores)

Para definir una subexpresión regular hay que incluir “?:” al principio del contenido de los paréntesis, así no se recordará la coincidencia obtenida. Dicho de otra forma, la expresión regular correcta en el ejemplo previo de las http y https para URLs del blog debía ser la siguiente:

  • https?:\/\/aukera\.es(?:.+)?

RegEx (?:.+)

En este punto espero se haya saciado la curiosidad de todos los que se preguntaban por ese color verde que utiliza Regex101 para mostrar la información de manera visual. Es realmente práctico.

Tipos de caracteres (agrupados)

Previamente se ha visto cómo puede definirse un dígito cualquiera mediante un rango: “[0-9]”. Esto está inicialmente pensado para rangos más acotados, por ejemplo un número entre 1 y 3: “[1-3]”.

Para referirnos a “cualquier dígito” es más cómodo y apropiado usar “\d”. Esto sustituirá a cualquier dígito de una cifra.

De la misma manera, existe un operador para referirnos a “cualquier caracter que no sea numérico”, algo así como la antítesis de lo que acabamos de ver, que sería con la mayúscula: “\D”. Para los más curiosos, esto también puede expresarse como “[^0-9]” (el capirote lo encontrarás junto a la letra “P” de tu teclado, ASCII 94 para más señas).

Llegado este punto, quizá te interese saber que los rangos también sirven para letras. Por ejemplo “[a-c]” valida la letra “a” ó “b” o “c”. Es “case sensitive” (¿cómo se dice esto en castellano?, nos faltan palabros); vamos, que puedes ponerle “[A,C]” y te validará solo el rango de mayúsculas.

Comienzo y final de una cadena de caracteres (string)

Imagina que tienes un archivo desestructurado (no hace falta mucha imaginación) que contiene información sobre disponibilidad de producto en un ecommerce. Sin embargo, los copys pueden complicarnos la vida con ejemplos como estos:

  1. El producto no está disponible
  2. Producto disponible (si el producto no está disponible, póngase en contacto)

Para encontrar los casos en que hay rupturas de stock podríamos buscar “el producto no está disponible”, pero entonces tendríamos falsos positivos, porque el string de búsqueda es común a ambos casos.

Para evitar este problema, nos valdría como solución especificar que queremos encontrar aquellas cadenas de caracteres que comienzan por “el producto no está disponible”, obviando aquellas cadenas donde la frase que buscamos está en mitad del texto (es decir, validar la opción “a” y descartar la “b”).

Utilizaremos el capirote “^” (creo que el término técnico es “acento circunflejo”) para significar “aquello que empiece por”. De esta manera la expresión regular que nos salva la vida sería:

  • ^el producto no está disponible

Regex ^

Nótese que hemos hecho un poco de trampa. El capirote busca aquello que comienza con el string que definimos, pero por defecto tomaría solo la primera aparición del término, ya que no considera los saltos de línea como finales de string (así que no consideraría el comienzo de línea como principio de un string diferente).

Para que valide la segunda aparición hemos activado la bandera (flag) multiline (en la imagen verás una banderita y una “m” a su lado), así considerará cada línea como el comienzo de un string. A nivel de código la definición de banderas es un poco más avanzado, de todas formas al final del artículo dejaremos algunas lecturas interesantes para profundizar.

Si queremos definir aquello que termina con un string de caracteres concretos, en lugar del capirote al principio del string, usaremos el símbolo de dólar “$” al final del mismo:

  • el producto no está disponible$

En este caso nos sirve igualmente para validar, dado que hemos cogido el string completo y, por tanto, es tanto el comienzo como el final del propio string.

Localizar palabras y espacios en blanco

Todos sabemos qué es una palabra y qué es un espacio en blanco. Así que vamos al turrón, con un ejemplo práctico. Pongamos el siguiente texto:

“Se han encontrado 6 menciones de tu marca, 14 enlaces hacia tu marca y 11 reseñas en Google”.

Queremos extraer el número de menciones, enlaces y reseñas, separando el grano de la paja. Es decir, localizar “6 menciones”, “14 enlaces” y “11 reseñas”. Ya hemos dicho que con “\d” localizamos cualquier dígito, solo nos queda por saber entonces que:

  • \s” sirve para localizar espacios en blanco.
  • \w” sirve para localizar cualquier carácter alfanumérico (letras y dígitos) así como guión bajo.

De esta forma generamos la siguiente expresión regular:

  • \d+\s\w+

RegEx \d+\s\w+

De esta forma le estamos pidiendo que valide cualquier dígito (cualquier número de veces, es decir, de cualquier magnitud entera), seguido de un espacio en blanco, seguido de cualquier conjunto de caracteres alfanuméricos (palabra).

¡Uy! Pero ¿qué ha pasado con las “reseñas”? Aquí nos encontramos con nuestra querida letra eñe. Cuando se trata de lenguajes de programación, ya se sabe que ciertos caracteres no estandarizados a nivel internacional son problemáticos, así que lo suyo será o bien tratar el input de datos y normalizarlos de alguna manera o bien generar rangos de caracteres personalizados. Es lo que hay.

Ejemplos prácticos aplicados al SEO

Todo lo anterior sirve como introducción a las expresiones regulares y creo que puede ayudar a tener una visión más abierta sobre el tema. Ya se han atisbado algunas utilidades prácticas en relación al SEO, pero ahora vamos a centrarnos en ciertos casos muy concretos y que se abordan a menudo en nuestra profesión.

Filtrar las visitas de Googlebot en nuestros logs

Hoy en día no puedes hacerte llamar SEO si no te toca pelearte con logs. Atrás quedan los tiempos en que todo eran palabras clave y hoy nos toca aprender frikadas apasionantes cuestiones técnicas para desempeñar efectivamente nuestro trabajo.

Hablando en serio, se le coge el gustito. En Aukera llevamos un tiempo profundizando en el desarrollo de herramientas propias de Data Engineering, tanto para SEO como para Analítica, y ahora es cuando nos damos cuenta de que hay dos ligas muy diferentes en esto del marketing digital.

Al lío. Lo habitual al manejar logs es encontrarnos con archivos MUY grandes (varios gigas) o en su defecto MUY indigeribles. Una de las informaciones más prácticas que se extraen de los logs es el comportamiento del Googlebot en nuestro sitio. Sabiendo que su “huella” siempre es la misma (pongamos por ejemplo la IP 66.249.xx.xx) es relativamente sencillo aplicar una expresión regular que identifique sus visitas:

  • 66\.249\.\d+\.\d+

RegEx 66\.249\.\d+\.\d+

Si cogemos toda la información del log, también podemos filtrar (a priori más sencillo) por el User Agent “Googlebot”. En cualquier caso, espero que el ejemplo sirva para visualizar la aplicación práctica e ir familiarizándose con las expresiones.

Nótese que en todos los ejemplos nos estamos limitando a “localizar” las porciones de información que nos interesa. Las auténticas aplicaciones prácticas vendrían después, cuando extraigamos el contenido asociado a dichas porciones, lo guardemos estructuradamente, lo tratemos para convertirlo en información práctica y finalmente lo hagamos parte de un sistema inteligente con objetivos concretos.

Pero por eso este post se apellida “Introducción”. La idea es poneros los dientes largos y que sigáis aprendiendo por vuestra cuenta. No os lo vamos a contar todo, ¿no?

Extraer grupos de información de un URL (con Notepad)

A menudo los informes que extraemos a través de diferentes herramientas SEO son conjuntos de URLs que responden a ciertos criterios. La descomposición de dichos URLs puede ser una fuente en sí misma de información adicional, siempre que el sitio haya sido correctamente jerarquizado.

En el caso de los ecommerce, esto puede ser incluso más importante, porque puede permitirnos extraer información sobre los productos sin necesidad de cruzar URLs con tablas de correspondencia de categorías, subcategorías o SKUs. Por ejemplo:

http://flato.com/running/ficha/1056

http://flato.com/bicicletas/ficha/0973

http://flato.com/tennis/ficha/0874

http://flato.com/running/ficha/1042

Aquí el ejercicio se tratará de capturar (con los famosos paréntesis) 3 entidades distintas:

  • URL
  • Categoría
  • SKU

Vamos a proponer la siguiente expresión regular para validar:

  • (https?:\/\/flato\.com\/(.+)\/ficha\/(\d+))

RegEx extraer grupos de información de un URL

Vemos cómo los paréntesis capturadores han hecho su triple función:

RegEx

En esta ocasión vamos a ir un pasito más allá. Vamos a reescribir el archivo de texto que servía de input (el conjunto de URLs) para que figure un listado de URL+Categoría+SKU.

Para ello nos serviremos de un editor de texto sencillo y gratuito como Notepad++ (puedes descargarlo aquí) y de la función más básica del mundo: “Buscar y reemplazar”. Lo vemos:

Regex y Notepad

Mediante el comando “\n” (donde “n” es un número entero positivo), referenciamos el contenido que hemos “buffereado” en los grupos anteriores, por orden de aparición. Aquí se abre todo un mundo, os animamos nuevamente a investigar y trastear para descubrir todo lo que se puede hacer.

Hacemos clic en “Reemplazar” y aquí tenemos el resultado:

RegEx Notepad resultado

Filtrar patrones de URLs en Google Analytics

A continuación proponemos un ejemplo que, a pesar de no tener un gran sentido práctico (hay otras herramientas de filtrado basadas en la configuración de Analytics), resulta bastante ilustrativo.

Pongamos que queremos filtrar todos los URL tipo AMP de nuestro blog, que responden a este patrón:

  • /blog/cualquier-titulo-de-pagina/amp/

Proponemos generar una expresión regular que determine esos tres niveles (“blog”, “titulo”, “amp”), así aprenderemos cómo validar una porción de URL que contiene guiones medios (no considerados un carácter alfanumérico). Así:

  • \/blog\/[-\w]+\/amp\/$

La única novedad aquí es el fragmento “[-\w]+”, donde simplemente decimos que valide cualquier conjunto de caracteres alfanuméricos (w) incluyendo en el rango aceptado los guiones medios (el guión medio podría ir detrás de la “w” también, aunque generalmente se pone delante).

Si nos vamos a la interfaz de Google Analytics y filtramos utilizando esta expresión regular, nos encontramos con los resultados que pretendíamos:

RegEx y Google Analytics

El símbolo de dólar final hace que no aparezcan entre los resultados aquellos URLs que incluían algún tipo de parámetro final.

Lecturas adicionales

Esperamos que este post haya servido como introducción a las expresiones regulares y que os haya despertado el gusanillo y la curiosidad para seguir investigando por vuestra cuenta.

Nuestro consejo es que rompáis cosas, que probéis, que toquéis, que uséis… rompiendo se aprende. Eso sí, no con los proyectos de los clientes, sino con los propios, criaturas.

Terminamos con algunas lecturas imprescindibles que os ayudarán a seguir profundizando en el apasionante mundo RegEx: