UNIVERSIDADE ESTADUAL DA PARA ÍBA CENTRO DE CIÊNCIAS EXATAS E SOCIAIS APLICADAS – CAMPUS VII ÇÃ O CURSO DE LICENCIATURA EM COMPUTA ÇÃ PRODUÇÃ O DE MATERIAIS INSTRUCIONAIS
Docente: V í t or Abí lio lio Sobral ítor Discentes: Luiz Augusto de Macedo Morais e Rivanilson da Silva Rodrigues
Introdução a Expressões Regulares
2012
UNIVERSIDADE ESTADUAL DA PARA ÍBA CENTRO DE CIÊNCIAS EXATAS E SOCIAIS APLICADAS – CAMPUS VII ÇÃ O CURSO DE LICENCIATURA EM COMPUTA ÇÃ PRODUÇÃ O DE MATERIAIS INSTRUCIONAIS
Docente: V í t or Abí lio lio Sobral ítor Discentes: Luiz Augusto de Macedo Morais e Rivanilson da Silva Rodrigues
Introdução a Expressões Regulares
2012
Sumário
1 Pré-requisitos............. -requisitos......................... ........................ ........................ ........................ ...................................1 .......................1 Introdução................ o........................ ................. ................. ................. ................. ................................................2 ........................................2 Breve Hist ória das Express ões Regula Regulares.. res........... ..................................................2 .........................................2 Pré-requisitos .............................................................................................2 Alfabeto.............................................. Alfabeto.......................... ..................................... ....................... ............ ............ ............ ............ ........... .....2 2 Cadeia de caractere.................................................................................3 Tamanho.................................................................................................3 Sub-cadeia..............................................................................................3 Concatenação..........................................................................................4 Linguagem..............................................................................................4 Conceitos básicos sobre Express ões Regulares............................................4
2 Conceitos teóricos.................. ricos.............................. ........................ ........................ ........................ ....................... ...........7 7 Definição formal de uma express ão regular ...............................................8 Operações com Express ões Regulares.........................................................9 União............... o........................ ................. ................. ................. ................. ................. ............................................9 ....................................9 Concatenação..........................................................................................9 Estrela...................................................................................................11 Precedência de operadores em express ões regulares regulares............................12 ............................12 Algumas definições importante importantes....... s............... ................. ............................................12 ...................................12 Exemplos...............................................................................................12
3 Da teoria teoria para a prática..................................................................14 Caracteres especiais..................................................................................15 Ponto (.)................................................................................................15 Começo da string (^)...........................................................................15 Fim da string ($)...................................................................................15 Operadores b ásicos...................................................................................15 União (|)...............................................................................................15
Estrela (*).............................................................................................16 Um ou mais (+)....................................................................................16 Zero ou um (?)......................................................................................16 Mais operadores........................................................................................17 Repetições finitas..................................................................................17 Conjuntos..............................................................................................17 Grupos..................................................................................................17
4 Praticando com expressões regulares..............................................18 CEP...........................................................................................................19 E-mail.......................................................................................................19 Primeira vers ão.....................................................................................19 Segunda versão.....................................................................................20
5 Ferramentas....................................................................................22 Testando ERs na Web................................................................................24 RegexPal (http://regexpal.com/)..........................................................24 RegExr (http://gskinner.com/RegExr/)................................................25 A ferramenta egrep...................................................................................25 Flags......................................................................................................26 Começo e fim de ERs............................................................................27
6 Expressões regulares com Python...................................................28 A linguagem Python..................................................................................29 Aprendendo o módulo re..........................................................................29 match....................................................................................................29 search....................................................................................................30 findall....................................................................................................31 sub........................................................................................................31
Considerações Finais............................................................................32 Referências..........................................................................................33
Lista de ilustrações
Ilustração 1: Site RegexPal.......................................................................................24 Ilustração 2: Site RegExr..........................................................................................25
Lista de quadros Quadro 1: Cadeias de caracteres...............................................................................5 Quadro 2: Concatenação de linguagens..................................................................10 Quadro 3: Concatenação de linguagens 2...............................................................11 Quadro 4: Exemplos de expressões regulares..........................................................13 Quadro 5: Principais flags utilizadas na ferramenta egrep......................................26
1 Pré-requisitos
N
este capí tulo apresentaremos alguns pr érequisitos e introduziremos os primeiros conceitos sobre expressões regulares de forma puramente teórica.
Expressões Regulares: Teoria e Prática
Introdução Em ciência da computa ção, uma expressão regular é uma forma concisa e flexí vel de identificar cadeias de caracteres, caracteres particulares, palavras ou padrões de caracteres. S ão largamente utilizadas em linguagens de programa ção, ferramentas de busca de padr ões e analisadores l éxicos. Neste trabalho as express ões regulares serão apresentadas em um primeiro momento de forma te órica baseado na teoria da computa ção e em um segundo momento de forma pr ática.
Breve História das Expressões Regulares As expressões regulares estão inseridas na teoria dos aut ômatos e na teoria das linguagens formais, ambas fazem parte da teoria da computa ção. As origens das expressões regulares remontam a década de 50, elas foram definidas pelo matem ático Stephen Cole Kleene no ano de 1956 no artigo “ Representation of events in nerve nets and finite automata”, Seu trabalho foi a base para os primeiros algoritmos
computacionais de busca e para algumas das mais antigas ferramentas de tratamento de texto em ambientes UNIX. Atualmente as Expressões Regulares são aplicadas na busca e substitui ção de palavras em editores de texto, em linguagens de programa ção, validação de formatos de texto (ou protocolos), filtragem de informa ção e etc.
Pré-requisitos Antes de conhecer conceitos b ásicos sobre express ões regulares, definiremos alguns conceitos fundamentais para a sua compreens ão.
Alfabeto Um Alfabeto é qualquer conjunto de s í mbolos finito n ão vazio. Geralmente usamos a letra grega Σ para designar um alfabeto de s í mbolos. A seguir temos alguns exemplos de alfabetos: Σ1 = { 0, 1 };
2
1 Pré-requisitos Σ2 = { a, b , c, d, e } Σ3 = { 0, 1, 2, a, b}
Os membros de um alfabeto são denominados sí mbolos do alfabeto.
Cadeia de caractere O conceito de cadeia de caractere é fundamentalmente construí do em ciência da computação. Uma cadeia de caracteres é uma sequência finita de sí mbolos. Uma cadeia de caracteres sobre um alfabeto é uma sequência finita de sí mbolos que pertencem a um alfabeto, ou seja, uma forma particular de cadeia de caractere onde cada elemento da cadeia pertence a um alfabeto. Tomando Σ 1como alfabeto ent ão 01001 é uma cadeia sobre Σ1. Agora se Σ 4= { a, b, c, d, e, ..., z }, ent ão abracadabra é uma cadeia sobre Σ4. Usualmente escrevemos cada elemento da cadeia de caractere junto um do outro e sem v í rgulas.
Tamanho Se w for uma cadeia qualquer sobre um alfabeto Σ qualquer, o tamanho de w, será escrito como | w|, o tamanho ser á o número de sí mbolos que w contém. Uma cadeia de caracteres de tamanho zero é chamada de cadeia vazia e ser á escrita por definição como ε. Exemplo: Σ = { 0, 1 };
w = 001001 |w|=6
Sub-cadeia Seja w uma cadeia de caracteres dizemos que z é uma sub-cadeia de w se z faz parte de w. Por exemplo, a cadeia “abra” é uma sub-cadeia de “abracadabra”.
3
Expressões Regulares: Teoria e Prática
Concatenação Podemos concatenar duas cadeias de caracteres, sejam x e y duas cadeias de caracteres, escrevemos a concatenação de x e y como x 1... x n y 1...y m, a cadeia que obtemos ao concatenar o fim da cadeia x ao inicio da cadeia y é xy ou x ° y . A concatenação de uma cadeia de caractere com ela mesma usa a seguinte notação:
Onde k é o número de vezes que x é concatenado com ele pr óprio. Exemplo: Sejam x e y duas cadeias de caracteres onde x = “ola” e y = “mundo” xy = “olamundo” yx = “mundoola” x 2 = “olaola”
Linguagem Uma linguagem é um conjunto de cadeias.
Conceitos básicos sobre Expressões Regulares Em teoria da computação expressões regulares são descritores de linguagens, ou seja, a partir destas express ões podemos identificar uma linguagem regular e escrev êla usando expressões. Na matemática podemos usar os operadores de soma, e multiplica ção para construir expressões como a que segue: ( 2 + 3 ) × 5
4
1 Pré-requisitos De maneira análoga, podemos usar opera ções regulares para construir expressões que descrevem linguagens, estas s ão chamadas express ões regulares. Um exemplo de expressão regular é: ( 0 U 1 )0*
O resultado da express ão aritmética acima é o número 30. O resultado de uma expressão regular é uma linguagem. Neste caso o resultado da express ão regular é a 3linguagem que consiste de todas as cadeias de caracteres poss í veis começando com 0 ou 1 seguido por um n úmero qualquer de 0's (zeros) inclusive nenhum, ou seja, a linguagem representa o conjunto de todas as cadeias de caracteres que come çam com 0 ou com 1 e terminam com um número qualquer de zeros. Assim a express ão regular acima descreve dentre outras, as cadeias de caracteres mostradas no Quadro 1: Cadeias de caracteres
Inicio da cadeia
Número de zeros no final da cadeia
1
1
0 (zero)
10
1
1
000
0
2
1000
1
3
00000
0
4
100000
1
5
1000000
1
6
00000000
0
7
Quadro 1: Cadeias de caracteres
Para exemplificar o uso de express ões regulares, tome à seguinte linguagem: o conjunto de cadeias de 0’s (zeros) e 1’s (um's) tais que comece com qualquer quantidade de 1’s (inclusive nenhum), seguidos necessariamente de um 0 e outra sequência com qualquer quantidade de 1’s.
5
Expressões Regulares: Teoria e Prática
Essa linguagem aparentemente complexa pode ser escrita facilmente em forma de expressão regular: 1*01*
Note que apesar de representar um conjunto de cadeias de caracteres, ou seja, uma linguagem, as express ões regulares também parecem cadeias. Assim as expressões regulares estarão sempre destacadas em negrito.
6
2 Conceitos teóricos
N
este capí tulo apresentaremos a definição formal de uma expressão regular, bem como os operadores regulares união, concatenação e estrela e suas regras de precedência.
Expressões Regulares: Teoria e Prática
Definição formal de uma expressão regular Dizemos que R é uma expressão regular e se R descreve: 1. a para algum a em Σ; 2. ε;
3. ∅;
4. ( R1 U R2 ) onde R1 e R2 são expressões regulares; 5. ( R 1 o R 2 ) onde R 1 e R 2 são expressões regulares, ou 6. ( R 1* ) onde R 1 é uma expressão regular. Nos itens 1 e 2 , a express ão regular a e ε representam respectivamente as linguagens {a} e { ε}, então R será uma expressão regular se descreve uma cadeia a qualquer sobre um alfabeto. No item 3 a express ão regular ∅ representa a linguagem vazia, assim R também será uma expressão regular se descreve a linguagem vazia. Nos itens 4, 5 e 6, a express ão regular descreve as linguagens obtidas atrav és da combinação de união ou concatenação das linguagens R1 e R2, ou estrela de uma linguagem R1, respectivamente. Não devemos confundir as express ões regulares ε e ∅. A expressão
representa
a linguagem que contem uma única cadeia — chamada, cadeia vazia— no entanto representa a linguagem que n ão contem cadeias. A seguir veremos detalhadamente os operadores de express ão regular e como podemos usá-los para formar express ões mais complexas.
8
2 Conceitos teóricos
Operações com Expressões Regulares União A ideia de união é a mesma aplicada à união de conjuntos na matem ática aplicado em linguagens. Vejamos, tome duas linguagens:
L1 = { a, b, c } L2 = { 11, 01, a } A união dessas duas linguagens é o conjunto de cadeias que est á na primeira linguagem mais as cadeias contidas na segunda, sem considerar repeti ções. Denotamos a uni ão de L1 e L2 como:
( L1 U L2 ) = {a, b, c, 11, 01} Agora aplicaremos esse conceito em express ões regulares. Considere R1 e R2 duas expressões regulares. A uni ão de R1 e R2 é definida como segue: ( R1 U R2 ) = { R1, R2 }
Para melhor compreendermos esse operador vejamos um exemplo.
= { a, b, c }, e ( ac U b ) uma express ão regular, vamos analisar essa Seja Σ expressão e compreende-la. Dividindo a express ão em duas partes temos duas expressões básicas:
e uma outra A expressão ac que representa a linguagem { ac } sobre o alfabeto Σ . Logo a express ão expressão b que representa a linguagem { b } sobre o alfabeto Σ regular ( ac U b ) representa a linguagem { ac, b }. Mas o que isso significa? O operador U nos da a id éia de “ou”, assim entendemos portanto que ( ac U b ) representa a linguagem { ac } ou { b }.
É certo que com a prática acostumamos a entender as linguagens (e as expressões que as representam) apenas com um olhar, sem precisar pensar em todos esses passos.
9
Expressões Regulares: Teoria e Prática
Concatenação O conceito de concatenação para express ões regulares é simples, tomando duas expressões regulares: R1 = ( 1 U 0 ) R2 = ( a U b )
A concatenação de R 1 e R 2 é representada da seguinte maneira: R1R2 ou R1oR 2
Para entendermos qual linguagem as express ões acima representam ao serem concatenadas olharemos mais uma vez para as duas express ões individualmente: R1 = ( 1 U 0 ) = { 1, 0 } R2 = ( a U b ) = { a, b } R1R2 = ( 1 U 0 )( a U b ) = { 1a, 1b, 0a, 0b}
A expressão R1 representa a linguagem { 1, 0 }, ou seja, uma cadeia de caracteres que contém um 1 ou um 0, de maneira an áloga a expressão R representa a linguagem { a, b }, ou seja, uma cadeia de caracteres que cont ém um a ou um b. Ao concatenar as duas express ões formamos uma outra express ão regular que representa a linguagem obtida ap ós a concatenação das duas linguagens representadas pelas expressões. Para concatenar as duas linguagens basta fazer como segue no quadro 2: R1 = ( 1 U 0 )
R2 = ( a U b )
R1R2 = ( 1 U 0 )( a U b )
1
a
1a
1
b
1b
0
a
0a
0
b
0b
Quadro 2: Concatenação de linguagens
Cuidado! Não esqueça que R1R2 ≠ R2R1 . A operação de concatenação não é comutativa. Note que quando fazemos R1R2 temos: ( 1 U 0 )( a U b ) = { 1a, 1b, 0a, 0b }
10
2 Conceitos teóricos Se fizermos R2R1 teremos: ( a U b )( 1 U 0 ) = { a1, b1, a0, b0 }
Agora vamos analisar a concatenação de duas outras express ões regulares: R1 = ( 1 U 0 )a R2 = ( b )
R1 = ( 1 U 0 )a
R2 = ( b )
R1R2 = ( 1 U 0 )a( b )
1a
b
1ab
0a
b
0ab
Quadro 3: Concatena ção de linguagens 2 R1R2 = ( 1 U 0 )a( b ) = { 1ab, 0ab }
Logo as cadeias que começam com 1 ou 0 seguido de ab representam a linguagem descrita pela concatena ção das expressões.
Estrela O operador * (estrela) é responsá vel por descrever uma quantidade infinita de cadeias a partir de uma linguagem finita. Podemos definir o operador * em termos de infinitas operações de concatenação e união: Se R é uma expressão regular então R* pode representar: Tome R = { a } •
Nenhuma cadeia de R, ou seja, {
};
•
Cadeias individuais de R, o pr óprio conjunto { a };
•
Cadeias de R concatenadas aos pares, { aa }
•
Cadeias de R concatenadas de tr ês em três, { aaa }
•
Etc.
Essa sequência continua infinitamente. Vejamos exemplos: R1 descreve a linguagem que consiste de 0 ou mais concatena ções da cadeia a ou apenas a cadeia vazia.
11
Expressões Regulares: Teoria e Prática R1 = a* = { , a, aa, aaa, aaaa, ... }
De maneira análoga R 2 descreve a linguagem que consiste de 0 ou mais concatena ções da cadeia 0 ou da cadeia 01 ou ainda apenas a cadeia vazia. R2 = ( 0 U 01 )* = { , 0, 01, 00, 0101, 000, 010101, ... }
Precedência de operadores em expressões regulares Podemos omitir os par ênteses de uma expressão regular se seguirmos as regras de precedência dos operadores. No entanto os par ênteses são ótimos para facilitar a compreensão da expressão regular, além de darem maior preced ência a um operador em uma expressão. Operador
Maior precedência
* (estrela) U (união) o (concatenação)
Menor precedência Algumas definições importantes Seja R uma expressão regular por convenção, temos: •
R como sendo RR*, ou seja, a expressão R concatenada com R*
•
R⁺ U ε = R*
•
R k é a concatenação de R k vezes
•
R U ∅ = R
•
ε = R R o
•
R U ε = { L(R), ε }, onde L(R) é a linguagem descrita por R
•
Ro∅=∅
⁺
Exemplos Assumindo o alfabeto
= { 0, 1 } 12
2 Conceitos teóricos expressão regular
Linguagem descrita pela expressão
Conjunto de cadeias sobre o
0*10*
alfabeto 01 U 10 *001 *
que contém um único 1 { 01, 10 }
Conjunto de cadeias sobre o alfabeto
que contém 001 como subcadeia
(0 U
(1 U
{ , 0, 1, 01 }
Quadro 4: Exemplos de express ões regulares
13
3 Da teoria para a prática
N
os capí tulos anteriores vimos toda a base teórica necessária para compreendermos o funcionamento das expressões regulares. Este capí tulo é uma ponte entre a teoria e a pr ática, pois abordará as adaptações na sintaxe das ERs na parte prática, bem como caracterí sticas adicionais.
3 Da teoria para a pr ática
Caracteres especiais As expressões regulares possuem caracteres que possuem propriedades especiais.
Ponto (.) Este operador corresponde a qualquer caractere, menos nova linha (\n). Exemplo: .a.a.o O cavalo se assustou com o macaco.
Começo da string (^) Este operador delimita o come ço de uma string. Exemplo: ^ma.{3} mamãe, o mamão está verde.
Fim da string ($) Este operador delimita o fim de uma string. Exemplo: .{2, 3}ma$ Calma, já vou deitar na cama
Operadores básicos Os operadores básicos em express ões regulares s ão união (|), concatena ção e estrela (*). Entretanto, na pr ática, não existe um operador de concatena ção explí cito. Além disso, são acrescentados os operadores de um ou mais (+) e zero ou um (?), que são uma extensão dos operadores b ásicos.
União (|) Na união, se a string possuir pelo menos um dos caracteres ou grupos de caracteres da express ão, ela é v álida.
15
Expressões Regulares: Teoria e Prática
Exemplo: cão|cachorro|dog|perro O cachorro está correndo.
Estrela (*) A operação estrela repete zero ou mais vezes o caractere ou grupo anterior. Exemplo: Para noo*ssa alegria! Para nooooooooooooooossa alegria! Para nossa alegria!
Um ou mais (+) A operação um ou mais é uma extensão da estrela, pois repete uma ou mais vezes o caractere ou grupo anterior. Exemplo: Para no+ssa alegria! Para nooooooooooooooossa alegria! Para nossa alegria!
Zero ou um (?) Esta operação é igual à operação de união entre uma cadeia vazia e outra cadeia. Ou seja, ela pode ou n ão aparecer. Exemplo: [Ee]u (?:não)? te amo Querida, eu te amo. Ahh, que pena. Eu não te amo mais!
16
3 Da teoria para a pr ática
Mais operadores Repetições finitas Quando se sabe a quantidade ou faixa de repeti ções que determinado caractere ou grupo de caracteres possui, utiliza-se das repeti ções finitas. Exemplo: [Bb]lá{2, 5}|Bláu Blá. Bláá, bláááááá, blááááá, Bláu
Conjuntos São similares à união de v ários caracteres. S ão representados por colchetes []. Exemplo: [A-Z]{3}{[123]{4} A placa do meu carro é XKJ3143.
Grupos Grupos servem para agrupar conjuntos de caracteres em uma única “entidade”. São representador por (?:
). Exemplo: (?:[Hh]e)+ He, hehehehehehehhe, hehe.
17
4 Praticando com expressões regulares
N
este capí tulo serão abordados conceitos práticos envolvendo express ões regulares no dia a dia.
4 Praticando com express ões regulares Esta seção abordar á a aplicabilidade das express ões regulares em programas utilizados no mundo real, como valida ção de CEP, e-mail ou telefone.
CEP Antes de criarmos a expressão regular para validar o CEP, temos que entender como ele deve ser formatado. O CEP possui oito d í gitos, sendo que estes d í gitos são divididos em tr ês partes: 58.763-000 Agora que já sabemos como é a formatação do CEP, vamos criar nossa express ão regular passo a passo. O primeiro passo é substituir os n úmeros pela ER correspondente e utilizar um caractere de escape (\) antes do pronto, para retirarmos suas propriedades especiais na ER: \d\d\.\d\d\d-\d\d\d Se nós testássemos esta express ão regular, ela funcionaria, no entanto, utilizar tantos caracteres iguais seguidos n ão é uma boa prática. Como sabemos quantos n úmeros cada grupo da express ão deve ter, vamos especificá-los: \d{2}.\d{3}-\d{3} Agora sim! Nossa ER está com uma cara mais bonita.
E-mail A tarefa de criar ERs para validar e-mails de forma eficaz causa muita dor de cabeça entre os desenvolvedores. Mas, felizmente, o objetivo deste livro n ão é lhe causar problemas. Por isso, iremos construir apenas vers ões simples de expressões regulares.
Primeira versão Nesta primeira versão, iremos construir uma ER bem simples, que consegue 19
Expressões Regulares: Teoria e Prática
identificar apenas e-mails no formato [email protected]. Como fizemos no exemplo do CEP, vamos dividir o e-mail em grupos e, passo a
í um e-mail possui dois grupos: o passo, criar as ERs correspondentes. Em alto n vel, que vem antes e depois do @. Sabemos que um endereço de e-mail pode possuir letras, n úmeros, hí fen (-), underscore (_) ou ponto (.), mas nunca espa ços. [\w-_\.]+@[\w-_\.]+\.com Esta primeira versão é bastante simples. A ER [\w-_\.] significa o conjunto de caracteres aceit á vel no nosso e-mail. Neste caso, estes caracteres s ão os que foram mencionados no parágrafo anterior. Perceba que quando aquela ER aparece, ela vem seguida de um +. Isto significa que ela pode ser repetida uma ou mais vezes.
Segunda versão Nossa primeira versão consegue validar alguns tipos de e-mail. Mas sabemos que existem e-mails que possuem dom í nios diferentes do .com. Para validarmos esses novos tipos de e-mail, devemos estender nossa ER. Primeiro, temos que identificar quais ser ão novos novos tipos de e-mail e como eles são formatados. A seguir, voc ê verá alguns exemplos: [email protected] [email protected] [email protected] [email protected] [email protected] Estes são apenas alguns exemplos de e-mails que nossa ER deve validar. Se voc ê perceber, existem diversos tipos de dom í nio no mundo. Portanto, neste caso, ao inv és de fazer uma coisa espec í fica como fizemos com o caso do .com, devemos criar um padrão genérico. Nos exemplos, parte do usu ário continua intacta. Isso significa que n ós não precisaremos muda-la. J á no caso dos domí nios, devemos ter em mente que um e-mail 20
4 Praticando com express ões regulares pode ter v ários subdom í nios e que a última parte do site (com, br, us, name, etc.) sempre possui entre dois e quatro caracteres (apenas letras). A partir da análise acima, vamos criar uma nova ER para validar e-mails: [\w-_\.]+@(?:[\w-_\.]+\.)+[a-zA-Z]{2,4} Agora chegamos a uma ER bem mais genérica que a anterior. Vamos entender o que há de novo nesta nova ER. Vamos apenas nos deter ao que est á após o @, pois o que vem antes não foi modificado em rela ção à ER anterior. A primeira mudança foi a inser ção de parte da ER anterior dentro de um delimitador de grupo (?:) seguido por um +, que indica que aquele grupo pode ser repetido uma ou mais vezes, validando, assim, m últiplos subdomí nios. A última parte da ER ([a-zA-Z]{2,4}) valida a última parte do site, onde o domí nio só possui letras de tamanho entre dois e quatro. Mesmo tendo melhorado a express ão regular e tornado-a mais gen érica, como foi falado no in í cio deste tópico, a valida ção e e-mails é bastante complexa. Portanto, alguns e-mails reais poderiam n ão passar ou e-mails falsos passarem na valida ção.
21
5 Ferramentas
N
este capí tulo serão abordadas algumas ferramentas que são utilizadas para criar e manipular expressões regulares.
5 Ferramentas Hoje em dia, se voc ê quiser pesquisar por um arquivo em seus diret órios, basta digitar o nome do documento desejado no seu gerenciador de arquivos (e.g. Windows Explorer, Nautilus, etc.) e, como m ágica, dezenas de arquivos com nomes semelhantes aparecem para voc ê escolher. No entanto, a vida dos usu ários de computador nem sempre foi tão f ácil assim. Se você é usuário Unix/Linux e utiliza a linha de comandos ou alcan çou os tempos do MS-DOS, voc ê provavelmente já deve ter utilizado os chamados caracteres curingas (wildcards) para selecionar/modificar mais de um arquivo em um diret ório. Por exemplo, quando usamos o comando rm *.txt, estamos excluindo todos os arquivos que terminam com a extens ão .txt. Estes caracteres especiais s ão bastante parecidos com as express ões regulares e são úteis para buscar padr ões simples nos textos. Se fossemos utiliz á-las no exemplo anterior, dever í amos escrever um código assim: rm .*\.txt$. Como você já viu nos capí tulos anteriores, o ponto (.) simboliza qualquer caractere que seja diferente de uma nova linha. No entanto, voc ê deve prestar atenção que o segundo ponto não é interpretado desta forma, pois existe uma contra-barra (\) antes dele. Sendo assim, ele é interpretado como um caractere comum. Apesar de os caracteres curingas serem úteis para pequenas tarefas (como a que foi mostrada acima) suas funcionalidades s ão limitadas para padr ões mais complexos.
É aí onde entram as express ões regulares. Por meio delas, podemos gerar padr ões avançados que possibilitam filtrar dados dos mais diversos tipos em textos. As expressões regulares são bastante utilizadas por desenvolvedores no dia a dia, seja para validar n úmeros de CPF e e-mails ou para desenvolver um analisador l éxico de uma linguagem de programa ção.
23
Expressões Regulares: Teoria e Prática
Testando ERs na Web Agora que você já sabe que as expressões regulares possuem alguma aplicabilidade, vamos come çar a brincar um pouco com elas. Existem alguns sites dispon í veis na web que conseguem interpretar expressões regulares e retornar ou substituir os trechos de texto que correspondem ao padr ão inserido. Veja, a seguir, alguns sites que podem ajud á-lo a testar suas express ões regulares.
RegexPal ( http://regexpal.com/ ) O RegexPal é um sistema simples desenvolvido em Javascript que interpreta expressões regulares. Ele é útil para a constru ção de expressões, pois você pode testar em tempo real se o padr ão está funcionando corretamente.
Ilustração 1: Site RegexPal
24
5 Ferramentas
RegExr ( http://gskinner.com/RegExr/ ) Possui as mesmas caracterí sticas do sistema anterior, mas possui tamb ém explicações sobre cada padr ão que está sendo formado. Al ém disso, existem alguns exemplos na barra lateral que s ão bem úteis.
Ilustração 2: Site RegExr
A ferramenta egrep Você viu anteriormente o exemplo de dois sites para manipular ERs e, se voc ê pesquisar no Google sobre “regular expressions online” ir á encontrar muitos outros. Contudo, também existem ferramentas no seu pr óprio computador que fazem uso de expressões regulares, como é o caso da ferramenta egrep em sistemas Unix/Linux 1. A ferramenta egrep é utilizada na linha de comandos para imprimir linhas de arquivos que possuem correspond ências a padr ões de expressões regulares. 1
A ferramenta egrep não vem instalada por padrão no Windows. Se voc ê quiser baixar uma ferramenta similar, acesse o seguinte site: http://unxutils.sourceforge.net/.
25
Expressões Regulares: Teoria e Prática
Sua sintaxe é a seguinte: egrep [flags] [nome-do-arquivo] Onde o primeiro argumento é uma expressão regular (ou flags, opcionalmente) e o segundo (opcional) é o arquivo de texto a ser verificado.
Flags O egrep possui uma série de opções que facilitam o seu manuseio, estas op ções recebem o nome de flags. A seguir, você terá uma tabela com algumas das flags suportadas pelo egrep. Flag
Descrição
--help
Serve para mostrar uma breve descri ção da ferramenta e seu modo de funcionamento.
--count
Imprime a quantidade de linhas capturadas ao inv és de mostrá-las.
--color
Colore as partes do texto correspondem ao padr ão da ER.
--only-matching
que
Exibe apenas as partes correspondentes ao padrão e não toda a linha.
Quadro 5: Principais flags utilizadas na ferramenta egrep
Vamos ver quantas palavras no dicionário de português contêm o padrão “discurso”: egrep --count "discurso" /usr/share/dict/brazilian 3
Agora, ao inv és de imprimir a quantidade, vamos saber quais s ão as palavras que possuem o padr ão. Utilizando a flag --color, iremos colorir a parte das palavras que corresponde ao padr ão da ER. egrep --color "discurso" /usr/share/dict/brazilian discurso discursos Como você pôde ver nos exemplos acima, as flags são muito úteis. Se voc ê quiser discursou 26
5 Ferramentas saber mais sobre como manusear a ferramenta egrep e quais são todas as flags que ela possui, digite o comando egrep --help.
Começo e fim de ERs Se você quiser listar todas as suas pastas no diret ório atual que comecem com “d” e terminem com “s”, você pode usar o seguinte comando: ls | egrep “[dD].*[sS]” Desktop Documentos Downloads Modelos Vídeos Mas alguma coisa deu errado. Quando voc ê mandou imprimir os diret órios que começassem com “d” e terminassem com “s”, ele também imprimiu “Desktop”, “Modelos” e “V í deos”. Mas por qu ê? Se você prestar atenção na sua ER, voc ê verá que ela irá capturar tudo o que possuir um “d” (ou “D”), zero ou algum caractere no meio e depois “s” (ou “S”). Tanto “Desktop”, “Modelos” ou “V í deos” possuem esse padrão, mesmo que ele esteja contido no meio de cada palavra. Para solucionar este problema, devemos utilizar dois caracteres que possuem funções especiais nas ERs, o ^ e o $, que significam, respectivamente, come ço e fim da string a ser capturada.
Então, nosso comando para capturar palavras que come çam com “d” e terminam com “s” ficará assim: ls | egrep “^[dD].*[sS]$” Documentos Downloads Como você pôde ver, agora o comando imprimiu apenas as palavras que começam com “d” e terminam com “s”.
27
6 Expressões regulares com Python
A
gora que já sabemos o quanto as express ões regulares são poderosas, iremos uni-las às facilidades da linguagem de programação Python para construir nossos primeiros programas utilizando expressões regulares em sua essência.
6 Expressões regulares com Python
A linguagem Python Python é uma linguagem interpretada, de f ácil entendimento que é utilizada no desenvolvimento dos mais diversos tipos de aplica ções, sejam elas para desktop, web, moveis, etc. Como o foco deste livro n ão é ensinar programação, se você não souber a linguagem Python, indico que leia o tutorial 2 oficial da linguagem.
Aprendendo o módulo re Assim como outras linguagens de programação, Python possui diversos m ódulos (ou bibliotecas). O m ódulo responsá vel por criar e manusear expressões regulares em Python chama-se re, de Regular E xpressions. Por meio do módulo re nós conseguiremos criar tudo o que j á fizemos com a ferramenta egrep e, adicionalmente, aliar o poder de uma linguagem de programa ção para desenvolver nossos primeiros programas. O módulo re suporta3 todos os caracteres especiais estudados anteriormente, como ., ^, $, *, +, ?, [], {}, () e |, além dos caracteres que aceitam conjuntos, como \d, \w e \s. Para criar e manusear as expressões regulares, devemos utilizar as funções disponí veis no módulo re. Veja a seguir uma descri ção das principais fun ções.
match Tenta aplicar o padr ão ao iní cio da string. Se houver uma correspond ência, é retornado um objeto com a parte correspondente da string. Caso contrário, é retornado um objeto do tipo None4.
2 3 4
Site com o tutorial oficial da linguagem Python em português: http://www.python.org.br/wiki/TutorialPython Para ver todos os caracteres especiais e funções suportadas pelo módulo re, acesse o site: http://docs.python.org/library/re.html None é um tipo especial em Python que significa vazio, nulo.
29
Expressões Regulares: Teoria e Prática
Sintaxe: re.match(, )
→
MatchObject ou None
Exemplo: import re padrao = r'in\w+' resultado = re.match(padrao, 'interesse') print(resultado) resultado = re.match(padrao, 'desinteresse') print(resultado) <_sre.SRE_Match object at 0xb700bfa8> Na primeira linha é importado o m ódulo re. None A string que representa o padr ão deve conter um r antes das aspas, o que indica uma string bruta (raw string) em Python, ou seja, uma string que não interpreta caracteres especiais como '\n', por exemplo. Como foi mostrado na sa í da do programa, o primeiro resultado possui correspond ência enquanto o segundo n ão. Isso acontece porque a fun ção match começa a verificar o padr ão desde o começo da string.
search Esta função é semelhante à função match, no entanto, ela escaneia toda a string em busca do padr ão ao inv és de verificá-lo só no iní cio. Sintaxe: re.search(, )
→
MatchObject ou None
Exemplo: import re padrao = r'in\w+' resultado = re.match(padrao, 'interesse') print(resultado) resultado = re.match(padrao, 'desinteresse')
30
6 Expressões regulares com Python print(resultado) <_sre.SRE_Match object at 0xb7001528> Na primeira linha é importado o m0xb7001e90> ódulo re. <_sre.SRE_Match object at Neste caso, foram retornados objetos nos dois resultados, pois o padr ão também está contido na segunda string.
findall Esta função retorna uma lista de todas as ocorr ências do padr ão na string. Sintaxe: re.findall(, )
→
lista de ocorr ências
Exemplo: import re padrao = r'in\w+' resultado = re.match(padrao, 'Eu estou sem interesse, mas você está muito interessado.') print(resultado) ['interesse', 'interessado']
sub Esta função retorna uma string obtida por meio da substitui ção das ocorr ências do padrão na string original por uma outra string. Sintaxe: re.sub(, , )
→
string
Exemplo: import re resultado = re.sub(r'Luis', 'Luiz', 'Oi Luis, tudo bem?') print(resultado) Oi Luiz, tudo bem?
31
Expressões Regulares: Teoria e Prática
Considerações Finais Durante a leitura deste material, você pôde aprender desde a parte teórica de expressões regulares vista em cursos de Teoria da Computa ção, como a parte pr ática, aplicando esta poderosa ferramenta a problemas cotidianos. Como o objetivo deste livro é apenas introduzir os conceitos b ásicos sobre expressões regulares, muita coisa ficou de fora. Al ém disso, por causa do curto prazo de tempo para a elabora ção desta primeira versão, alguns conteúdos não puderam ser abordados com mais detalhes. Para a próxima versão, espera-se que o material seja ampliado e que possua mais exemplos e exercí cios.
32