Data Science Academy - Python Fundamentos - Capítulo 14

Download: http://github.com/dsacademybr


In [1]:
# Versão da Linguagem Python
from platform import python_version
print('Versão da Linguagem Python Usada Neste Jupyter Notebook:', python_version())


Versão da Linguagem Python Usada Neste Jupyter Notebook: 3.7.6

Expressões Regulares

Uma expressão regular é um método formal de se especificar um padrão de texto.

Mais detalhadamente, é uma composição de símbolos, caracteres com funções especiais, que, agrupados entre si e com caracteres literais, formam uma sequência, uma expressão. Essa expressão é interpretada como uma regra, que indicará sucesso se uma entrada de dados qualquer casar com essa regra, ou seja, obedecer exatamente a todas as suas condições.


In [2]:
# Importando o módulo re (regular expression)
# Esse módulo fornece operações com expressões regulares (ER)
import re

In [3]:
# Lista de termos para busca
lista_pesquisa = ['informações', 'Negócios']

In [4]:
# Texto para o parse
texto = 'Existem muitos desafios para o Big Data. O primeiro deles é a coleta dos dados, pois fala-se aqui de '\
'enormes quantidades sendo geradas em uma taxa maior do que um servidor comum seria capaz de processar e armazenar. '\
'O segundo desafio é justamente o de processar essas informações. Com elas então distribuídas, a aplicação deve ser '\
'capaz de consumir partes das informações e gerar pequenas quantidades de dados processados, que serão calculados em '\
'conjunto depois para criar o resultado final. Outro desafio é a exibição dos resultados, de forma que as informações '\
'estejam disponíveis de forma clara para os tomadores de decisão.'

In [5]:
# Exemplo básico de Data Mining
for item in lista_pesquisa:
    print ('Buscando por "%s" em: \n\n"%s"' % (item, texto))
    
    # Verificando se o termo de pesquisa existe no texto
    if re.search(item,  texto):
        print ('\n')
        print ('Palavra encontrada. \n')
        print ('\n')
    else:
        print ('\n')
        print ('Palavra não encontrada.')
        print ('\n')


Buscando por "informações" em: 

"Existem muitos desafios para o Big Data. O primeiro deles é a coleta dos dados, pois fala-se aqui de enormes quantidades sendo geradas em uma taxa maior do que um servidor comum seria capaz de processar e armazenar. O segundo desafio é justamente o de processar essas informações. Com elas então distribuídas, a aplicação deve ser capaz de consumir partes das informações e gerar pequenas quantidades de dados processados, que serão calculados em conjunto depois para criar o resultado final. Outro desafio é a exibição dos resultados, de forma que as informações estejam disponíveis de forma clara para os tomadores de decisão."


Palavra encontrada. 



Buscando por "Negócios" em: 

"Existem muitos desafios para o Big Data. O primeiro deles é a coleta dos dados, pois fala-se aqui de enormes quantidades sendo geradas em uma taxa maior do que um servidor comum seria capaz de processar e armazenar. O segundo desafio é justamente o de processar essas informações. Com elas então distribuídas, a aplicação deve ser capaz de consumir partes das informações e gerar pequenas quantidades de dados processados, que serão calculados em conjunto depois para criar o resultado final. Outro desafio é a exibição dos resultados, de forma que as informações estejam disponíveis de forma clara para os tomadores de decisão."


Palavra não encontrada.



In [6]:
# Termo usado para dividir uma string
split_term = '@'

In [7]:
frase = 'Qual o domínio de alguém com o e-mail: aluno@gmail.com'

In [8]:
# Dividindo a frase
re.split(split_term, frase)


Out[8]:
['Qual o domínio de alguém com o e-mail: aluno', 'gmail.com']

In [9]:
def encontra_padrao(lista, frase):
    
    for item in lista:
        print ('Pesquisando na frase: %r' %item)
        print (re.findall(item, frase))
        print ('\n')

In [10]:
frase_padrao = 'zLzL..zzzLLL...zLLLzLLL...LzLz...dzzzzz...zLLLL'

lista_padroes = [ 'zL*',       # z seguido de zero ou mais L
                  'zL+',       # z seguido por um ou mais L
                  'zL?',       # z seguido por zero ou um L
                  'zL{3}',     # z seguido por três L
                  'zL{2,3}',   # z seguido por dois a três L
                ]

In [11]:
encontra_padrao(lista_padroes, frase_padrao)


Pesquisando na frase: 'zL*'
['zL', 'zL', 'z', 'z', 'zLLL', 'zLLL', 'zLLL', 'zL', 'z', 'z', 'z', 'z', 'z', 'z', 'zLLLL']


Pesquisando na frase: 'zL+'
['zL', 'zL', 'zLLL', 'zLLL', 'zLLL', 'zL', 'zLLLL']


Pesquisando na frase: 'zL?'
['zL', 'zL', 'z', 'z', 'zL', 'zL', 'zL', 'zL', 'z', 'z', 'z', 'z', 'z', 'z', 'zL']


Pesquisando na frase: 'zL{3}'
['zLLL', 'zLLL', 'zLLL', 'zLLL']


Pesquisando na frase: 'zL{2,3}'
['zLLL', 'zLLL', 'zLLL', 'zLLL']



In [12]:
frase = 'Esta é uma string com pontuação. Isso pode ser um problema quando fazemos mineração de dados em busca '\
        'de padrões! Não seria melhor retirar os sinais ao fim de cada frase?'

In [13]:
# A expressão [^!.? ] verifica por valores que não sejam pontuação 
# (!, ., ?) e o sinal de adição (+) verifica se o item aparece pelo menos 
# uma vez. Traduzindo: esta expressão diz: traga apenas as palavras na 
# frase.
re.findall('[^!.? ]+', frase)


Out[13]:
['Esta',
 'é',
 'uma',
 'string',
 'com',
 'pontuação',
 'Isso',
 'pode',
 'ser',
 'um',
 'problema',
 'quando',
 'fazemos',
 'mineração',
 'de',
 'dados',
 'em',
 'busca',
 'de',
 'padrões',
 'Não',
 'seria',
 'melhor',
 'retirar',
 'os',
 'sinais',
 'ao',
 'fim',
 'de',
 'cada',
 'frase']

In [14]:
frase = 'Esta é uma frase de exemplo. Vamos verificar quais padrões serão encontrados.'

lista_padroes = [ '[a-z]+',      # sequência de letras minúsculas
                  '[A-Z]+',      # sequência de letras maiúsculas
                  '[a-zA-Z]+',   # sequência de letras minúsculas e maiúsculas
                  '[A-Z][a-z]+'] # uma letra maiúscula, seguida de uma letra minúscula

In [15]:
encontra_padrao(lista_padroes, frase)


Pesquisando na frase: '[a-z]+'
['sta', 'uma', 'frase', 'de', 'exemplo', 'amos', 'verificar', 'quais', 'padr', 'es', 'ser', 'o', 'encontrados']


Pesquisando na frase: '[A-Z]+'
['E', 'V']


Pesquisando na frase: '[a-zA-Z]+'
['Esta', 'uma', 'frase', 'de', 'exemplo', 'Vamos', 'verificar', 'quais', 'padr', 'es', 'ser', 'o', 'encontrados']


Pesquisando na frase: '[A-Z][a-z]+'
['Esta', 'Vamos']


Escape Codes

É possível usar códigos específicos para enocntrar padrões nos dados, tais como dígitos, não dígitos, espaços, etc..

Código Significado
\d um dígito
\D um não-dígito
\s espaço (tab, espaço, nova linha, etc.)
\S não-espaço
\w alfanumérico
\W não-alfanumérico

In [16]:
# O prefixo r antes da expressão regular evita o pré-processamento da ER 
# pela linguagem. Colocamos o modificador r (do inglês "raw", crú) 
# imediatamente antes das aspas
r'\b'


Out[16]:
'\\b'

In [17]:
'\b'


Out[17]:
'\x08'

In [18]:
frase = 'Esta é uma string com alguns números, como 1287 e um símbolo #hashtag'

lista_padroes = [ r'\d+', # sequência de dígitos
                  r'\D+', # sequência de não-dígitos
                  r'\s+', # sequência de espaços
                  r'\S+', # sequência de não-espaços
                  r'\w+', # caracteres alfanuméricos
                  r'\W+', # não-alfanumérico
                ]

In [19]:
encontra_padrao(lista_padroes, frase)


Pesquisando na frase: '\\d+'
['1287']


Pesquisando na frase: '\\D+'
['Esta é uma string com alguns números, como ', ' e um símbolo #hashtag']


Pesquisando na frase: '\\s+'
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']


Pesquisando na frase: '\\S+'
['Esta', 'é', 'uma', 'string', 'com', 'alguns', 'números,', 'como', '1287', 'e', 'um', 'símbolo', '#hashtag']


Pesquisando na frase: '\\w+'
['Esta', 'é', 'uma', 'string', 'com', 'alguns', 'números', 'como', '1287', 'e', 'um', 'símbolo', 'hashtag']


Pesquisando na frase: '\\W+'
[' ', ' ', ' ', ' ', ' ', ' ', ', ', ' ', ' ', ' ', ' ', ' #']


FIM

Obrigado - Data Science Academy - facebook.com/dsacademybr