Coding for KidsCoding for Kids
Niveles CreativosDesafíosGuía del Maestro
Votar por funciones
Curso Avanzado de Desarrollo en Python
Capítulo
>
Nivel

Módulos de Cadenas y Tiempo
Módulo de Expresiones Regulares

Objetivo

Verificar y organizar archivos relacionados con empleados y asignaciones de zonas utilizando expresiones regulares.

En las oficinas vecinas hay documentación que necesita ser actualizada acerca de los empleados que inician su trabajo en la nueva tierra agrícola y la zonificación para el cuidado de cultivos y ganado. Gestionar archivos puede ser bastante complicado, especialmente cuando se manejan grandes volúmenes de texto. Para este propósito utilizaremos el módulo re, que es la abreviatura de Expresiones Regulares, también conocido como Regex. Podemos acceder a sus funciones utilizando import re, y para este nivel utilizaremos las siguientes funciones:

  • re.findall(): Retorna una lista de todas las ocurrencias de una cadena. Toma dos (2) argumentos, el primero es los caracteres que buscas en una cadena, el segundo es la cadena en la que buscar.
  • re.sub(): Reemplaza la ocurrencia indicada con una cierta cadena. Toma tres (3) argumentos, el primero es los caracteres que quieres reemplazar, el segundo es con qué deseas reemplazarlos y el tercero es la cadena en la que buscar.
  • re.search(): Encuentra la ubicación de algo en una cadena, retorna un objeto. Toma dos (2) argumentos, los caracteres que buscas y la cadena en la que buscas. Puedes usar otras funciones con el objeto que devuelve, como span(), que retorna un vector con las posiciones de inicio y fin del ítem buscado en el texto.
  • re.split(): Divide una cadena en una lista en intervalos especificados. Toma dos (2) argumentos, el primero es donde dividir la cadena y el segundo es la cadena que deseas dividir.
  • re.match(): Verifica si una cadena contiene cierto valor al inicio de la cadena. Funciona como una versión simplificada de la función re.search() pero es más eficiente y revisa si la cadena en la que buscas tiene la consulta al inicio.

El módulo re también puede utilizar secuencias especiales, hay códigos que puedes utilizar con las funciones de re que te permiten abarcar una variedad de propiedades de las cadenas. Existe una larga lista de secuencias especiales, pero para este nivel utilizaremos las siguientes:

  • \B: Verifica si los caracteres especificados están en la cadena pero no se encuentran al inicio o al final de una palabra.
  • \D: Retorna los caracteres que no son dígitos del 0 al 9

Si se coloca una r antes de una secuencia especial, significa que se está verificando la cadena en crudo (raw string).

Comienza caminando hacia la marca de X dorada y enfrentando la mesa con el memorando, usa la función read() para revisar el memorando que contiene un manifiesto de todos los empleados. Cada nombre contiene # que delimita su número de empleado, la cadena que contiene los nombres también está almacenada en una constante llamada manifest.

Crea una lista llamada tags y almacena el valor de re.findall(), utilizado para buscar todos los # en la constante manifest, de la siguiente manera: tags = re.findall("#", manifest). Crea una variable llamada number y usa len() con la lista tags para contar cuántos ítems hay en la lista, esto nos permitirá saber cuántos empleados están en el manifiesto. Utiliza la función speak() con la variable number para anunciar cuántos nombres hay en la lista.

A continuación, camina hacia la marca de X luminosa junto a la alfombra azul, enfrenta el escritorio y usa la función read(). Aquí tendrás una lista de nuevos empleados con sus puestos asignados. Toma nota de los nombres en cada profesión para poder contrastarlos con las personas asignadas actualmente. Camina hacia la marca de X sobre la alfombra azul y usa read() de nuevo para verificar los empleos asignados actualmente.

La fuerza laboral actual está almacenada en una constante llamada assignments, debemos actualizar este documento con la información de la lista de nuevos empleados. Reemplaza los nombres que sean diferentes en la lista utilizando la función re.sub() para sustituir una parte de la cadena por otra. Por ejemplo, una de las modificaciones es la siguiente:

assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)

El nombre "Billy Hodgins" es reemplazado por "Carol Hopkins" en el documento. Aparte de este cambio, revisa el documento y actualiza este y otro nombre en la lista para completar la actualización del documento. Usa la función write() con assignments para verificar los resultados.

Ahora que hemos atendido los registros de empleados, es momento de pasar a la zonificación de la granja. Camina hacia la marca de X oscura sobre la alfombra roja y usa la función read(), esto te mostrará una revisión detallada de la zonificación. Esta información está almacenada en una constante llamada zones.

Es importante, de particular relevancia, identificar la ubicación de 6210 en el documento ya que la zona necesita ser reevaluada. Para hacer esto, necesitamos usar la función re.search() para identificar la ubicación de ese número de sector en la zonificación. Crea una variable llamada index y almacena el objeto de búsqueda, configurando la búsqueda a r"6210\B". Lo que hace esto es: la r busca una cadena en crudo, el 6210 es el sector de zona que estamos buscando, y el \B es el criterio de secuencia especial para la búsqueda. Esto se realiza de la siguiente manera: index = re.search(r"6210\B", zones).

Ahora que index contiene un objeto de búsqueda, es momento de extraer datos de él utilizando span(). Crea una variable llamada vector y almacena la ubicación del objeto de búsqueda, de la siguiente manera: vector = index.span(). Una vez configurado, usa la variable vector con la función write() pre-escrita.

A continuación trabajaremos en identificar los elementos de la zonificación. Camina hacia la marca de X oscura sobre la alfombra verde. Crea una lista llamada sectors y usa la función re.split() para consolidar todos los distintos sectores de zonificación en una lista. En la función split, utiliza la secuencia especial "\D" para tomar solo los números de la variable zones. Utiliza una comprensión de lista para eliminar los espacios vacíos de la lista, empleando la función len() para eliminar ítems que sean demasiado pequeños para ser un número de sector. De la siguiente manera:

sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]

Utiliza la variable zones con las funciones write() para registrar todos los sectores de zonificación.

Camina hacia la marca de X luminosa junto a la alfombra morada y enfrenta el archivador, usa la función read() para verificar los sectores prioritarios en la zonificación de la granja. Toma nota de los sectores ya que necesitaremos verificar si estos sectores se encuentran en la lista de zonificación.

Camina hacia la marca de X oscura sobre la alfombra morada, hay tres (3) sectores prioritarios en variables llamadas: sector_a, sector_b, sector_c, pre-escritas en el editor de código, inserta los valores que leíste en la marca de X luminosa. Estas variables utilizan una comprensión de lista que recorre todos los ítems en la lista sectors y los filtra a través de la función re.match(). Utiliza las variables sector_a, sector_b, sector_c e insértalas en la función write() pre-escrita para completar el nivel.

Libro de Código