Expresion regular
Es posible que esté familiarizado con la búsqueda de texto pulsando CTRL-F e introduciendo las palabras que busca. Las expresiones regulares van un paso más allá: permiten especificar un patrón de texto para buscar. Puede que no conozcas el número de teléfono exacto de una empresa, pero si vives en Estados Unidos o Canadá, sabes que tendrá tres dígitos, seguidos de un guión, y luego cuatro dígitos más (y opcionalmente, un código de área de tres dígitos al principio). Así es como usted, como humano, reconoce un número de teléfono cuando lo ve: 415-555-1234 es un número de teléfono, pero 4.155.551.234 no lo es.
También reconocemos todo tipo de patrones de texto a diario: las direcciones de correo electrónico tienen símbolos @ en el centro, los números de la seguridad social de EE.UU. tienen nueve dígitos y dos guiones, las URL de los sitios web suelen tener puntos y barras inclinadas, los titulares de las noticias utilizan mayúsculas y minúsculas, los hashtags de las redes sociales comienzan con # y no contienen espacios, y mucho más.
Las expresiones regulares son útiles, pero pocos no programadores las conocen, a pesar de que la mayoría de los editores de texto y procesadores de texto modernos, como Microsoft Word u OpenOffice, disponen de funciones de búsqueda y búsqueda y sustitución que permiten realizar búsquedas basadas en expresiones regulares. Las expresiones regulares ahorran mucho tiempo, no sólo a los usuarios de software, sino también a los programadores. De hecho, el escritor técnico Cory Doctorow afirma que deberíamos enseñar las expresiones regulares incluso antes de programar:
Conocer [las expresiones regulares] puede significar la diferencia entre resolver un problema en 3 pasos y resolverlo en 3.000 pasos. Cuando eres un empollón, te olvidas de que los problemas que resuelves con un par de pulsaciones pueden llevar a otras personas días de trabajo tedioso y propenso a errores.
En esta categoria, empezarás escribiendo un programa para encontrar patrones de texto sin usar expresiones regulares y luego verás cómo usar expresiones regulares para hacer el código mucho menos hinchado. Te mostraré las coincidencias básicas con expresiones regulares y luego pasaré a algunas funciones más potentes, como la sustitución de cadenas y la creación de tus propias clases de caracteres. Por último, al final del capítulo, escribirás un programa que puede extraer automáticamente números de teléfono y direcciones de correo electrónico de un bloque de texto.
La mayoría de los ejemplos de esta categoria requerirán el módulo re
, así que recuerda importarlo al principio de cualquier script que escribas. De lo contrario, obtendrás un mensaje de error NameError: name 're' is not defined
.
Caracteres
Metacaracteres
Los metacaracteres son caracteres con un significado especial:
Carácter | Descripción | Ejemplo |
---|---|---|
[] | Un conjunto de caracteres | «[a-m]» |
\ | Señala una secuencia especial (también puede utilizarse para escapar de caracteres especiales) | «\d» |
. | Cualquier carácter (excepto el carácter de nueva línea) | «he..o» |
^ | Comienza con | «^hola» |
$ | Termina con | «world$» |
? | Cero o una ocurrencias | «https?» |
* | Cero o más ocurrencias | «.*» |
+ | Una o más ocurrencias | «www+» |
{} | Exactamente el número especificado de ocurrencias | «www{3}» |
| | Cualquiera de los dos o | «cae|está» |
() | Captura y agrupación |
Secuencias especiales
Una secuencia especial es una \N seguida de uno de los caracteres de la lista siguiente, y tiene un significado especial:
Carácter | Descripción | Ejemplo |
---|---|---|
\A | Devuelve una coincidencia si los caracteres especificados están al principio de la cadena | «\AThe» |
\b | Devuelve una coincidencia si los caracteres especificados están al principio o al final de una palabra (la «r» del principio asegura que la cadena se trata como una «cadena cruda») | r»\bain» r»ain\b» |
\B | Devuelve una coincidencia cuando los caracteres especificados están presentes, pero NO al principio (o al final) de una palabra (la «r» del principio asegura que la cadena se trata como una «cadena sin procesar») | r»\Bain» r»ain\B» |
\d | Devuelve una coincidencia cuando la cadena contiene dígitos (números del 0 al 9) | «\d» |
\D | Devuelve una coincidencia en la que la cadena NO contiene dígitos | «\D» |
\s | Devuelve una coincidencia en la que la cadena contiene un carácter de espacio en blanco | «\s» |
\S | Devuelve una coincidencia en la que la cadena NO contiene un carácter de espacio en blanco | «\S» |
\w | Devuelve una coincidencia en la que la cadena contiene cualquier carácter de palabra (caracteres de la a a la Z, dígitos del 0 al 9 y el carácter de subrayado _) | «\w» |
\W | Devuelve una coincidencia si la cadena NO contiene ningún carácter de palabra | «\W» |
\Z | Devuelve una coincidencia si los caracteres especificados están al final de la cadena | «rro\Z» |
Conjuntos
Un conjunto es un conjunto de caracteres dentro de un par de corchetes [] con un significado especial:
Carácter | Descripción |
---|---|
[arn] | Devuelve una coincidencia cuando uno de los caracteres especificados (a, r o n) está presente |
[a-n] | Devuelve una coincidencia para cualquier carácter en minúscula, alfabéticamente entre a y n |
[^arn] | Devuelve una coincidencia para cualquier carácter EXCEPTO a, r y n |
[0123] | Devuelve una coincidencia cuando está presente cualquiera de los dígitos especificados (0, 1, 2 o 3) |
[0-9] | Devuelve una coincidencia para cualquier dígito entre 0 y 9 |
[0-5][0-9] | Devuelve una coincidencia para cualquier número de dos dígitos entre 00 y 59 |
[a-zA-Z] | Devuelve una coincidencia para cualquier carácter alfabético entre la a y la z, en minúsculas O en mayúsculas |
[+] | En los conjuntos, +, *, ., |, (), $,{} no tiene ningún significado especial, por lo que [+] significa: devuelve una coincidencia para cualquier carácter + de la cadena |