Coletânea Python do ZERO às Redes Neurais Artificiais
Metacaracteres Quantificadores
Entendida a lógica dos metacaracteres de substituição, podemos dar mais
um passo, agora entendendo das expressões regulares os chamados metacaracteres quantificadores.
Anteriormente vimos que por meio de r’Strings podemos manipular o
conteúdo de uma string de forma mais completa se comparado com as ferramentas nativas padrão do Python.
Porém todo exemplo usado até o momento era considerando uma string de gramática correta, mas na realidade boa parte do uso de expressões regulares serão para manipular strings levando em consideração os vícios de linguagem do usuário.
Uma boa prática de programação é tentar prever os erros que possam ser cometidos pelo usuário e tratar essas exceções evitando que o programa pare de funcionar.
Tratando-se de strings a lógica não é muito diferente disso, uma vez que boa parte dos textos gerados são com expressões, gírias, abreviações ou até mesmo erros de gramática, e tudo isso deve ser levado em consideração.
Partindo para o exemplo, note que temos uma variável de nome
mensagem onde atribuída para si tem uma string composta de uma frase de linguagem usual, não formal, pois existem vícios de linguagem como ‘Nããããããããããããooooooo’.
Tentando usar dos conceitos entendidos até o momento, ao tentarmos
buscar a string ‘não’ em mensagem por meio da expressão regular convencional, o retorno será um pouco diferente do esperado.
O grande problema neste caso é que existe uma interpretação literal por parte do interpretador, em outras palavras, ele buscará por padrão exatamente a string ‘não’ em sua forma padrão de caracteres e ordem de declaração dos mesmos.
Para contornar este tipo de problema, uma possibilidade que temos é de,
fazendo o uso de metacaracteres quantificadores, dizer para nosso interpretador que um ou mais caracteres naquela string podem se repetir, devendo serem lidos e não ignorados.
Complementar a nossos metacaracteres “ . “ e “ | “, agora teremos mais 4
metacaracteres que nos permitirão tratar elementos repetidos em uma string.
Basicamente, o metacaractere “ * “ significa que um determinado
elemento da string pode se repetir 0 ou um número ilimitado de vezes. Da mesma forma, o metacaractere “ + “ significa que um certo elemento se repetirá 1 ou ilimitadas vezes.
Um pouco diferente dos anteriores, o metacaractere “ ? “ significa que
um determinado elemento se repetirá 0 ou 1 vez na string.
Por fim o metacaractere “ {} “ significa que um elemento específico da
string se repetirá dentro de um intervalo definido.
Diferente dos metacaracteres convencionais que ocupavam a posição
exata do elemento a ser alterado, tratando-se dos metacaracteres quantificadores, os mesmos devem estar à frente do caractere em questão.
Vamos para prática para que tais conceitos fiquem melhor entendidos.
Trabalhando em cima da string de nossa variável mensagem, como visto
anteriormente, no primeiro print( ) usando da expressão regular convencional, o interpretador apenas fez a leitura de ‘não’, ignorando ‘Nãããããããããooooooo’ completamente.
Agora usando de expressões regulares quantificadoras, podemos mostrar
a nosso interpretador que para tal r’String existem caracteres repetidos a serem lidos.
Na linha 5, temos uma função print( ) parametrizada com a função
findall( ) de re, que por sua vez recebe uma r’String.
Repare que aqui é declarada a string Nã+o, que em outras palavras significa que para o caractere “ã” podem haver a repetição desse caractere 1 vez ou um número ilimitado de vezes.
Repare que no retorno obtido, solucionamos o problema de todos
caracteres “ã” repetidos na string, porém, conforme o exemplo, o caractere “o” também possui repetições e foi ignorado.
Isto se dá porque cara metacaractere quantificador deve estar a frente do respectivo caractere em questão. Em nosso exemplo, via “ + “ nosso interpretador buscou corretamente todas repetições de “ã+”.
Sendo assim, note que na linha 6 temos exatamente a mesma linha de
código, porém, fazendo uso de dois metacaracteres “ + “, um para cada caractere com possíveis repetições.
O resultado, como esperado, é finalmente toda a string
‘Nãããããããããooooooo’, porém, de acordo com nossa string, temos duas palavras “não”, e até o momento tratamos da que estava escrita de forma usual.
Aprimorando um pouco mais nosso tratamento de string, na linha 7
especificamos que para o primeiro caractere de “não” pode haver um conjunto de elementos, nesse caso, sabemos que as únicas possibilidades são [Nn].
Logo, colocamos este metacaractere incorporado na string na sua posição correta.
Eis que nosso interpretador finalmente encontrou as duas palavras “não”,
para que possamos manipular as mesmas conforme a necessidade.
Apenas finalizando nossa linha de raciocínio, neste caso, onde
estávamos a buscar uma palavra simples “não”, sabíamos que as únicas possibilidades de diferenciação era quanto ao uso de caractere inicial maiúsculo ou minúsculo “n”, sendo assim, poderíamos realizar o mesmo feito por meio de flags como já visto anteriormente.
Como esperado, os retornos referentes as linhas 7 e 8 são exatamente os
mesmos.
Apenas como um adendo, importante salientar que não existem
restrições quanto aos tipos e número de metacaracteres usados dentro de uma expressão regular, mas temos de tomar cuidade e prezar pela legibilidade de nosso código sempre.
Repare nesse exemplo, inicialmente criamos uma variável de nome
chamando_nome que recebe uma string como atributo.
Buscando a string via expressão regular e metacaracteres, note a
quantidade de metacaracteres usados na r’String, exageros como esse comprometem a legibilidade do código.
Neste exemplo, existem tantos metacaracteres que fica difícil até mesmo ler que em meio a eles existe a string ‘fernando’. Sendo assim, devemos prezar por fazer o uso de metacaracteres conforme realmente necessário.