Solución al Ejercicio: Generar slug
📋 Copiar código
import re
def generar_slug(texto):
"""
Genera un slug a partir de una cadena de texto en español SIN importar unicodedata.
Args:
texto: La cadena de texto de entrada.
Returns:
La cadena en formato slug.
"""
# Mapeo de caracteres acentuados y 'ñ' a sus equivalentes sin acento
reemplazos_acentos = {
'á': 'a', 'é': 'e', 'í': 'i', 'ó': 'o', 'ú': 'u', 'ü': 'u', 'ñ': 'n',
'Á': 'A', 'É': 'E', 'Í': 'I', 'Ó': 'O', 'Ú': 'U', 'Ü': 'U', 'Ñ': 'N'
}
# Reemplazar caracteres acentuados
texto_sin_acentos = ''.join(reemplazos_acentos.get(c, c) for c in texto)
# Convertir a minúsculas
texto_lower = texto_sin_acentos.lower()
# Reemplazar espacios y otros caracteres no alfanuméricos con guiones
texto_slug = re.sub(r'[^\w\s-]', '', texto_lower).strip()
texto_slug = re.sub(r'[-\s]+', '-', texto_slug)
return texto_slug
# Ejemplos de uso
texto1 = "Hola Mundo Cruel"
resultado1 = generar_slug(texto1)
print(f"Slug de '{texto1}': '{resultado1}'")
texto2 = "Este es un Texto con Acentos y Ñ: áéíóúüñ"
resultado2 = generar_slug(texto2)
print(f"Slug de '{texto2}': '{resultado2}'")
texto3 = "Un título con ¡caracteres especiales!"
resultado3 = generar_slug(texto3)
print(f"Slug de '{texto3}': '{resultado3}'")
texto4 = " Espacios al principio y al final "
resultado4 = generar_slug(texto4)
print(f"Slug de '{texto4}': '{resultado4}'")
texto5 = "Múltiples espacios seguidos"
resultado5 = generar_slug(texto5)
print(f"Slug de '{texto5}': '{resultado5}'")
texto6 = ""
resultado6 = generar_slug(texto6)
print(f"Slug de '': '{resultado6}'")
Explicación del Código:
-
import re
:
re
: Se utiliza para trabajar
con expresiones regulares, que permiten realizar búsquedas y reemplazos
de patrones en la cadena de texto.
-
def generar_slug(texto):
:
- Define una función llamada
generar_slug
que toma una cadena de texto (texto
)
como entrada.
-
reemplazos_acentos = { ... }
:
- Se crea un diccionario llamado
reemplazos_acentos
.
- Este diccionario mapea las letras
acentuadas en español (minúsculas y mayúsculas) y la 'ñ' (minúscula y
mayúscula) a sus equivalentes sin acento o 'n'.
-
texto_sin_acentos = ''.join(reemplazos_acentos.get(c,
c) for c in texto)
:
- Reemplazar caracteres acentuados:
reemplazos_acentos.get(c, c)
:
Para cada carácter c
en el texto
, intenta
obtener su reemplazo del diccionario reemplazos_acentos
.
Si el carácter está en el diccionario, se obtiene el valor de
reemplazo; si no, se obtiene el carácter original.
''.join(...)
: Une todos
los caracteres resultantes en una nueva cadena llamada
texto_sin_acentos
, que ahora no contiene acentos ni la 'ñ'.
-
texto_lower =
texto_sin_acentos.lower()
:
- Convertir a minúsculas:
texto.lower()
: Convierte
toda la cadena texto_sin_acentos
a minúsculas para
asegurar que el slug resultante esté en minúsculas.
-
texto_slug = re.sub(r'[^\w\s-]',
'', texto_lower).strip()
:
- Reemplazar caracteres no
alfanuméricos:
re.sub(r'[^\w\s-]', '',
texto_lower)
: Utiliza una expresión regular para reemplazar
cualquier carácter que no sea una letra (\w
), un
espacio en blanco (\s
) o un guion (-
) con
una cadena vacía (eliminándolos).
.strip()
: Elimina
cualquier espacio en blanco al principio o al final de la cadena
resultante.
-
texto_slug = re.sub(r'[-\s]+',
'-', texto_slug)
:
- Reemplazar espacios con guiones:
re.sub(r'[-\s]+', '-',
texto_slug)
: Reemplaza una o más ocurrencias consecutivas de
guiones (-
) o espacios en blanco (\s
) con
un solo guion (-
).
-
return texto_slug
:
- Devuelve la cadena
texto_slug
,
que es la versión del texto original en formato slug.
Ejemplos de Uso:
Los ejemplos muestran cómo la función convierte
diferentes cadenas de texto en español a su formato slug, manejando acentos (a
través del diccionario de reemplazo), la 'ñ' (también a través del diccionario),
caracteres especiales (que son eliminados) y múltiples espacios (que son
reemplazados por un solo guion)