• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Expressões Regulares e Python
 

Expressões Regulares e Python

on

  • 6,284 views

Lecture at III meeting of Python Users Group of Pernambuco at 17/02/2010....

Lecture at III meeting of Python Users Group of Pernambuco at 17/02/2010.

Title: Regular Expressions and Python.

Portuguese lecture.

Título: Python e Expressões regulares. Palestra ministrada no III PUG-PE.

Statistics

Views

Total Views
6,284
Views on SlideShare
5,920
Embed Views
364

Actions

Likes
8
Downloads
274
Comments
2

8 Embeds 364

http://pugpe.wordpress.com 176
http://www.mobideia.com 154
http://www.slideshare.net 26
http://translate.googleusercontent.com 3
http://mobideia.blogspot.com.br 2
http://static.slidesharecdn.com 1
http://mobideia.blogspot.pt 1
http://web.archive.org 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

12 of 2 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • obrigado por postar! tirou uma duvida cruel aqui (:
    Are you sure you want to
    Your message goes here
    Processing…
  • Otima apresentação, muito obrigado por compartilhá-la, mas daria para você fazer o upload dela em pdf, porque não tenho um Mac (:-( ) para visualizá-la ofline no keynote.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />

Expressões Regulares e Python Expressões Regulares e Python Presentation Transcript

  • Expressões Regulares: Um canivete suíço para processamento de textos III Encontro do PUG-PE Marcel Caraciolo III Encontro do PUG-PE
  • O que são Expressões Regulares ? Também chamado de regex ou regexp Ferramenta eficiente para processamento de palavras em texto por meio de casamento padrões. Linguagem formal que pode ser interpretada por um processador de expressões regulares ou por um programa que identifica partes do texto que “casam”com uma especificação provida. - Wikipedia III Encontro do PUG-PE
  • O que são Expressões Regulares ? (Exemplos) Sequência de caracteres ‘car’ em qualquer conteto, como em “car”, “cartoon”, “bicarbonate” A palavra “car” quando aparece isoladamente A palavra “car” quando precedida de “blue” or “red” Símbolo $ seguido por 1 ou mais dígitos, e após, opcionalmente, um . seguido por mais 2 dígitos. III Encontro do PUG-PE
  • Mas antes um pouco de História... Estão na teoria dos automâtos e linguagens formais Descrição e classificação de linguagens formais Na década de 50, Stephen Kleene criou sua notação (conjuntos regulares) formando a algébra de Kleene Realmente usáveis a partir da biblioteca escrita para tcl e Perl, definindo a PCRE. III Encontro do PUG-PE
  • Python e Expressões Regulares O módulo re é o responsável! Mas por onde começamos ?! III Encontro do PUG-PE
  • re - Elementos básicos a,X, 9 caracteres normais, casam com eles mesmos exatamente . casam com qualquer caractere exceto n w casam com qualquer letra ou dígito ou _ [a-zA-Z0-9_]. Apenas 1 caractere!!! W casam com qualquer não caractere (o complemento de w) b casa a separação de palavras. s casa com o caractere espaço em branco, quebra de linha, tab, form [ nrtf]. S casa com qualquer não caractere acima [ complemento de s] t n r - tab newline e return d digitos [0-9] ^ início ou $ fim - casam com o início ou fim da string Inibe os caracteres especiais acima. Ex: . (casa com um ponto) , (casa com uma ). III Encontro do PUG-PE
  • re - Alguns comandos básicos match = re.search(pat, str) re.search() - Recebe uma expressão regular e uma string. Procura por padrões que satisfazem a especificação dada. III Encontro do PUG-PE
  • re - Alguns comandos básicos str = 'an example word:cat!!' match = re.search(r'word:www', str) # O if testa se o search obteve sucesso.   if match:                           print 'found', match.group() ## 'achou word:cat'   else:     print 'did not find' Retorna None se a busca foi falha. Senão retorna um objeto match III Encontro do PUG-PE
  • search - Algumas regras básicas A busca varre sobre a string do ínicio ao fim, interrompendo no primeiro match encontrado. Todo o padrão tem que ser satisfeito e não toda string. match.group() retorna o texto identificado. III Encontro do PUG-PE
  • re - Alguns comandos básicos   ## Search for pattern 'iii' in string 'piiig'.   ## All of the pattern must match, but it may appear anywhere.   ## On success, match.group() is matched text.   match = re.search(r'iii', 'piiig') =>  found, match.group() == "iii"   match = re.search(r'igs', 'piiig') =>  not found, match == None   ## . = any char but n   match = re.search(r'..g', 'piiig') =>  found, match.group() == "iig"   ## d = digit char, w = word char   match = re.search(r'ddd', 'p123g') =>  found, match.group() == "123"   match = re.search(r'www', '@@abcd!!') =>  found, match.group() == "abc" Retorna None se a busca foi falha. Senão retorna um objeto match III Encontro do PUG-PE
  • re - Repetição + Uma ou mais ocorrências do elemento precedente ex: i+ (1 ou mais ‘i’s) * 0 ou mais ocorrências do elemento precedente ? Casa 0 ou 1 ocorência do elemento precedente III Encontro do PUG-PE
  • re - Repetição São operadores Greedy e LeftMost Tentam achar o padrão mais à esquerda e tentam consumir a string o máximo possível. III Encontro do PUG-PE
  • re - Repetição ## i+ = one or more i's, as many as possible.   match = re.search(r'pi+', 'piiig') =>  found, match.group() == "piii"   ## Finds the first/leftmost solution, and within it drives the +   ## as far as possible (aka 'leftmost and largest').   ## In this example, note that it does not get to the second set of i's.   match = re.search(r'i+', 'piigiiii') =>  found, match.group() == "ii"   ## s* = zero or more whitespace chars   ## Here look for 3 digits, possibly separated by whitespace.   match = re.search(r'ds*ds*d', 'xx1 2   3xx') =>  found, match.group() == "1 2   3"   match = re.search(r'ds*ds*d', 'xx12  3xx') =>  found, match.group() == "12  3"   match = re.search(r'ds*ds*d', 'xx123xx') =>  found, match.group() == "123"   ## ^ = matches the start of string, so this fails:   match = re.search(r'^bw+', 'foobar') =>  not found, match == None   ## but without the ^ it succeeds:   match = re.search(r'bw+', 'foobar') =>  found, match.group() == "bar" III Encontro do PUG-PE
  • re - Alguns comandos básicos pattern = re.compile(pat) pattern.match(str) re.compile() - Permite compilar a expressão regular e retorna um objeto SRE_Pattern re.match() - retorna None se a string não atender as especificações e ao contrário um objeto Match. III Encontro do PUG-PE
  • Exemplos práticos Temos o texto a seguir: 'xyz alice-b@google.com purple monkey' Como extrairmos o e-mail deste e-mail ?! III Encontro do PUG-PE
  • Exemplos práticos Tentativa 01 r'w+@w+': Entrada: 'xyz alice-b@google.com purple monkey' Saída: b@google III Encontro do PUG-PE
  • Exemplos práticos   str = 'purple alice-b@google.com purple monkey'   match = re.search(r'w+@w+', str)   if match:     print match.group()  ## 'b@google' Problema! w não captura . ou - III Encontro do PUG-PE
  • Antes.. [ ] - Lista de caracteres. Casa uma ocorrência de qualquer caractere na lista. [abc] casa ‘a’, ‘b’ou ‘c’. Define Intervalos de caracteres ex: [a-z] ou [0-9] Caracteres Caracteres especiais como - ou . são considerados literais dentro da lista. III Encontro do PUG-PE
  • Exemplos práticos Tentativa 02 r'[w.-]+@[w.-]+' Entrada: 'xyz alice-b@google.com purple monkey' Saída: alice-b@google.com III Encontro do PUG-PE
  • Exemplos práticos   match = re.search(r'[w.-]+@[w.-]+', str)   if match:     print match.group()  ## 'alice-b@google.com' PS: [ˆ ] Lista negada de caracteres. Casa uma ocorrência de qualquer caractere nõ contido na lista. [^abc] - qualquer caractere exceto ‘a’ou ‘b’ ou ‘c III Encontro do PUG-PE
  • Exemplos práticos Show! Mas agora eu quero pegar partes específicas do e-mail, e agora?! 'xyz alice-b@google.com purple monkey' login e domínio III Encontro do PUG-PE
  • O group() irá nos ajudar! match.group(int) - Permite capturar partes específicas do texto (subexpressões). ( ) - Delimita grupos de captura dentro do padrão a ser extraído. III Encontro do PUG-PE
  • Exemplos práticos r'([w.-]+)@([w.-]+)' Entrada: 'xyz alice-b@google.com purple monkey' alice-b@google.com #match.group() Saída: alice-b #match.group(1) google.com #match.group(2) III Encontro do PUG-PE
  • Exemplos práticos   str = 'purple alice-b@google.com monkey dishwasher'   match = re.search('([w.-]+)@([w.-]+)', str)   if match:     print match.group()   ## 'alice-b@google.com' (the whole match)     print match.group(1)  ## 'alice-b' (the username, group 1)     print match.group(2)  ## 'google.com' (the host, group 2) Ferramenta útil para extração de cadeias de caracteres específicas do padrão. III Encontro do PUG-PE
  • re - Comandos básicos re.findall(patt,str) re.findall() - Retorna todas as strings que casam com a especificação desejada. Retorna uma lista de strings, onde cada string representa um padrão encontrado. III Encontro do PUG-PE
  • Exemplos práticos   ## Suppose we have a text with many email addresses   str = 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher'   ## Here re.findall() returns a list of all the found email strings   emails = re.findall(r'[w.-]+@[w.-]+', str) ## ['alice@google.com', 'bob@abc.com']   for email in emails:     # do something with each found email string     print email III Encontro do PUG-PE
  • Exemplos práticos E se minha string fosse um arquivo-texto?! re.findall() continua sendo uma ótima solução!   # Open file   f = open('test.txt', 'r')   # Feed the file text into findall(); #it returns a list of all the found strings   strings = re.findall(r'some pattern', f.read()) III Encontro do PUG-PE
  • findall() e group() juntos! Grupos de Captura ( ) combinado findall() Retorna uma lista de tuplas. Cada tupla representando um padrão encontrado, onde cada elemento representa group(1), group(2), ... III Encontro do PUG-PE
  • Exemplos práticos Voltando para o nosso exemplo do e-mail 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher' Se quisermos partes específicas dos padrões?! Vamos montar nossa expressão regular! III Encontro do PUG-PE
  • Exemplos práticos Tentativa 02 r'([w.-])+@([w.-]+)' Entrada: 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher' Saída: [('alice', 'google.com'), ('bob', 'abc.com')] III Encontro do PUG-PE
  • Exemplos práticos   str = 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher'   tuples = re.findall(r'([w.-]+)@([w.-]+)', str)   print tuples  ## [('alice', 'google.com'), ('bob', 'abc.com')]   for tuple in tuples:     print tuple[0]  ## username     print tuple[1]  ## host (?: ) Grupo de captura o qual não quer que entre nos resultados. III Encontro do PUG-PE
  • Dicas para criação de ER Tente criar expressões regulares simples que tragam mais resultados. A idéia é ir aos poucos refinando até chegar onde você quer. Enfraquecido no início, forte no fim. III Encontro do PUG-PE
  • Parâmetros opcinais para RE Flags opcionais para funções como re.search, findall(), etc. ex: re.search(patt, str, re.IGNORECASE) IGNORECASE Ignore o case sensitive. Identifica ambos ‘a’ e ‘A’ DOTALL Permite (.) para casa quebra de linhas. Por padrão .* só casa encontrar uma quebra de linha (n). MULTILINE Permite strings de múltiplas linhas. Permite ^e $ para casar o ínicio ou fim de cada linha. III Encontro do PUG-PE
  • re -Substituição re.sub(pat,replacement,str) re.sub() - Busca por todas as instâncias do padrão em um texto e os substitui por outro padrão. III Encontro do PUG-PE
  • Exemplos práticos Não entendeu?! Vamos a um exemplo! 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher' Vamos trocar todos os domínios do e-mail por yo-yo-dyne.com III Encontro do PUG-PE
  • Exemplos práticos re.sub(r'([w.-]+)@([w.-]+)', r'1@yo-yo-dyne.com', str) Entrada: 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher' Saída: ‘purple alice@yo-yo-dyne.com, blah monkey bob@yo-yo-dyne.com blah dishwasher’ III Encontro do PUG-PE
  • Exemplos práticos   str = 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher'   ## re.sub(pat, replacement, str) -- returns new string with all replacements,   ## 1 is group(1), 2 group(2) in the replacement   print re.sub(r'([w.-]+)@([w.-]+)', r'1@yo-yo-dyne.com', str)   ## purple alice@yo-yo-dyne.com, blah monkey bob@yo-yo-dyne.com blah dishwasher O padrão a substuir pode incluir 1 2 que se refere no texto ao group(1), group(2), etc.. do texto original. III Encontro do PUG-PE
  • Greedy x Non-Greedy Vamos considerar o seguinte texto: ‘<b>foo</b> and <i>so on </i>’ E queremos pegar apenas os padrões que atendem ‘(<.*>)’ , qual é o resultado esperado ? III Encontro do PUG-PE
  • Greedy x Non-Greedy Retorna: ‘<b>foo</b> and <i>so on </i>’ Como assim ?! III Encontro do PUG-PE
  • Greedy x Non-Greedy *. é um operador guloso (‘greedy’), vai o máximo que pode! Soluções: .*? ou .+? III Encontro do PUG-PE
  • Greedy x Non-Greedy ‘(<.*?>)’ irá só pegar ‘<b>’ como primeiro grupo e <‘/b> como segundo grupo, e assim sucessivamente. .*? Irá consumir até encontrar um marcador procedente de ? (> neste caso) que força a parada de .*? III Encontro do PUG-PE
  • Ferramenta para testes de RE Python Regex http://www.pythonregex.com/ III Encontro do PUG-PE
  • “”.join(re.findall(r'([A-Za-zs!]+)', 'V123a345le?&#u34 2423p#46e,ss443839o-3939a34949l42 !')) twitter: marcelcaraciolo blog: http://www.mobideia.com http://aimotion.blogspot.com caraciol@gmail.com III Encontro do PUG-PE
  • Referências http://pt.wikipedia.org/wiki/Express%C3%A3o_regular http://code.google.com/edu/languages/google-python-class/regular-expressions.html http://docs.python.org/library/re.html III Encontro do PUG-PE
  • Expressões Regulares: Um canivete suíço para processamento de textos III Encontro do PUG-PE Marcel Caraciolo III Encontro do PUG-PE