Download - Expressoes Regulares: Teoria e Pratica
UNIVERSIDADE ESTADUAL DA PARAÍBACENTRO DE CIÊNCIAS EXATAS E SOCIAIS APLICADAS – CAMPUS VII
CURSO DE LICENCIATURA EM COMPUTAÇÃOPRODUÇÃO DE MATERIAIS INSTRUCIONAIS
Docente: Vítor Abílio SobralDiscentes: Luiz Augusto de Macedo Morais e Rivanilson da Silva Rodrigues
Introdução a Expressões Regulares
2012
Sumário 1 Prérequisitos....................................................................................1
Introdução..................................................................................................2
Breve História das Expressões Regulares....................................................2
Prérequisitos .............................................................................................2
Alfabeto..................................................................................................2
Cadeia de caractere.................................................................................3
Tamanho.................................................................................................3
Subcadeia..............................................................................................3
Concatenação..........................................................................................4
Linguagem..............................................................................................4
Conceitos básicos sobre Expressões Regulares............................................4
2 Conceitos teóricos.............................................................................7
Definição formal de uma expressão regular ...............................................8
Operações com Expressões Regulares.........................................................9
União......................................................................................................9
Concatenação..........................................................................................9
Estrela...................................................................................................11
Precedência de operadores em expressões regulares............................12
Algumas definições importantes...........................................................12
Exemplos...............................................................................................12
3 Da 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
Email.......................................................................................................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çõesIlustração 1: Site RegexPal.......................................................................................24
Ilustração 2: Site RegExr..........................................................................................25
Lista de quadrosQuadro 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
este capítulo apresentaremos alguns prérequisitos e introduziremos os primeiros
conceitos sobre expressões regulares de forma puramente teórica.
N
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 RegularesAs 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 subcadeia de w se z faz
parte de w. Por exemplo, a cadeia “abra” é uma subcadeia 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 x1...xny1...ym, 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”
x2 = “olaola”
Linguagem
Uma linguagem é um conjunto de cadeias.
Conceitos básicos sobre Expressões RegularesEm 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:
4
( 2 + 3 ) × 5
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 é:
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
( 0 U 1 )0*
Expressões Regulares: Teoria e Prática
Essa linguagem aparentemente complexa pode ser escrita facilmente em forma
de expressão regular:
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
1*01*
2 Conceitos teóricos
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.
N
Expressões Regulares: Teoria e Prática
Definição formal de uma expressão regularDizemos 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. ( R1 o R2 ) onde R1 e R2 são expressões regulares, ou
6. ( R1* ) onde R1 é 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 RegularesUniã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.
Seja Σ= { a, b, c }, e ( ac U b ) uma expressão regular, vamos analisar essa
expressão e compreendela. Dividindo a expressão em duas partes temos duas
expressões básicas:
A expressão ac que representa a linguagem { ac } sobre o alfabeto Σ e uma outra
expressão b que representa a linguagem { b } sobre o alfabeto Σ. Logo a expressão
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 R1 e R2 é representada da seguinte maneira:
R1R2 ou R1oR2
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:
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
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
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 )
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
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
Expressões Regulares: Teoria e Prática
R1 = a* = { ε , a, aa, aaa, aaaa, ... }
De maneira análoga R2 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.
Maior precedência
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*
• Rk é a concatenação de R k vezes
• R U ∅ = R
• R o ε = R
• R U ε = { L(R), ε }, onde L(R) é a linguagem descrita por R
• R o ∅ = ∅
Exemplos
Assumindo o alfabeto Σ = { 0, 1 }
12
Operador* (estrela)
U (união)
o (concatenação)
2 Conceitos teóricos
expressão regular Linguagem descrita pela expressão
0*10* Conjunto de cadeias sobre o
alfabeto Σ que contém um único 1
01 U 10 { 01, 10 }
Σ*001Σ* Conjunto de cadeias sobre o
alfabeto Σ que contém 001 como sub-
cadeia
(0 U ε)(1 U ε) { ε , 0, 1, 01 }
Quadro 4: Exemplos de expressões regulares
13
3 Da teoria para a prática
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.
N
3 Da teoria para a prática
Caracteres especiaisAs expressões regulares possuem caracteres que possuem propriedades especiais.
Ponto (.)
Este operador corresponde a qualquer caractere, menos nova linha (\n).
Exemplo:
.a.a.o
Começo da string (^)
Este operador delimita o começo de uma string.
Exemplo:
^ma.{3}
Fim da string ($)
Este operador delimita o fim de uma string.
Exemplo:
.{2, 3}ma$
Operadores básicosOs 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
O cavalo se assustou com o macaco.
mamãe, o mamão está verde.
Calma, já vou deitar na cama
Expressões Regulares: Teoria e Prática
Exemplo:
cão|cachorro|dog|perro
Estrela (*)
A operação estrela repete zero ou mais vezes o caractere ou grupo anterior.
Exemplo:
Para noo*ssa 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!
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
16
O cachorro está correndo.
Para nooooooooooooooossa alegria! Para nossa alegria!
Para nooooooooooooooossa alegria! Para nossa alegria!
Querida, eu te amo.Ahh, que pena. Eu não te amo mais!
3 Da teoria para a prática
Mais operadoresRepetições finitas
Quando se sabe a quantidade ou faixa de repetições que determinado caractere
ou grupo de caracteres possui, utilizase das repetições finitas.
Exemplo:
[Bb]lá{2, 5}|Bláu
Conjuntos
São similares à união de vários caracteres. São representados por colchetes [].
Exemplo:
[A-Z]{3}{[123]{4}
Grupos
Grupos servem para agrupar conjuntos de caracteres em uma única “entidade”.
São representador por (?:<caracteres>).
Exemplo:
(?:[Hh]e)+
17
Blá. Bláá, bláááááá, blááááá, Bláu
A placa do meu carro é XKJ3143.
He, hehehehehehehhe, hehe.
4 Praticando com expressões regulares
este capítulo serão abordados conceitos práticos envolvendo expressões regulares no
dia a dia.N
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, email ou telefone.
CEPAntes 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:
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:
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:
Agora sim! Nossa ER está com uma cara mais bonita.
E-mailA tarefa de criar ERs para validar emails 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
58.763-000
\d\d\.\d\d\d-\d\d\d
\d{2}.\d{3}-\d{3}
Expressões Regulares: Teoria e Prática
identificar apenas emails no formato [email protected].
Como fizemos no exemplo do CEP, vamos dividir o email em grupos e, passo a
passo, criar as ERs correspondentes. Em alto nível, um email possui dois grupos: o
que vem antes e depois do @.
Sabemos que um endereço de email pode possuir letras, números, hífen (),
underscore (_) ou ponto (.), mas nunca espaços.
Esta primeira versão é bastante simples. A ER [\w-_\.] significa o conjunto de
caracteres aceitável no nosso email. 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 email. Mas sabemos que
existem emails que possuem domínios diferentes do .com. Para validarmos esses
novos tipos de email, devemos estender nossa ER.
Primeiro, temos que identificar quais serão novos novos tipos de email e como
eles são formatados. A seguir, você verá alguns exemplos:
Estes são apenas alguns exemplos de emails 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 mudala. Já no caso dos domínios, devemos ter em mente que um email
20
[\w-_\.]+@[\w-_\.]+\.com
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 emails:
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 tornadoa mais genérica, como
foi falado no início deste tópico, a validação e emails é bastante complexa. Portanto,
alguns emails reais poderiam não passar ou emails falsos passarem na validação.
21
[\w-_\.]+@(?:[\w-_\.]+\.)+[a-zA-Z]{2,4}
5 Ferramentas
este capítulo serão abordadas algumas ferramentas que são utilizadas para criar e
manipular expressões regulares.N
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 MSDOS, 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 contrabarra (\)
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 emails ou para desenvolver um analisador léxico
de uma linguagem de programação.
23
Expressões Regulares: Teoria e Prática
Testando ERs na WebAgora 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.
24
Ilustração 1: Site RegexPal
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.
A ferramenta egrepVocê 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/Linux1.
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
Ilustração 2: Site RegExr
Expressões Regulares: Teoria e Prática
Sua sintaxe é a seguinte:
egrep [flags] <expressao-regular> [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
--helpServe 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 que correspondem ao padrão da ER.
--only-matching 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
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
Como você pôde ver nos exemplos acima, as flags são muito úteis. Se você quiser
26
3
discursodiscursosdiscursou
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]”
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]$”
Como você pôde ver, agora o comando imprimiu apenas as palavras que
começam com “d” e terminam com “s”.
27
DesktopDocumentosDownloadsModelosVídeos
DocumentosDownloads
6 Expressões regulares com Python
gora que já sabemos o quanto as expressões regulares são poderosas, iremos unilas às
facilidades da linguagem de programação Python para construir nossos primeiros programas utilizando expressões regulares em sua essência.
A
6 Expressões regulares com Python
A linguagem PythonPython é 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 tutorial2 oficial da linguagem.
Aprendendo o módulo reAssim 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 chamase re, de Regular Expressions.
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 Site com o tutorial oficial da linguagem Python em português: http://www.python.org.br/wiki/TutorialPython
3 Para ver todos os caracteres especiais e funções suportadas pelo módulo re, acesse o site: http://docs.python.org/library/re.html
4 None é um tipo especial em Python que significa vazio, nulo.
29
Expressões Regulares: Teoria e Prática
Sintaxe:
re.match(<padrão>, <string>) MatchObject→ ou None
Exemplo:
import re
padrao = r'in\w+'
resultado = re.match(padrao, 'interesse')
print(resultado)
resultado = re.match(padrao, 'desinteresse')
print(resultado)
Na primeira linha é importado o módulo re.
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(<padrão>, <string>) MatchObject→ ou None
Exemplo:
import re
padrao = r'in\w+'
resultado = re.match(padrao, 'interesse')
print(resultado)
resultado = re.match(padrao, 'desinteresse')
30
<_sre.SRE_Match object at 0xb700bfa8>None
6 Expressões regulares com Python
print(resultado)
Na primeira linha é importado o módulo re.
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(<padrão>, <string>) 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)
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(<padrão>, <string-sub>, <string-original>) string→
Exemplo:
import re
resultado = re.sub(r'Luis', 'Luiz', 'Oi Luis, tudo bem?')
print(resultado)
31
<_sre.SRE_Match object at 0xb7001528><_sre.SRE_Match object at 0xb7001e90>
['interesse', 'interessado']
Oi Luiz, tudo bem?
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, esperase que o material seja ampliado e que
possua mais exemplos e exercícios.
32
Referências
Referências
BECKLES, B.; DOWLING , B. Python: Regular Expressions. [s.l.]: [s.n], 2010.
FRIEDL , J. E. F. Mastering Regular Expressions. 3. ed. Sebastopol: O'Reilly, 2010
GALINO, W.; ROSA, W.; SAMPAIO, P. A. Introdução a Teoria da Computação. [ Sn:.Sl ], 2008. 130 p.
SIPSER, M. Introduction of the Theory of Computation.[Boston, Massachusetts ]: Thomson Course Technology, 2006. 436 p. ISBN 0534950973 .
33