Google Python Class Day 2 Part 1

Fonte: Youtube

Nick Parlante - Google engEDU


Topico:

  • Expressoes Regulares

In [1]:
# Importando o modulo de expressoes regulares
import re

In [3]:
"""
Sintax: match = re.serach(pat, text)
"""
match = re.search('iig','camado piiig')

In [5]:
# O metodo group do objeto retorna o que match encontrou
match.group()


Out[5]:
'iig'

O que acontece se se nenhum padrao (pat) for encontrado? qual o retorno de match? match (que 'e um apontamento para um objeto) apontara para o que? Resposta: Para um objeto do Tipo NoneType que eh um objeto sem atributos.

Traceback (most recent call last)
<ipython-input-7-60588f6cca9c> in <module>()
----> 1 match.group()

AttributeError: 'NoneType' object has no attribute 'group'

In [6]:
# Padrao nao existente
match = re.search('iigs','camado piiig')

Vamos criar um prototipo de funcao para buscas por padrao textuais em um texto generico.


In [11]:
# Criando prototipo de funcao Find
def Find(pat, text):
    match = re.search(pat,text)
    if match: print match.group()
    else: print('Nao encontrado')

In [13]:
Find('igs','piiig')


Nao encontrado

Padroes

  .  (ponto) qualquer caractere
  \w caractere tipo word [a-zA-Z_]
  \d digito
  \s espaco em branco
  \S exceto espaco em branco
  +  1 ou mais
  *  0 ou mais

In [18]:
# Procurar quaisquer 3 caracteres seguidos de um g
Find('...g','piiig')


iiig

A busca usando re para na analise (da esquerda para a direita) na primeira ocorrencia do padrao. Veja no exemplo, onde esperavamos que yzg tambem casasse (match) com o padrao.


In [19]:
Find('..g','piiig   muito melhor: xyzg')


iig

In [24]:
# Procurar um periodo formado por dois pontos seguidos por tres letras
Find(':\w\w\w','bla :cat bla bla bla')


:cat

In [30]:
# Procurar 3 digitos em uma sentenca
Find('\d\d\d','bla :123xxx')
Find('\d\d\d','bla :car007xxx')


123
007

In [34]:
# Trabalhando com espacos
Find('\d\s\d\s\d','bla :1 2 3')


1 2 3

In [35]:
# Quando ha mais de um espaco entre o padrao, usa-se + ou *
Find('\d\s+\d\s+\d', '1   2     3')


1   2     3

In [36]:
# Encontrar dois pontos (:) seguidos de um periodo qualquer
Find(':\w+', 'bla bla :este_periodo bla bla')


:este_periodo

In [37]:
# Returnar o que for a partir dos dois pontos (:)
Find(':.+', 'bla bla :este_periodo bla bla')


:este_periodo bla bla

In [38]:
# Retornar o que for a partir dos dois pontos (:) ate encontar um espaco em branco. 
Find(':\S+', 'bla bla :este_periodo123&patty=jui&m="021" bla bla')


:este_periodo123&patty=jui&m="021"

In [60]:
# Verificando padroes de e-mail (quaisquer word antes e seguindo o @)
Find('\w+@\w+', 'blah hans.z@gmail.com usr @ serveer 1 2 3')


z@gmail

Para pegar o ponto usamos a notacao de conjunto [] ouseja [\w.]+ qualquer caractere mais o ponto uma ou mais vezes que aparecerem


In [48]:
Find('[\w.]+@[\w.]+', 'blah hans.z@gmail.com usr @ serveer 1 2 3')


hans.z@gmail.com

Obtendo o usuario e o servidor do endereco de e-mail


In [57]:
# Usamos o parentesis nas partes (membros) que nos interessam
m = re.search('([\w.]+)@([\w.]+)', 'blah hans.z@gmail.com usr @ serveer 1     2        3')
#m.group()
m.group(1)


Out[57]:
'hans.z'

In [56]:
m.group(2)


Out[56]:
'gmail.com'

In [58]:
# Quando houver mais de um email na mesma linha de analise
re.findall('[\w.]+@[\w.]+', 'blah hans.z@gmail.com usr@serveer 1 2 3')


Out[58]:
['hans.z@gmail.com', 'usr@serveer']

Retorne os parentesis para ver o resultado? -- Retorna uma lista de tuplas user-server


In [59]:
# Retornando uma lista de tuplas user-server
re.findall('([\w.]+)@([\w.]+)', 'blah hans.z@gmail.com usr@serveer 1 2 3')


Out[59]:
[('hans.z', 'gmail.com'), ('usr', 'serveer')]


In [ ]: