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ácterDescripciónEjemplo
[]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ácterDescripciónEjemplo
\ADevuelve una coincidencia si los caracteres especificados están al principio de la cadena«\AThe»
\bDevuelve 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»
\BDevuelve 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»
\dDevuelve una coincidencia cuando la cadena contiene dígitos (números del 0 al 9)«\d»
\DDevuelve una coincidencia en la que la cadena NO contiene dígitos«\D»
\sDevuelve una coincidencia en la que la cadena contiene un carácter de espacio en blanco«\s»
\SDevuelve una coincidencia en la que la cadena NO contiene un carácter de espacio en blanco«\S»
\wDevuelve 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»
\WDevuelve una coincidencia si la cadena NO contiene ningún carácter de palabra«\W»
\ZDevuelve 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ácterDescripció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

Combinación de re.IGNORECASE, re.DOTALL y re.VERBOSE Sustitución de cadenas con el método sub() REGEX Comparación de mayúsculas y minúsculas REGEX El carácter punto . en las expresiones regulares Acento circunflejo ^ y de Dolar $ inicio y fin en la expresiones regulares El método findall() en las expresiones regulares Python Expresiones regulares codiciosa y no codiciosa Las llaves {} en las expresiones regulares en Python El signo de más + en expresiones regulares en Python Coincidencia de cero o más con el asterisco * expresiones regulares Uso del signo de interrogación ? en expresiones regulares Barra vertical | expresiones regulares Comparación grupos Expresiones regulares Agrupación con paréntesis Python Encontrar patrones en los textos usando expresiones regulares Búsqueda de texto sin usar expresiones regulares en Python