Curso Avançado de Desenvolvimento Python
Capítulo
>
Nível
Módulos de Strings e Tempo
Módulo Regex
Objetivo
Verificar e organizar arquivos referentes a empregados e alocações de zoneamento utilizando expressões regulares.
Nos escritórios vizinhos há uma documentação que precisa ser atualizada a respeito dos funcionários que iniciarão suas atividades na nova área agrícola e do zoneamento para onde as plantações e o gado serão cuidados. Gerenciar arquivos pode ser bastante complicado, especialmente ao lidar com grandes volumes de texto. Para esse propósito, usaremos o módulo re, que é a abreviação de Expressões Regulares, também conhecido como Regex. Podemos acessar suas funções utilizando import re. Para os propósitos deste nível, utilizaremos as seguintes funções:
re.findall(): Retorna uma lista de todas as ocorrências de uma string. Recebe dois (2) argumentos, o primeiro é quais caracteres você está procurando em uma string, o segundo é a string na qual fazer a busca.re.sub(): Substitui a ocorrência indicada por uma determinada string. Recebe três (3) argumentos, o primeiro é quais caracteres você gostaria de substituir, o segundo é pelo que você deseja substituir e o terceiro é a string na qual realizar a busca.re.search(): Localiza a posição de algo em uma string, retorna um objeto. Recebe dois (2) argumentos, os caracteres que você está buscando e a string em que está realizando a busca. Você pode utilizar outras funções com o objeto retornado, comospan(), que retorna um vetor com as posições inicial e final do item buscado no texto.re.split(): Divide a string em uma lista em intervalos especificados. Recebe dois (2) argumentos, o primeiro é o critério pelo qual dividir a string e o segundo é a string que você deseja dividir.re.match(): Verifica se uma string contém um determinado valor no início da string. Isso funciona como uma versão simplificada da funçãore.search(), mas é mais eficiente e verifica se a string que você está buscando possui a consulta no início.
O módulo re também pode utilizar sequências especiais, há códigos que podem ser usados com as funções do re que permitem englobar uma variedade de propriedades das strings. Há uma longa lista de sequências especiais, mas para este nível utilizaremos as seguintes:
\B: Verifica se os caracteres especificados estão na string, mas não localizados no início ou fim de uma palavra.\D: Retorna caracteres que não são dígitos de 0 a 9
Se um r estiver presente com uma sequência especial, isso significa que está verificando a string bruta (raw string).
Comece caminhando até a marca X dourada e virando-se para a mesa com o memorando. Use a função read() para verificar o memorando, que contém um manifesto de todos os funcionários. Cada nome contém # que delimita o número de identificação do funcionário, a string contendo os nomes também está armazenada em uma constante chamada manifest.
Crie uma lista chamada tags e armazene o valor de re.findall(), usado para procurar todos os # na constante manifest, assim: tags = re.findall("#", manifest). Crie uma variável chamada number e utilize len() com a lista tags para contar quantos itens estão na lista; isso nos informará quantos funcionários constam no manifesto. Use a função speak() com a variável number para anunciar quantos nomes estão na lista.
Em seguida, caminhe até a marca X clara próxima ao tapete azul e vire-se para a mesa utilizando a função read(). Aqui você encontrará uma lista de novos contratados com seus cargos atribuídos. Anote os nomes de cada profissão para que possa cruzá-los com as pessoas atualmente designadas. Caminhe até a marca X sobre o tapete azul e use read() novamente para verificar os cargos atualmente atribuídos.
A força de trabalho atual está armazenada em uma constante chamada assignments. Devemos atualizar este documento com as informações da lista de novos contratados. Substitua os nomes que estão diferentes na lista utilizando a função re.sub() para substituir uma parte da string por outra. Por exemplo, uma das edições é a seguinte:
assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)
O nome "Billy Hodgins" é substituído por "Carol Hopkins" no documento. Além dessa alteração, examine o documento e atualize este e mais um outro nome na lista, a fim de atualizar completamente o documento. Use a função write() com assignments para verificar os resultados.
Agora que cuidamos das listas de funcionários, é hora de passar para o zoneamento da fazenda. Caminhe até a marca X escura sobre o tapete vermelho e use a função read(); isso mostrará uma análise detalhada do zoneamento. Essas informações estão armazenadas em uma constante chamada zones.
É importante, em particular, identificar a localização de 6210 no documento, pois o zoneamento precisa ser reavaliado. Para fazer isso, precisamos usar a função re.search() para identificar a localização desse número de setor no zoneamento. Crie uma variável chamada index e armazene o objeto de busca, definindo a busca como r"6210\B". O que isso faz é: o r indica que está procurando uma string bruta, o 6210 é o setor que estamos procurando e o \B é o critério de sequência especial para a busca. Isso é realizado assim: index = re.search(r"6210\B", zones).
Agora que index contém um objeto de busca, é hora de extrair dados dele usando span(). Crie uma variável chamada vector e armazene a localização do objeto de busca, assim: vector = index.span(). Uma vez configurado, use a variável vector com a função write() já pré-escrita.
Em seguida, vamos trabalhar na identificação dos itens do zoneamento. Caminhe até a marca X escura sobre o tapete verde. Crie uma lista chamada sectors e use a função re.split() para consolidar todos os vários setores do zoneamento em uma lista. Na função split, utilize a sequência especial "\D" para extrair apenas os números das variáveis zones. Use uma list comprehension para remover quaisquer espaços vazios na lista, utilizando a função len() para remover itens que sejam pequenos demais para serem um número de setor. Assim:
sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]
Utilize a variável zones com a função write() para registrar todos os setores do zoneamento.
Caminhe até a marca X clara próxima ao tapete roxo e vire-se para o arquivo. Use a função read() para verificar os setores de prioridade no zoneamento da fazenda. Anote os setores, pois precisamos verificar se esses setores estão localizados na lista de zoneamento.
Caminhe até a marca X escura sobre o tapete roxo. Existem três (3) setores prioritários em variáveis chamadas: sector_a, sector_b, sector_c, já pré-escritas no editor de código. Insira os valores que você leu na marca X clara. Essas variáveis utilizam uma list comprehension que percorre todos os itens na lista sectors e os filtra através da função re.match(). Use as variáveis sector_a, sector_b, sector_c e insira-as na função write() já pré-escrita para completar o nível.