Módulo re de Python
de PythonreEl módulo es un módulo de la biblioteca estándar para manejar expresiones regulares.
Una expresión regular (Regular Expression, abreviada como regex o regexp) es una herramienta poderosa para hacer coincidir, buscar y manipular texto.
A través delremódulo, puedes usar expresiones regulares en Python para procesar cadenas.
¿Por qué usar el módulo re?
Al procesar texto, a menudo necesitamos buscar patrones específicos o reemplazar ciertos caracteres. Por ejemplo, validar direcciones de correo electrónico, extraer enlaces de páginas web o formatear texto. Escribir código manualmente para completar estas tareas puede ser muy tedioso, mientras que las expresiones regulares ofrecen una forma concisa y eficiente de resolver estos problemas.
Uso básico del módulo re
1. Importar el módulo re
Antes de usarreel módulo, primero debes importarlo:
import re
2. Funciones comunes del módulo re
2.1 re.match()
re.match()La función se utiliza para hacer coincidir la expresión regular desde el inicio de la cadena. Si la coincidencia es exitosa, devuelve un objeto de coincidencia; de lo contrario, devuelveNone。
Ejemplo
pattern = r"hello"
text = "hello world"
match = re.match(pattern, text)
if match:
print("Coincidencia exitosa:", match.group())
else:
print("Coincidencia fallida")
Salida:
匹配成功: hello
2.2 re.search()
re.search()La función se utiliza para buscar la primera coincidencia de la expresión regular en la cadena. En comparación conre.match()diferente,re.search()no requiere que la coincidencia comience desde el inicio de la cadena.
Ejemplo
pattern = r"world"
text = "hello world"
match = re.search(pattern, text)
if match:
print("Coincidencia exitosa:", match.group())
else:
print("Coincidencia fallida")
Salida:
匹配成功: world
2.3 re.findall()
re.findall()La función se utiliza para buscar todas las subcadenas que coinciden con la expresión regular en la cadena y devuelve una lista.
Ejemplo
pattern = r"\d+"
text = "There are 3 apples and 5 oranges."
matches = re.findall(pattern, text)
print("Números encontrados:", matches)
Salida:
找到的数字: ['3', '5']
2.4 re.sub()
re.sub()La función se utiliza para reemplazar las partes de la cadena que coinciden con la expresión regular.
Ejemplo
pattern = r"apple"
text = "I have an apple."
new_text = re.sub(pattern, "banana", text)
print("Texto después del reemplazo:", new_text)
Salida:
替换后的文本: I have an banana.
Sintaxis básica de las expresiones regulares
1. Caracteres normales
Los caracteres normales (como letras, números) coinciden directamente consigo mismos.
Ejemplo
pattern = r"cat"
text = "The cat is on the mat."
match = re.search(pattern, text)
if match:
print("Coincidencia exitosa:", match.group())
Salida:
匹配成功: cat
2. Caracteres especiales
En las expresiones regulares hay algunos caracteres especiales que tienen significados especiales. Por ejemplo:
.: coincide con cualquier carácter individual (excepto el salto de línea).*: coincide con el carácter anterior cero o más veces.+: coincide con el carácter anterior una o más veces.?: coincide con el carácter anterior cero o una vez.\d: coincide con cualquier dígito (equivalente a[0-9])。\w: coincide con cualquier letra, dígito o guion bajo (equivalente a[a-zA-Z0-9_])。
Ejemplo
pattern = r"\d+"
text = "The price is 100 dollars."
match = re.search(pattern, text)
if match:
print("Coincidencia exitosa:", match.group())
Salida:
匹配成功: 100
3. Conjuntos de caracteres
Un conjunto de caracteres se utiliza para coincidir con cualquiera de un grupo de caracteres. Por ejemplo,[abc]coincide cona、boc。
Ejemplo
pattern = r"[aeiou]"
text = "Hello World!"
matches = re.findall(pattern, text)
print("Vocales encontradas:", matches)
Salida:
找到的元音字母: ['e', 'o', 'o']
4. Grupos
Los grupos te permiten combinar varios caracteres y operar sobre ellos. Por ejemplo,(abc)coincide conabc。
Ejemplo
pattern = r"(ab)+"
text = "ababab"
match = re.search(pattern, text)
if match:
print("Coincidencia exitosa:", match.group())
Salida:
匹配成功: ababab
Ejercicios prácticos
Ejercicio 1: Validar una dirección de correo electrónico
Escribe una expresión regular para validar el formato de una dirección de correo electrónico.
Ejemplo
pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
email = "[email protected]"
if re.match(pattern, email):
print("Dirección de correo electrónico válida")
else:
print("Dirección de correo electrónico inválida")
Ejercicio 2: Extraer números de teléfono
Escribe una expresión regular para extraer números de teléfono de un texto.
Ejemplo
pattern = r"\d{3}-\d{3}-\d{4}"
text = "My phone number is 123-456-7890."
match = re.search(pattern, text)
if match:
print("Números de teléfono encontrados:", match.group())
1. Funciones principales
| Método | Descripción | Ejemplo |
|---|---|---|
re.compile(pattern) |
Precompilar la expresión regular (mejora el rendimiento de reutilización) | pat = re.compile(r'\d+') |
re.search(pattern, string) |
Busca la primera coincidencia en la cadena | re.search(r'\d+', 'a1b2')→ coincide'1' |
re.match(pattern, string) |
Coincide desde el inicio de la cadena | re.match(r'\d+', '123a')→ coincide'123' |
re.fullmatch(pattern, string) |
Coincide con toda la cadena | re.fullmatch(r'\d+', '123')→ coincide'123' |
re.findall(pattern, string) |
Devuelve una lista de todas las coincidencias no superpuestas | re.findall(r'\d+', 'a1b22c') → ['1', '22'] |
re.finditer(pattern, string) |
Devuelve un iterador de todas las coincidencias (incluye información de posición) | for m in re.finditer(r'\d+', 'a1b2'): print(m.group()) |
re.sub(pattern, repl, string) |
Reemplaza las coincidencias | re.sub(r'\d+', 'X', 'a1b2') → 'aXbX' |
re.split(pattern, string) |
Divide la cadena según las coincidencias | re.split(r'\d+', 'a1b2c') → ['a', 'b', 'c'] |
re.escape() |
Escapa caracteres especiales | re.escape("C:\\Users\\test.txt")
|
re.purge() |
Limpia la caché | re.purge()
|
2. Objeto de coincidencia (Match) métodos/atributos
| Método/Atributo | Descripción | Ejemplo |
|---|---|---|
group() |
Devuelve la cadena completa de la coincidencia | m.group() → 'abc' |
group(n) |
Devuelve el contenido del grupo de captura n | m = re.search(r'(\d)(\d)', '12'); m.group(1) → '1' |
groups() |
Devuelve una tupla con todos los grupos de captura | m.groups() → ('1', '2') |
start()/end() |
Posición de inicio/fin de la coincidencia | m.start() → 0 |
span() |
Devuelve el rango de la coincidencia(start, end) |
m.span() → (0, 2) |
3. Metacaracteres de expresiones regulares (parcial)
| Metacaracter | Descripción | Ejemplo de coincidencia |
|---|---|---|
. |
Coincide con cualquier carácter (excepto salto de línea) | a.c → 'abc' |
\d |
Coincide con un dígito | \d+ → '123' |
\D |
Coincide con un no dígito | \D+ → 'abc' |
\w |
Coincide con un carácter de palabra (letra, dígito, guion bajo) | \w+ → 'Ab_1' |
\W |
Coincide con un carácter que no es de palabra | \W+ → '!@#' |
\s |
Coincide con un carácter de espacio en blanco (espacio, tabulador, etc.) | \s+ → ' \t' |
\S |
Coincide con un carácter que no es espacio en blanco | \S+ → 'abc' |
[] |
Conjunto de caracteres | [A-Za-z]→ cualquier letra |
^ |
Coincide con el inicio de la cadena | ^\d+→ dígito al inicio |
$ |
Coincide con el final de la cadena | \d+$→ dígito al final |
* |
Coincide con el carácter anterior 0 o más veces | a* → '', 'aaa' |
+ |
Coincide con el carácter anterior 1 o más veces | a+ → 'a', 'aaa' |
? |
Coincide con el carácter anterior 0 o 1 vez | a? → '', 'a' |
{m,n} |
Coincide con el carácter anterior de m a n veces | a{2,3} → 'aa', 'aaa' |
| |
Operación "o" | cat|dog → 'cat'o'dog' |
() |
Grupo de captura | (\d+)→ extraer dígitos |
4. Banderas de compilación (flagsparámetros)
| Bandera | Descripción | Ejemplo |
|---|---|---|
re.IGNORECASE (re.I) |
Ignorar mayúsculas y minúsculas | re.search(r'abc', 'ABC', re.I) |
re.MULTILINE (re.M) |
Modo multilínea (afecta a^y$) |
re.findall(r'^\d+', '1\n2', re.M) → ['1', '2'] |
re.DOTALL (re.S) |
Dejar.Coincide con todos los caracteres, incluidos los saltos de línea |
re.search(r'a.*b', 'a\nb', re.S) |
re.ASCII |
Dejar\w, \Wetc. coinciden solo con caracteres ASCII |
re.search(r'\w+', 'こん', re.ASCII)→ sin coincidencia |
re.VERBOSE (re.X) |
Permite agregar comentarios y espacios en la expresión regular | re.compile(r'''\d+ # 匹配数字''', re.X) |
Ejemplo
1. Extraer direcciones de correo electrónico
Ejemplo
text = "Contact: [email protected], [email protected]"
emails = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', text)
print(emails) # Salida: ['[email protected]', '[email protected]']
2. Reemplazar formato de fecha
Ejemplo
new_str = re.sub(r'(\d{2})-(\d{2})-(\d{4})', r'\3año\1mes\2día', date_str)
print(new_str) # Salida: "Hoy es 15 de mayo de 2023"
3. Coincidencia con múltiples condiciones
Ejemplo
^(?P<username>\w+) # Nombre de usuario
:(?P<password>\S+) # Contraseña
@(?P<domain>\w+\.\w+) # Dominio
$''', re.VERBOSE)
m = pattern.match("john:[email protected]")
if m:
print(m.groupdict()) # Salida: {'username': 'john', 'password': 'pass123', 'domain': 'example.com'}
4. Dividir cadenas complejas
Ejemplo
parts = re.split(r'\d+', text)
print(parts) # Salida: ['Apple', 'Banana', 'Cherry', 'Date']
Notas
-
Cadena sin procesar: se recomienda usar cadenas sin procesar para las expresiones regulares (
r'\d'), para evitar conflictos de caracteres de escape. -
Coincidencia codiciosa: la coincidencia codiciosa es la predeterminada (por ejemplo,
.*coincidirá con la longitud máxima posible), se necesita usar.*?para implementar la coincidencia no codiciosa. -
Optimización de rendimiento: las expresiones regulares de uso frecuente deben priorizar el uso de
re.compile()precompilación. -
Problema de retroceso: las expresiones regulares complejas pueden causar problemas de rendimiento (como cuantificadores anidados
(a+)+)。