RegEx en Python: cómo funcionan las expresiones regulares en el popular lenguaje de programación

Las expresiones regulares, abreviado RegEx, se pueden utilizar en Python después de importar el paquete incorporado “re” para buscar ciertos patrones dentro de cadenas de caracteres.

¿Qué son exactamente las RegEx en Python?

RegEx hace referencia a las expresiones regulares. Son cadenas de caracteres que definen patrones de búsqueda específicos. Pueden usarse para comprobar strings de Python en busca de estos patrones. Las RegEx de Python siguen su propia sintaxis y semántica.

Nota

Las expresiones regulares pertenecen a un constructo de programación más avanzada tratada en detalle por algunos tutoriales de Python. Si te interesan otros temas avanzados de programación en Python, estos artículos pueden ayudarte:

Áreas de aplicación de las RegEx de Python

Las expresiones regulares se utilizan a menudo para examinar las entradas de los usuarios de un programa en busca de un formato específico.

Un ejemplo bien conocido de esto, que seguramente te resulte familiar, es crear una contraseña que debe contener al menos una letra mayúscula y un dígito. Las RegEx de Python se pueden utilizar para comprobar que lo escrito por el usuario cumple la regla.

Las expresiones regulares también se utilizan con frecuencia al rellenar formularios web para comprobar la validez de las entradas de los usuarios. Por ejemplo, se puede evaluar si una dirección de correo electrónico introducida tiene un formato válido.

Consejo

Si estás trabajando con Python para un proyecto web, las expresiones regulares te ayudarán de muchas formas. También es útil Deploy Now de IONOS, que te permite construir e implementar tus proyectos web directamente a través de GitHub.

Sintaxis y semántica de las RegEx en Python

Los llamados metacaracteres se utilizan dentro de las expresiones regulares. Son caracteres que tienen un significado específico dentro de las RegEx de Python. Puedes encontrar los metacaracteres más importantes, incluyendo su significado y un ejemplo, en la siguiente tabla:

Carácter Descripción Ejemplo
. Representa cualquier carácter excepto nueva línea “ho.a” -> busca todas las cadenas que terminen en “ho” seguido de un carácter cualquiera seguido de “a”, por ejemplo “hola”
[] Busca todas las letras especificadas entre los corchetes “[a-e]” -> busca todas las letras minúsculas entre a y e
^ Comprueba si la cadena empieza por un carácter o cadena especificados “^hola” -> comprueba si la cadena empieza por “hola”
$ Comprueba si la cadena termina con un carácter o cadena especificados “$mundo” -> comprueba si la cadena termina con “mundo”
* Cero o más apariciones de un carácter “a*” -> comprueba si la “a” aparece varias veces o ninguna
+ Una o varias apariciones de un carácter “a+” -> comprueba si la “a” aparece como mínimo una vez
? Una o ninguna aparición de un carácter “a?” -> comprueba si la “a” aparece una vez o ninguna
{} Comprueba si un carácter aparece tantas veces como se especifica en las llaves “sil{2}a” -> coincide con la cadena “silla”

Sets

Los sets son muy importantes para la mayoría de los RegEx en Python, por lo que merece la pena prestarles atención. Los sets son los patrones RegEx que comienzan y terminan con un corchete. Ya has visto un ejemplo de un set que encuentra todas las letras minúsculas entre “a” y “e” en la tabla anterior. Abajo te ofrecemos una vista general de los usos comunes de los sets en las RegEx de Python.

Set Descripción
[abc] Comprueba si uno de los caracteres especificados entre los corchetes (es decir, a, b o c) aparece dentro de una cadena.
[^abc] Comprueba todos los caracteres no especificados entre los corchetes
[a-z] Comprueba todas las letras minúsculas entre “a” y “z”
[a-zA-Z] Comprueba todas las letras comprendidas entre la “a” y la “z”, independientemente de que sean mayúsculas o minúsculas
[0-9] Comprueba cualquier número entre 0 y 9
[1-5][0-9] Comprueba todos los números de dos cifras entre 10 y 59

Como puedes ver, los sets son una potente herramienta para diversas expresiones regulares. Al utilizar sets, sin embargo, es importante tener en cuenta que los metacaracteres presentados anteriormente no tienen ningún significado específico dentro de los corchetes. Así, el set [*] coincidiría con todos los * de una cadena dada.

Secuencias

Además de los metacaracteres presentados, con las RegEx de Python puedes hacer uso de secuencias especiales y ya predefinidas para crear patrones de búsqueda precisos.

Secuencia Descripción Ejemplo
\A Comprueba si la cadena especificada se encuentra al principio de una cadena “\Alunes”
  • Coincide con “Lunes, martes y miércoles”.
  • No coincide con “Hoy es lunes”.
\b Comprueba si la cadena especificada se encuentra al principio o al final de una palabra “\bes”
  • Coincide con “Me gusta el estudio”.
  • Coincide con “Esencias de la India”.
  • No coincide con “La mesa del comedor”. “es\b”
  • Coincide con “Lunes”.
  • Coincide con “Los girasoles amarillos”.
  • No coincide con “Festival”.
\B Comprueba si la cadena especificada no se encuentra al principio o al final de una palabra; lo contrario de \b “\Bes”
  • No coincide con “Esencias de la India”.
  • No coincide con “Me gusta el estudio”.
  • Coincide con “Festival”. “es\B”
  • No coincide con “Lunes”.
  • No coincide con “Los girasoles amarillos”.
  • Coincide con “Festival”.
\d Comprueba los dígitos coincidentes entre 0 y 9; equivalente a [0-9] “123”
  • \d busca tres coincidencias para 1, 2 y 3
\D Comprueba todos los caracteres que no sean dígitos; equivalente a [^0-9] “123acb&”
  • \D busca cuatro coincidencias para a, c, b y &
\s Comprueba si la cadena contiene un carácter de espacio “Python RegEx”
  • \s coincide, ya que hay un espacio
\S Comprueba que la cadena no contenga espacios; lo contrario de \s “Python RegEx”
  • \S no coincide, ya que hay un espacio
\w Comprueba todos los caracteres alfanuméricos “1abc$%3”
  • \w busca cuatro coincidencias para 1, a, b, c y 3
\W Comprueba todos los caracteres excepto los alfanuméricos; lo contrario de \w “1abc$%3”
  • \W busca dos coincidencias para $ y %
\Z Comprueba si la cadena de caracteres especificada está al final de una cadena “Python\Z”
  • Coincide con “RegEx in Python”
  • No coincide con “Python RegEx”

Funciones para el uso de las RegEx en Python

Si quieres utilizar RegEx en Python, hay una serie de funciones predefinidas que te ayudarán. Todas estas funciones se encuentran en un módulo de Python llamado “re”, el cual tendrás que importar antes de trabajar con expresiones regulares:

import re
Python

re.findall()

Probablemente la función más importante cuando se trabaja con RegEx de Python es la función findall(). Toma un patrón de búsqueda y una cadena Python y devuelve una lista Python consistente en cadenas que contienen todas las coincidencias en el orden en que fueron encontradas. Si no se encuentra ninguna coincidencia, la llamada a findall() devuelve una lista vacía.

Un ejemplo de código que ayuda a mostrar la función:

import re
string = "python 3.0"
regex = "\D"
resultado = re.findall(regex, string)
print(resultado)
Python

En el fragmento de código anterior, el módulo re se importa primero como se muestra. La cadena “python 3.0” se almacena en la variable “string”. El patrón de búsqueda que se almacena en la variable llamada “regex” ya se conoce de la tabla de secuencias y coincide con todos los caracteres que no sean dígitos. Esta búsqueda se realiza con la función findall(), que toma como parámetros de paso el patrón de búsqueda y la cadena a examinar. La lista devuelta por la función se almacena en la variable llamada “resultado” y se muestra en pantalla con una llamada a Python print. El resultado es el siguiente:

['p', 'y', 't', 'h', 'o', 'n', ' ', '.']

La lista contiene todos los caracteres de la cadena excepto los dígitos. Debe tenerse en cuenta que el carácter de espacio también cuenta como carácter independiente y, por tanto, aparece dentro de la lista.

re.sub()

La función sub() sobrescribe todas las coincidencias con un texto de tu elección. Al igual que findall(), la función toma una expresión regular como primer parámetro. Debes pasar el texto con el que deseas sustituir las coincidencias como segundo parámetro de paso. El tercer parámetro de paso de la función es la cadena a buscar. Si no deseas sobrescribir todas las coincidencias, sino solo algunas, puedes especificar un número como cuarto parámetro de paso, que indica cuántas coincidencias deben reemplazarse, empezando por la primera.

Este ejemplo de código también te ayudará a visualizar cómo funciona:

import re
string = "python es un lenguaje estupendo"
regex = "\s"
resultado1 = re.sub(regex, "0", string)
print(resultado1)
resultado2 = re.sub(regex, "0", string, 2)
print(resultado2)
Python

De nuevo, primero se importa re y luego se almacena una cadena de caracteres en la variable “string”. Ya conoces el patrón de búsqueda que se va a aplicar: comprueba todos los espacios de una cadena.

A esto le siguen dos llamadas similares a sub(): la primera llamada a la función sustituye todos los espacios de la cadena por un 0 y almacena el resultado en la variable “resultado1”. La segunda llamada a la función limita el número de espacios con el cuarto parámetro de paso opcional. Por lo tanto, sustituye los dos primeros espacios de la cadena por un 0 y, a continuación, almacena el resultado en la variable “resultado2”.

El resultado del código anterior es, por tanto, el siguiente:

'python0es0un0lenguaje0estupendo'
'python0es0un lenguaje estupendo'

re.split()

La función split() del módulo re recuerda a un Python split en la forma en que funciona, como su nombre indica. También divide una cadena de caracteres en una lista. Aquí, la cadena se interrumpe después de cada coincidencia con una expresión regular. Por lo tanto, no sorprende que la función espere un patrón de búsqueda como primer parámetro y la cadena a dividir como segundo parámetro. Si quieres dividir una cadena solo un número limitado de veces, puedes incluir un número como tercer parámetro opcional. Este determina el número máximo de splits. De nuevo, este ejemplo te ayudará a entenderlo:

import re
string = "python es un lenguaje estupendo"
regex = "\s"
resultado1 = re.split(regex, string)
print(resultado1)
resultado2 = re.split(regex, string, 1)
print(resultado2)
Python

La mayor parte del código ya te resultará familiar del ejemplo anterior. Lo único que ha cambiado es la llamada a la función split(). En primer lugar, se llama a la función split() sobre la cadena y se supone que la divide cada vez que aparece un espacio. La lista resultante se asigna a la variable “resultado1”. La segunda llamada a split() limita el número de divisiones a 1 especificando el tercer parámetro opcional y asigna el resultado a la variable llamada “resultado2”. Cuando se ejecuta el programa, devuelve el siguiente resultado:

['python', 'es', 'un', 'lenguaje', 'estupendo']
['python', 'es un lenguaje estupendo]

re.search()

Como su nombre indica, la función search() busca una coincidencia en una cadena. Para ello, primero toma la expresión regular y la cadena a examinar como segundo parámetro. Devuelve un objeto Python coincidente que siempre se refiere a la primera coincidencia encontrada. Si no se encuentra ninguna coincidencia, la función devuelve el valor “None”. Una vez más, un ejemplo ayuda a aclarar cómo funciona la función:

import re
string = "python es un lenguaje estupendo"
regex = "\s"
match = re.search(regex, string)
if match:
	print("RegEx ha sido encontrado.")
else:
	print("RegEx no ha sido encontrado.")
Python

La función search() se llama con una expresión regular que busca espacios y una cadena. El objeto coincidente devuelto por la llamada a la función se almacena en la variable llamada “match”. La siguiente sentencia if else de Python es para fines ilustrativos: si se ha encontrado una coincidencia, el objeto match no está vacío y se elige la ruta if. El programa dará el siguiente resultado:

'RegEx ha sido encontrado.'

El objeto coincidente

El objeto coincidente es devuelto por una llamada a search() y contiene información sobre las coincidencias encontradas del patrón de búsqueda. Puedes acceder a esta información con varias funciones:

  • objekt.start() devuelve el índice del primer carácter de la cadena Python que corresponde al patrón de búsqueda.
  • objekt.end() devuelve el índice del ultimo carácter, de forma análoga a start().
  • objekt.span() combina start() y end(): la función devuelve una Python tuple que contiene el primer y el ultimo índice de la subcadena.
  • objekt.string devuelve la cadena examinada.
  • objekt.re devuelve el RegEx de Python pasado a search().

Todas estas funciones pueden ilustrarse añadiendo llamadas a funciones adecuadas al último ejemplo de código:

import re
string = "python es un lenguaje estupendo"
regex = "\s"
match = re.search(regex, string)
if match:
	print("RegEx ha sido encontrado.")
else:
	print("RegEx no ha sido encontrado.")
print(match.start())
print(match.end())
print(match.span())
print(match.string)
print(match.re())
Python

El resultado del programa es el siguiente:

'RegEx ha sido encontrado.'
6
7
(6, 7)
'python es un lenguaje estupendo '
re.compile('\\s')

En primer lugar, se muestra “RegEx ha sido encontrado” porque el objeto de coincidencia no está vacío y, por tanto, se aplica la condición if. A continuación, se muestra el índice de la primera coincidencia. Como el primer espacio en blanco tiene el índice “6”, el valor es de esperar. Lo mismo ocurre con el valor “7”, que se obtiene como resultado de llamar a la función end(). La tupla “(6,7)” unifica la llamada a start() y end() dando ambos índices a la vez. El resultado de la cadena pasada al objeto coincidente también es de esperar.

Pero ¿qué pasa con el resultado “re.compile(’\s’)”? Se trata de un objeto RegEx de Python. Se crea cuando la cadena que has pasado como expresión regular se procesa como tal. Como puedes ver, puedes visualizar el objeto RegEx a través del objeto coincidente.