¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Expresiones regulares y grep

Después de esta lección: Puedo escribir una expresión regular y probarla con grep.

Lección de 50 min5 comandosLaboratorio de compiladores y arquitectura: gcc, flex, bison y RISC-V en una VM

Qué es una expresión regular

Una expresión regular es un patrón corto que describe un conjunto de textos, como todos los códigos postales de cinco cifras. Con un solo patrón puedes buscar, comprobar o extraer datos en miles de líneas.

Una tienda recibe pedidos con teléfonos escritos de mil formas. Un patrón basta para encontrar los que tienen nueve cifras seguidas.

Al final de esta lección

Nota

Puedo escribir una expresión regular y probarla con grep.

Palabras clave

PalabraQué significaEjemplo
Expresión regularun patrón que describe un conjunto de textos
Literalun carácter que encaja consigo mismoa
Clase de caracteresun grupo de caracteres entre corchetes[0-9]
Cuantificadordice cuántas veces se repite lo anterior+
Anclafija el patrón al principio o al final de la línea^ y $
Lenguaje regularun conjunto de textos que un autómata finito reconoce

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un patrón se construye con pocas piezas

Un patrón se hace con tres ideas. Poner un carácter detrás de otro: ab es una a y luego una b. Elegir entre dos opciones: a|b es una a o una b. Repetir: a* es cero o más veces la a.

Con esas tres ideas se puede escribir cualquier patrón regular. El resto son abreviaturas cómodas.

Los símbolos más usados de grep -E

SímboloSignificaEjemploEncaja con
.cualquier caráctera.cabc, a-c
[0-9]una cifra[0-9][0-9]07, 42
*cero o más vecesab*a, ab, abbb
+una o más vecesab+ab, abbb
?cero o una vezab?a, ab
{5}exactamente cinco veces[0-9]{5}28013
^ y $principio y final de la línea^a$solo la línea a

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Sin biblioteca: comprueba cinco cifras

Código: python
# Un reconocedor a mano: cinco cifras seguidas, como un código postal.
texto = "28013"
valido = len(texto) == 5
for letra in texto:
    if letra not in "0123456789":
        valido = False
print(texto, valido)
# Prueba con "2801", con "28a13" y con "280134".

grep -E busca las líneas que encajan

grep -E patrón lee líneas y escribe solo las que encajan con el patrón. La opción -E activa los símbolos de la tabla.

Sin anclas, basta con que el patrón aparezca en cualquier parte de la línea. Con ^ y $, la línea entera debe encajar. La opción -o escribe solo la parte que encajó, y -c solo cuenta las líneas.

Códigos postales de cinco cifras

Comando
printf '28013\n2801\n280134\nabcde\n08001\n' | grep -E '^[0-9]{5}$'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Extrae los teléfonos de un texto

Comando
echo 'tel 912345678 y 600111222' | grep -o -E '[0-9]{9}'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Líneas con a y luego b

Comando
printf 'aab\nab\nb\naaa\n' | grep -E '^a+b$'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Cuenta las líneas que encajan

Comando
printf 'ab\naabb\naab\n' | grep -c -E '^a{2}b{2}$'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una expresión regular no sabe contar sin límite

Un patrón puede decir «cinco cifras», porque cinco es un número fijo. No puede decir «las mismas a que b» para cualquier cantidad.

El patrón ^a*b*$ acepta aab, que tiene más a que b. Acepta también abb. Para contar hasta cualquier número haría falta recordar un número que crece, y un autómata finito solo recuerda su estado.

Un patrón que no compara cantidades

Comando
printf 'aab\nabb\nba\n' | grep -E '^a*b*$'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que a*b* significa «tantas a como b». No es así: cada estrella cuenta por su cuenta. Cualquier número de a seguido de cualquier número de b encaja. Para comparar cantidades hace falta otra herramienta, la gramática de la lección siguiente.

Para ir más lejos

Escribe un patrón de grep para una matrícula: cuatro cifras y tres letras mayúsculas. Pruébalo con printf y tres matrículas buenas y tres malas.

Después explica con tus palabras por qué ningún patrón regular distingue ab, aabb y aaabbb de aab.

Sobre este laboratorio y su código: Laboratorio de compiladores y arquitectura: gcc, flex, bison y RISC-V en una VM

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.