Solución al Ejercicio: Expandir abreviaturas
📋 Copiar código
import re
def expandir_abreviaturas_es(texto, abreviaturas):
"""
Expande abreviaturas en español, manteniendo la capitalización y puntuación.
"""
def expandir_palabra(palabra):
# Separa la palabra de signos de puntuación (al final, como ".", ",", etc.)
match = re.match(r"(\W*)(\w[\w\.]*)(\W*)", palabra)
if not match:
return palabra # Si no coincide el patrón, devolver la palabra tal cual
prefijo, palabra_central, sufijo = match.groups()
palabra_base = palabra_central.rstrip(".").lower() # Quitar punto final para buscar en el diccionario
if palabra_base in abreviaturas:
expansion = abreviaturas[palabra_base]
# Mantener capitalización
if palabra_central.isupper():
expansion = expansion.upper()
elif palabra_central.istitle():
expansion = expansion.capitalize()
elif palabra_central.islower():
expansion = expansion.lower()
# En otros casos (como mezcla rara), se deja como está la expansión
return f"{prefijo}{expansion}{sufijo}"
else:
return palabra
palabras = texto.split()
resultado = [expandir_palabra(palabra) for palabra in palabras]
return " ".join(resultado)
# Ejemplos de uso en español
abreviaturas_es = {"etc": "etcétera", "ud": "usted", "dra": "doctora", "pág": "página"}
texto_es1 = "Por favor, revise la PÁG. 5, Ud. verá los detalles, etc."
print(f"'{texto_es1}' expandido: '{expandir_abreviaturas_es(texto_es1, abreviaturas_es)}'")
texto_es2 = "La Dra. López es muy amable."
print(f"'{texto_es2}' expandido: '{expandir_abreviaturas_es(texto_es2, abreviaturas_es)}'")
texto_es3 = "Necesitamos más información, ETC."
print(f"'{texto_es3}' expandido: '{expandir_abreviaturas_es(texto_es3, abreviaturas_es)}'")
texto_es4 = "Sin abreviaturas conocidas aquí."
print(f"'{texto_es4}' expandido: '{expandir_abreviaturas_es(texto_es4, abreviaturas_es)}'")
abreviaturas_es2 = {"sr": "señor"}
texto_es5 = "El Sr. Pérez llegó."
print(f"'{texto_es5}' expandido: '{expandir_abreviaturas_es(texto_es5, abreviaturas_es2)}'")
abreviaturas_es3 = {"a.m.": "ante meridiem", "p.m.": "post meridiem"}
texto_es6 = "La cita es a las 9:00 a.m."
print(f"'{texto_es6}' expandido: '{expandir_abreviaturas_es(texto_es6, abreviaturas_es3)}'")
texto_es7 = "Llegaremos a las 2:30 P.M."
print(f"'{texto_es7}' expandido: '{expandir_abreviaturas_es(texto_es7, abreviaturas_es3)}'")
texto_es8 = "El Ud. es amable."
print(f"'{texto_es8}' expandido: '{expandir_abreviaturas_es(texto_es8, abreviaturas_es)}'")
texto_es9 = "la DRA. hablaba."
print(f"'{texto_es9}' expandido: '{expandir_abreviaturas_es(texto_es9, abreviaturas_es)}'")
Explicación del Código:
Importa el módulo re
:
Esto permite el uso de expresiones regulares para un manejo más flexible de las
palabras.
Función expandir_abreviatura(palabra)
:
- Separación de puntuación:
Utiliza
re.match(r"(\W*)(\w[\w\.]*)(\W*)", palabra)
para
separar cualquier carácter no alfanumérico al principio (prefijo
),
la parte central de la palabra (que puede contener letras y puntos,
palabra_central
), y cualquier carácter no alfanumérico al final (sufijo
).
Esto es crucial para no perder la puntuación como comas, puntos finales,
etc.
- Extracción de la palabra base:
palabra_base = palabra_central.rstrip(".").lower()
extrae la
parte central de la palabra, elimina cualquier punto final (para una
búsqueda más precisa en el diccionario) y la convierte a minúsculas para la
búsqueda insensible a mayúsculas.
- Verificación en el diccionario:
if palabra_base in abreviaturas:
comprueba si la forma base de
la palabra está en el diccionario de abreviaturas.
- Mantenimiento de la capitalización:
if palabra_central.isupper():
expansion = expansion.upper()
: Si la abreviatura original estaba
en mayúsculas, la expansión se convierte a mayúsculas.
elif palabra_central.istitle():
expansion = expansion.capitalize()
: Si la abreviatura original
tenía formato de título, la expansión se capitaliza (primera letra en
mayúscula).
elif palabra_central.islower():
expansion = expansion.lower()
: Si la abreviatura original estaba
en minúsculas, la expansión se convierte a minúsculas.
- Manejo de otros casos:
Si la capitalización no coincide con ninguno de los casos anteriores
(por ejemplo, una mezcla extraña), la expansión se deja tal cual.
- Reconstrucción de la palabra:
return f"{prefijo}{expansion}{sufijo}"
vuelve a unir el
prefijo, la expansión (con la capitalización correcta) y el sufijo.
- Retorno de la palabra original:
else: return palabra
Si la palabra base no está en el
diccionario, se devuelve la palabra original sin cambios.
Función
expandir_abreviaturas_es(texto, abreviaturas)
:
- Divide el texto en palabras usando
texto.split()
.
- Aplica la función
expandir_palabra
a cada palabra de la lista utilizando una comprensión de lista.
- Vuelve a unir las palabras expandidas en una
cadena con espacios.
📋 Copiar código