Curso-lenguaje-python/python-total/dia_09/06_modulo_re.py
Manuel Vergara f4e9797c4b Restructure content and add notes from HolaMundo
Signed-off-by: Manuel Vergara <manuel@vergaracarmona.es>
2023-05-20 09:36:26 +02:00

223 lines
5.0 KiB
Python

"""
Módulo re
Expresiones regulares
Operadores especiales:
[ ] un set de caracteres
. un carácter cualquiera
^ inicia con
$ finaliza con
| operador lógico "O"
Cuantificadores:
* cero o más ocurrencias: 0 - n
+ una o más ocurrencias: 1 - n
? cero o una ocurrencia: 0 - 1
{ } un número especificado de ocurrencias
{n} se repite n veces
{n,m} se repite de n a m veces
{n, } se repite de n veces hacia arriba
Carácteres especiales:
\d dígito numérico
\D NO numérico
\w caracter alfanumérico
\W NO alfanumérico
\s espacio en blanco
\S NO espacio en blanco
"""
import re
# Buscar este patrón: ### - #### - ####
# De diferentes formas:
patron1 = r'\d\d\d-\d\d\d-\d\d\d\d'
patron2 = r'\d{3}-\d{3}-\d{4}'
# Si no existe dirá: Node
verificacion01 = re.search(patron1, '234-233-l23l')
# Si existe dirá que tiene match:
# <re.Match object; span=(0, 12), match='234-233-1231'>
verificacion02 = re.search(patron1, '234-233-1231')
print(
f'La verificación 1 es {verificacion01}\nLa verificación 2 es {verificacion02}')
print()
# Usando un texto
texto = 'Si necesitas ayuda llama al (658)-598-9977 las 24 horas al servicio de ayuda online'
palabra = 'ayuda' in texto
print(f'Es {palabra} que la palabra ayuda está en el texto')
# Con expresión regular
patron03 = 'ayuda'
# Busqueda es un objeto regular expresión
# en concreto search
busqueda01 = re.search(patron03, texto)
# con lo cual, tiene módulos
# span indica la ubicación
print(busqueda01.span())
# start indica la ubicación del inicio
print(busqueda01.start())
# end indica la ubicación del final
print(busqueda01.end())
print()
# Objeto findall
# Mete en una lista cada vez que aparece el patron
busqueda02 = re.findall(patron03, texto)
print(busqueda02)
# Podemos ver el número de veces con len
print(len(busqueda02))
print()
# Podemos iterar la búsqueda
# con el módulo finiter para
# tener información de cada resultado encontrado
for hallazgo in re.finditer(patron03, texto):
print(hallazgo.span())
print()
# Vamos a buscar el número de teléfono del texto
# se puede escapar los paréntesis para que los búsque
# y agrupar con parétesis
patron04 = r'\((\d{3})\)-(\d{3})-(\d{4})'
busqueda03 = re.search(patron04, texto)
# Podemos mostrar el resultado mostrando los grupos
print(busqueda03.group())
# y como además los hemos encerrado en paréntesis
# podemos llamar a cada uno de los grupos
print(busqueda03.group(2))
# Podemos controlar la entrada del usuario
# ⚠️ Cuidao: Este método no sirve para verificar contraseñas
# por ejemplo:
#
print("""
Introduce una clave con las condiciones:
- Empezar con una letra
- En total 8 carácteres
""")
clave = input('> ')
patron05 = r'\D{1}\w{7}'
chequear = re.search(patron05, clave)
print(chequear)
print()
# Operadores especiales
# or
buscarunouotro = re.search(r'online|offline', texto)
print(buscarunouotro.group())
print()
# Comodin en un espacio con punto
comodin01 = re.search(r'...vicio', texto)
print(comodin01.group())
print()
# Comodin inicio con ^
# Por ejemplo, que el primer caracter no sea un dígito
comodin02 = re.search(r'^\D', texto)
print(comodin02.group())
print()
# Comodin final con $
# Por ejemplo, que el último caracter sea un dígito
comodin03 = re.search(r'\d$', texto)
print(comodin03)
print()
# Comodin de un set de caracteres con [^]
# Por ejemplo, todos los que incluyan un carácter vacío
comodin04 = re.findall(r'[^\S]', texto)
print(f'El texto contiene {len(comodin04)} espacios en blanco')
print()
# Comodin de un set de caracteres con [^+]
# Ahora, además, va a agrupar los que no son
# espacios vacíos en strings dentro de la lista
# Seleciona cada inicio con caracter hasta que
# encuentra otro espacio en blanco.
comodin05 = re.findall(r'[^\s]+', texto)
print(comodin05)
# Con esto y join podemos unir de nuevo el texto pero
# sustituyendo con guiones, por ejemplo.
# Puede servir para corregir nombres de ficheros o directorios.
print('-'.join(comodin05))
# EJERCICIOS
print()
# Verificar si es un mail
def verificar_email(email):
""" Verificar sin es un mail .com """
patron = r'[\w]*@[\w]*\.com[\w]*'
verificacion = re.search(patron, email)
if verificacion:
print("Ok. Es un mail")
else:
print("La dirección de email es incorrecta")
verificar_email("email@mail.com")
print()
# Verificar saludo
def verificar_saludo(frase):
""" Verificar si saluda con Hola """
patron = r'^Hola'
verificacion = re.search(patron, frase)
if verificacion:
print("Ok. Este mensaje tiene saludo al inicio")
else:
print("No has saludado")
verificar_saludo("Hola, que tal?")
print()
# Verificar Código postal.
# Dos caracteres alfanuméricos
# y cuatro numéricos a continuación
# (ejemplo: XX1234)
def verificar_cp(cp):
""" Verificar si saluda con Hola """
patron = r'^\w{2}\d{4}$'
verificacion = re.search(patron, cp)
if verificacion:
print("Ok. Es un código postal")
else:
print("El código postal ingresado no es correcto")
verificar_cp("XX1234")