Python
La biblioteca estándar
Regex - re
básico

Expresiones regulares de Python (módulo re): match, search, sub, findall, replace, examples

Este post es una explicación fácil de entender del módulo re, un módulo de expresiones regulares para Python. El mejor tutorial es siempre la documentación oficial de Python. Este artículo te ayudará a empezar, y luego puedes leer la documentación oficial para hacerte una idea de lo que está pasando. ¡Empecemos!

1. ¿Qué es una expresión regular?

Las expresiones regulares, comúnmente conocidas como Regex, o re en coreano, son una forma de definir patrones de búsqueda utilizando un conjunto de símbolos. Las expresiones regulares te permiten manipular y encontrar patrones de texto de forma muy flexible y rápida, convirtiéndolas en una poderosa herramienta que todo programador debería tener en su arsenal.

El módulo incorporado de Python re proporciona una forma potente y eficiente de trabajar con expresiones regulares. Como es un módulo incorporado, no necesitas instalarlo, puedes usarlo import como se muestra a continuación.

import re

2. Lista de símbolos de expresiones regulares

Python regex tiene la forma r"[regex_pattern] con una cadena sin procesar. Por ejemplo, para encontrar todas las cadenas que empiecen por los caracteres "python", puedes usar el patrón regex r"^python".

Estos son los símbolos regex básicos que utilizamos para definir patrones de expresiones regulares. Los he dividido en varias categorías para que sean más fáciles de recordar.

  • .: significa cualquier carácter (excepto nueva línea).

2.1.El principio y el final de una cadena (anclas de frontera)

  • ^: denota el principio de una cadena.
  • $: significa el final de una cadena.

2.2. Recuentos de cadenas (cuantificadores)

  • ?: significa ningún o un carácter precedente.
  • *: Ningún carácter precedente o uno o más caracteres precedentes.
  • +: significa uno o más caracteres precedentes.
  • {n}: significa que el carácter precedente aparece exactamente n veces.
  • {n,}: significa que el carácter precedente aparece más de n veces.
  • {n,m}: significa que el carácter precedente aparece entre n y m veces.

2.3. Formato de cadena (clases y conjuntos de caracteres)

  • \d: significa todos los números.
  • \D: significa todos los caracteres excepto números.
  • \S: significa todos los espacios creados por space, \t, \n, \r, \f, \v.
  • \S: significa sin espacio.
  • \W: significa todos los alfabetos y números, _.
  • \W: Significa todos los alfabetos, números y todos los caracteres excepto _.
  • .: Significa todos los caracteres excepto \n.
  • []: Todos los caracteres encerrados entre corchetes.

2.4. Operadores lógicos

  • (abc): Se trata de un operador de grupo, es decir, el grupo de caracteres encerrados entre llaves aparece tal cual.
  • [^abc]: Es un operador de conjunto, es decir, aparecen todos los caracteres que no estén entre llaves.
  • (A|B): Operador OR, que significa que aparecerá A o B.

3. funciones básicas del módulo re

El módulo re de Python proporciona una serie de funciones para trabajar con expresiones regulares. A continuación se enumeran las funciones más utilizadas.

Los patrones de uso de las funciones se ilustran con los ejemplos de la Sección 4.

  • re.match(): Comprueba si un patrón de expresión regular al principio de una cadena coincide.
import re
 
pattern = r"Hello"
text = "Hello, World!"
 
match = re.match(pattern, text)
if match:
    print("Match found!")
else:
    print("No match found.")
 
# Output: Match found!
  • re.search(): Comprueba si toda la cadena coincide con el patrón de expresión regular.
import re
 
pattern = r"World"
text = "Hello, World!"
 
search = re.search(pattern, text)
if search:
    print("Match found!")
else:
    print("No match found.")
 
# Output: Match found!
  • re.findall(): Devuelve todos los patrones de expresión regular no solapados en una cadena como una lista de cadenas.
import re
 
pattern = r"\d+"
text = "I have 3 apples and 5 oranges."
 
matches = re.findall(pattern, text)
print(matches)
 
# Output: ['3', '5']
  • re.finditer(): Devuelve un iterador que coincide con todos los patrones de expresión regular no solapados en una cadena.
import re
 
pattern = r"\d+"
text = "I have 3 apples and 5 oranges."
 
matches_iter = re.finditer(pattern, text)
for match in matches_iter:
    print(match.group(), end=" ")
 
# Output: 3 5
  • re.sub(): Sustituye todas las apariciones del patrón de expresión regular en una cadena por la cadena de sustitución especificada.
import re
 
pattern = r"apple"
text = "I have an apple. It is a delicious apple."
 
new_text = re.sub(pattern, "orange", text)
print(new_text)
 
# Output: I have an orange. It is a delicious orange.
  • re.split(): Divide una cadena en función del número de apariciones de un patrón de expresión regular.
import re
 
pattern = r"\s+"
text = "Hello   World!   How are you?"
 
substrings = re.split(pattern, text)
print(substrings)
 
# Output: ['Hello', 'World!', 'How', 'are', 'you?']

4. ejemplos de funciones del módulo re

Ahora que las funciones del módulo re son familiares, veamos algunos ejemplos prácticos de su uso:

Ejemplo 1: Encontrar todas las direcciones de correo electrónico en un texto

Supongamos que tienes un texto que contiene varias direcciones de correo electrónico y quieres extraerlas todas. He aquí cómo hacerlo usando la función re.findall():

import re
 
text = "Contact us at info@example.com or support@example.org for any inquiries."
email_pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
emails = re.findall(email_pattern, text)
 
print(emails)  # Output: ['info@example.com', 'support@example.org']

Ejemplo 2: Reemplazar URLs en texto con una cadena de sustitución

Supongamos que tienes un texto que contiene varias URLs y quieres reemplazarlas por una cadena de sustitución, como [URL]. Puede utilizar la función re.sub() para esta tarea:

import re
 
text = "Visit our website at https://example.com and check our blog at https://blog.example.com."
url_pattern = r"https?://[^\s]+"
replaced_text = re.sub(url_pattern, "[URL]", text)
 
print(replaced_text)  # Output: Visit our website at [URL] and check our blog at [URL].

Ejemplo 3: Extraer números de teléfono de diferentes formatos

Vamos a extraer números de teléfono de diferentes formatos de texto utilizando la función re.finditer().

import re
 
text = "Call John at (123) 456-7890 or reach Jane at 987-654-3210 for more information."
phone_pattern = r"\(?\d{3}\)?[-\s]?\d{3}[-\s]?\d{4}"
phone_numbers = [match.group() for match in re.finditer(phone_pattern, text)]
 
print(phone_numbers)  # Output: ['(123) 456-7890', '987-654-3210']

Ejemplo 4: Validar una contraseña

En este ejemplo, comprobaremos si la contraseña introducida por el usuario cumple los siguientes criterios: al menos una letra mayúscula, al menos una letra minúscula, al menos un número, y al menos ocho caracteres en total. Utilizaremos re.search() para esta tarea.

import re
 
def is_valid_password(password):
    if len(password) < 8:
        return False
    if not re.search(r"[A-Z]", password):
        return False
    if not re.search(r"[a-z]", password):
        return False
    if not re.search(r"\d", password):
        return False
    return True
 
password = "P4ssw0rd!"
print(is_valid_password(password))  # Output: True

Ejemplo 5: Dividir una cadena en base a múltiples símbolos

En este ejemplo, utilizaremos la función re.split() para dividir una cadena basándonos en múltiples delimitadores (coma, punto y coma, pipa):

import re
 
text = "apple,banana;orange|grape"
delimiter_pattern = r"[,;|]"
fruits = re.split(delimiter_pattern, text)
 
print(fruits)  # Output: ['apple', 'banana', 'orange', 'grape']

5. Ir un paso más allá

Más allá de la sintaxis y las funciones básicas de regex, hay otros temas que merece la pena explorar con regex.

  • Aserciones lookahead y lookbehind: Cómo registrar patrones adicionales a un patrón de expresión regular dado.
  • Conjuntos con nombre y referencias retrospectivas: Cómo utilizar técnicas similares a las jerarquías y variables en expresiones regulares.
  • Grupos no capturables: Una técnica que utiliza grupos para buscar patrones, pero ignora sus valores.

También aprenderás otras técnicas útiles como la búsqueda sin distinción entre mayúsculas y minúsculas, el modo multilínea, etc.

6. Consejos para usar el módulo re

He aquí algunos consejos y trucos para facilitar el trabajo con expresiones regulares:

  • Utilice cadenas sin formato (r"") en sus patrones de expresiones regulares para evitar tener que escapar barras invertidas. Usar barras invertidas para expresiones regulares en Python requiere escaparlas, pero con cadenas raw no es necesario.
  • Regex101 es una práctica herramienta en línea para probar y depurar patrones de expresiones regulares. Una vez que le cojas el truco, la usarás todo el tiempo.
  • Crear un patrón regex complejo es difícil de leer y de manejar; dividirlo en unidades más pequeñas y manejables lo hace más legible y mantenible.
  • Utilice los comentarios y el modo verbose (re.VERBOSE) para hacer que los patrones de expresiones regulares sean más fáciles de entender. Puede usarse junto con re.compile() para añadir comentarios verbose.

7. Reflexiones finales

Las expresiones regulares son una poderosa herramienta para la manipulación de texto y la concordancia de patrones en Python. Familiarizándote con el módulo re y entendiendo la sintaxis básica de las expresiones regulares, puedes manejar fácilmente una gran variedad de tareas textuales.

copyright for Python re basics

© 2023 All rights reserved.