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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Expresión regular | un patrón que describe un conjunto de textos | |
| Literal | un carácter que encaja consigo mismo | a |
| Clase de caracteres | un grupo de caracteres entre corchetes | [0-9] |
| Cuantificador | dice cuántas veces se repite lo anterior | + |
| Ancla | fija el patrón al principio o al final de la línea | ^ y $ |
| Lenguaje regular | un 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ímbolo | Significa | Ejemplo | Encaja con |
|---|---|---|---|
| . | cualquier carácter | a.c | abc, a-c |
| [0-9] | una cifra | [0-9][0-9] | 07, 42 |
| * | cero o más veces | ab* | a, ab, abbb |
| + | una o más veces | ab+ | ab, abbb |
| ? | cero o una vez | ab? | 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
# 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
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
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
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
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
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.