.
Solución al Ejercicio: Extraer clave-valor
📋 Copiar código
import re
def extraer_clave_valor(texto):
"""
Extrae información de clave-valor de un texto donde cada par está en
la forma "clave: valor".
Args:
texto: La cadena de texto de entrada (puede contener múltiples líneas).
Returns:
Un diccionario con las claves y valores extraídos.
"""
datos = {}
for linea in texto.strip().split('\n'):
coincidencia = re.match(r'^\s*([^:]+):\s*(.+?)\s*$', linea)
if coincidencia:
clave = coincidencia.group(1).strip()
valor = coincidencia.group(2).strip()
datos[clave] = valor
return datos
# Ejemplos de uso
texto1 = """
nombre: Juan Pérez
edad: 30
ciudad: Madrid
profesión: ingeniero
"""
resultado1 = extraer_clave_valor(texto1)
print(f"Datos extraídos:\n{resultado1}")
texto2 = """
idioma: español
version: 1.0
autor: IA
"""
resultado2 = extraer_clave_valor(texto2)
print(f"\nDatos extraídos:\n{resultado2}")
texto3 = """
clave_simple: valor_simple
otra_clave: otro valor
# línea comentada
sin_formato
"""
resultado3 = extraer_clave_valor(texto3)
print(f"\nDatos extraídos:\n{resultado3}")
texto4 = "unica_clave: unico_valor"
resultado4 = extraer_clave_valor(texto4)
print(f"\nDatos extraídos:\n{resultado4}")
texto5 = ""
resultado5 = extraer_clave_valor(texto5)
print(f"\nDatos extraídos:\n{resultado5}")
Explicación del Código:
-
import re
:
- Importa el módulo
re
para
trabajar con expresiones regulares.
-
def extraer_clave_valor(texto):
:
- Define una función llamada
extraer_clave_valor
que toma una cadena de texto (texto
)
como entrada.
-
datos = {}
:
- Inicializa un diccionario vacío
datos
para almacenar las claves y valores extraídos.
-
for linea in texto.strip().split('\n'):
:
- Procesa cada línea del texto:
texto.strip()
: Elimina
cualquier espacio en blanco al principio o al final del texto.
.split('\n')
: Divide el
texto en una lista de líneas, utilizando el carácter de nueva línea
como delimitador.
-
coincidencia =
re.match(r'^\s*([^:]+):\s*(.+?)\s*$', linea)
:
- Intenta hacer coincidir la línea con el
patrón de clave-valor usando
re.match()
(que busca una
coincidencia al principio de la cadena):
^
: Coincide con el
inicio de la línea.
\s*
: Coincide con cero
o más espacios en blanco.
([^:]+)
: Coincide con
uno o más caracteres que no sean dos puntos (:
) y los
captura en el primer grupo (la clave).
:
: Coincide con el
carácter de dos puntos literal.
\s*
: Coincide con cero
o más espacios en blanco después de los dos puntos.
(.+?)
: Coincide con
uno o más caracteres (cualquiera) de forma no codiciosa (?
)
y los captura en el segundo grupo (el valor). La no codicia asegura
que coincida hasta el siguiente espacio en blanco antes del final de
la línea.
\s*
: Coincide con cero
o más espacios en blanco al final del valor.
$
: Coincide con el
final de la línea.
-
if coincidencia:
:
- Si la línea coincide con el patrón de
clave-valor.
-
clave = coincidencia.group(1).strip()
:
- Extrae el texto capturado en el primer
grupo (la clave) y elimina cualquier espacio en blanco al principio o al
final.
-
valor = coincidencia.group(2).strip()
:
- Extrae el texto capturado en el segundo
grupo (el valor) y elimina cualquier espacio en blanco al principio o al
final.
-
datos[clave] = valor
:
- Agrega la clave y el valor al
diccionario
datos
.
-
return datos
:
- Devuelve el diccionario con los pares
clave-valor extraídos.
Ejemplos de Uso:
Los ejemplos muestran cómo la función procesa
cadenas de texto con diferentes formatos (múltiples líneas, una sola línea,
líneas sin formato) y extrae los pares clave-valor que cumplen con el patrón
esperado. Las líneas que no siguen el formato son ignoradas.