Clases predefinidas en regex: \d, \w y \s

Resumen

Cuando aprendes expresiones regulares, llega un momento en que dejas de buscar caracteres exactos y empiezas a buscar tipos de caracteres. Ese salto se apoya en las clases predefinidas de regex: el punto, \d, \w y \s, junto con sus negaciones. Si trabajas con logs, fechas, correos o nombres de usuario, aquí entiendes cómo pensar por patrones en lugar de por palabras.

Por qué el punto empareja casi cualquier cosa

El punto es tu comodín. Empareja cualquier carácter excepto el salto de línea: una letra, un dígito, un espacio, un símbolo o un acento. Lo único que deja fuera por defecto es \n [00:41].

Mira este ejemplo: la regex c.t busca una C literal, cualquier carácter y una T literal. Por eso hace match con cat, pero también con cot, cut, c#t o c t [00:52]. Aquí está el cambio de mentalidad: dejas de buscar lo que el texto dice y empiezas a buscar la forma que tiene.

Un correo electrónico, por ejemplo, no es una palabra concreta. Es una forma: algo@algo.algo [01:23].

¿Cuándo debo usar el punto en regex? Úsalo solo cuando de verdad quieras decir "cualquier carácter, no me importa cuál". Si necesitas específicamente dígitos o letras, hay clases más precisas que evitan falsos positivos.

Cuándo el punto es demasiado permisivo

El problema del punto es su flexibilidad. Si quisieras capturar fechas con ..-..-.. (año, mes, día), sí harías match con una fecha real. Pero también con basura como abcd-ef-gh [01:35].

Para fechas reales tienes que decirle explícitamente que quieres dígitos. Ahí entran las clases predefinidas.

Qué hacen \d, \w y \s en las expresiones regulares

Una clase predefinida es un atajo que el motor ya trae incorporado para emparejar un grupo común de caracteres. Se recuerdan por su inicial [02:20]:

  • \d de digit: empareja dígitos.
  • \w de word: empareja caracteres de palabra, es decir letras, dígitos o guion bajo.
  • \s de space: empareja un espacio en blanco.

Cada una tiene su versión en mayúscula que representa la negación, o sea todo lo contrario. \D es cualquier carácter que no sea dígito, \W cualquiera que no sea palabra, y así con el resto.

¿Qué significa \d en regex? Es un atajo que empareja un solo dígito del 0 al 9. En 2026 no captura el número completo: te trae por separado el 2, el 0, el 2 y el 6.

Cómo emparejar varios caracteres con un cuantificador

Cada atajo empareja un único carácter [02:47]. Por eso \d no captura 2026 de una sola vez. Para emparejar varios necesitas combinarlo con un cuantificador, que llega más adelante.

De forma intuitiva, podrías escribir cuatro veces \d para atrapar los cuatro dígitos de un año. Y cuando te convenga, usas las negaciones para hacer lo opuesto: capturar cualquier cosa menos un dígito.

Por qué Unicode y ASCII cambian el resultado de \w

Aquí viene una advertencia que vas a ver varias veces en el curso. Unicode y ASCII son estándares de codificación, y no todos los motores los tratan igual [03:20].

Unicode codifica caracteres de casi cualquier idioma del mundo: la á, la ñ, caracteres en chino o japonés, emojis y símbolos matemáticos. Algunos motores aceptan dígitos de otros sistemas de escritura o letras acentuadas en cualquier idioma.

El detalle está en el flavor que uses:

  • En Python 3, por defecto, \w ya incluye letras de cualquier alfabeto Unicode.
  • En PCRE2, que es el sabor por defecto que estamos viendo, \w es ASCII puro.
  • En JavaScript sin la flag U, también es ASCII puro.

Por eso, en ASCII puro, \w empareja ano pero no año. La ñ queda fuera silenciosamente y el motor no la toma [04:05]. Si tu texto puede contener acentos, caracteres no ASCII o emojis, haz pruebas explícitas antes de confiar ciegamente en cómo se comporta \w o \d.

Cómo aplicar estas clases en un log real

Supón que quieres extraer del log las líneas que empiezan con tres dígitos seguidos y luego un carácter de palabra, que puede ser dígito o letra. La primera regex que pensarías es \d\d\d para los tres dígitos consecutivos y luego \w [04:30].

Aquí pasa algo interesante: \w hace match tanto con un número como el 6 en 2026, como con una letra, por ejemplo en 112m.

Si cambias ese \w por \s, la regex hace match con todos los códigos de estado incluyendo un espacio o un enter. Ojo: la posición del espacio se captura dentro del match, así que no queda solo el número, también entra el espacio [05:10].

El caso de Sofía y los acentos

En el log aparece un nombre con tilde: Sofía. Si quieres capturar todos los nombres de usuario con el tag user, podrías escribir el texto literal user= seguido de \w y un +. Ese signo más significa una o más veces el carácter anterior [05:40].

Lo revelador es que Sofía no se captura completa: solo llega hasta Sof. ¿La razón? PCRE2 no entiende esos caracteres acentuados como parte de \w. Pero si cambias el flavor a Python, ahora sí captura el nombre completo, porque Python usa Unicode por defecto [06:15].

Eso se puede resolver en cada motor sin andar cambiándolo, y lo verás más adelante.

Con esto ya tienes los atajos que más vas a usar en el día a día y sabes cuándo el punto se vuelve demasiado permisivo. El siguiente paso llega cuando estos atajos no te alcanzan y necesitas definir tus propias clases. ¿Ya te topaste con algún caso donde \w te dejó fuera un acento? Cuéntalo en los comentarios.