Em terra de metacaractere, quem tem um asterisco é rei
17/05/2008
Não entendi absolutamente NADA!
Calma! Eu lembrei de você, e preparei esse mini-tutorial para você aprender hoje mesmo como criar expressões regulares simples! Prepare-se para avançar mais um grau na escala da nerdisse!
Expressões regulares? Isso é algum tipo de regra de português? Eu detestava aquelas aulas…
Não, não… é algo bem mais complexo e… divertido. Vamos imaginar a seguinte situação: você trabalha numa empresa de desenvolvimento de software como programador (claro, afinal, esse exemplo seria inviável se você fosse o faxineiro) e seu chefe pediu para o Vagabond Controlator Plus, o software que você está desenvolvendo, ser capaz de ler arquivos de texto com registros dos acessos dos funcionários ao sistema de ponto da empresa, estruturado dessa forma:
12:45 Tinkie Winkie
13:50 Dipsie Silva
14:30 Lala Tasty Cream
14:50 Po McCartney
20:20 Bozo The Clown
Sua missão, bravo guerreiro, é descobrir quais funcionários estão chegando atrasados na empresa (depois das 14h). Como você faria isso?
Ah, é fácil! Basta ler o arquivo, gerar uma string para cada linha, separar a parte da hora e converter para número, aí verifica se…
Pára! Trabalho demais para pouca coisa. As ER (expressões regulares) existem para te ajudar. Com elas podemos buscar e substituir informações em um texto, de forma rápida e fácil. Para o exemplo acima, uma das possíveis expressões pode ser simplesmente:
^(1[4-9]|2[0-3]):[0-5]\d.*$
Minha nossa, o que é ISSO!?
Calma! Não entre em pânico! Depois de algum estudo, essa monstruosidade acima pode ser facilmente compreendida. Como o assunto é muito extenso, vou explicar apenas os conceitos abordados no quadrinho. Dica: use o RegexPal para testar as expressões, inclusive o exemplo acima. Lembre de marcar a caixinha ““.
1 – O ponto
O ponto casa com qualquer coisa. Ex:
Expressão: m.t.
Texto: Ele entrou no mato com a moto
A expressão significa: ache palavras que comecem com m, tenham um caractere qualquer na segunda posição, um t, e termine com um caractere qualquer. Assim, ele encontra as palavras mato e moto. Agora dê um pulinho no RegexPal e faça o teste. Legal, não? ![]()
2 – O metacaractere guloso
Quando um ponto se junta a um asterisco, ele fica malvado e vira o curinga (não é aquele do Batman), um ser maligno devorador de mundos, caracteres e criancinhas. O asterisco ao lado dele significa: “ache zero ou mais caracteres quaisquer”.
Expressão: a.*i
Texto: aaaaaaai! Meu pé, seu idiota!
No exemplo acima, o esperado seria que a expressão casasse com “aaaaaaai“, mas ele casou até a última letra “i” da frase, porque o .* é ganancioso e não mede esforços para conseguir aquilo que deseja. Ele devora tudo que vê pela frente. Isso é útil em alguns casos, mas não se deve exagerar, caso contrário a ER poderá casar com caracteres indesejáveis.
Nota: Os metacaracteres são caracteres especiais que servem para montar nossas expressões. Exemplos: (., *, +, ?, [], (), {}… ).
3 – Entrando na lista dos procurados
Com a lista podemos determinar quais caracteres estamos procurando numa determinada posição. A lista é um conjunto de caracteres entre colchetes. Ex:
Expressão: [mprg]ato
Texto: o gato pegou o rato, que mordeu o pato, que entrou no mato
Traduzindo: procure palavras que comecem com “m”, “p”, “r” ou “g” e terminem com “ato”. Se colocarmos o coringa dentro de uma lista, o que acontece? Como Aurélio diz em seu livrinho de expressões regulares, “dentro da lista, todo mundo é normal”. Ex:
Expressão: [.*]
Texto: Olá. Sua senha é ****.
O curinga perde seus poderes de devorador de mundos e torna-se uma expressão “ache um ponto ou um asterisco”, e casa apenas com os pontos e asteriscos do texto. Vira um caractere normal, sem poderes e tendo que pegar ônibus para trabalhar.
4 – Grupo de apoio
Tal como em expressões matemáticas, servem para simplificar e organizar a ER, além de outras vantagens: Ex:
Expressão: (casa|testa)mento
Texto: Vovô fará seu testamento após o casamento de Annie
A ER procura por palavras que começam com “casa” ou “testa” e terminam com “mento”. Note a barrinha |. Ela significa OU. Ou uma coisa ou outra. Se você tirar os parênteses, a expressão passará a significar: ache a palavra “casa” ou a palavra “testamento”. Teste isso no RegexPal. ![]()
5 – A recuperação
Depois de ganhar um pouco de bom-senso, nosso metacaractere deixa de ser guloso e passa a ser altruísta. No grupo de apoio, instruíram ele a sempre andar com um sinal de interrogação, o que o torna menos capitalista, e casa apenas o necessário. Vamos voltar ao exemplo 2:
Expressão: a.*?i
Texto: aaaaaaai! Meu pé, seu idiota!
Agora sim! Com um sinal de interrogação no final, ele vai parar de casar caracteres até encontrar o primeiro “i”. Pronto! O mundo está livre de mais um louco facínora.
6 – E todos foram felizes para sempre
E para que isso aconteça, você precisa ir além. Minhas sugestões:
Definição na Wikipédia
aurelio.net (Este post foi inspirado no livrinho do Aurélio. Compre!
)
regexpal.org (para testar)
regular-expressions.info
Como criar expressões regulares em Python
Cheat Sheet de regex (guia rápido)
Espero que esse pequeno tutorial seja útil. Aguardem mais tutoriais!
Mantendo a retro-compatibilidade
- 10/14/06 - Os nerds também amam
- 09/03/07 - Nota dez e meio
- 03/27/09 - Extreme
- 10/24/08 - O ataque dos bots assassinos 11
- 06/12/08 - Os nerds também amam (4)


Puts!
É tão simples aprender expressões regulares assim…
Karlisson, você deveria dar aulas!
iuHEAiueaahIUEAh
SHOWW!!!!
Finalmente deu pra entender melhor essas benditas ER’s
A próposito…SEGUNDO! o/
**Logged Out**
Legal o post, agora vale lembrar que deve-se deixar as regexp’s para serem usadas somente quando estritamente necessário, pois as expressões ficam complexas (e escondem bugs) muito rapidamente.
Quer um exemplo? Seu próprio post!
Da forma que está, não pega minutos <10 (ex.: 14:01). Tudo bem que foi feita como exemplo educativo, mas o .*?$ não faz sentido. Se é qualquer coisa (non-greedy?!) até o fim da linha, ou coloca dentro de um grupo ou não precisa dizer nada: ^(1[4-9]|2[0-3]):[0-5]\d
É isso.
Intencionalmente, considerei que até as 14:10 não fosse um atraso =P
Realmente, a ER pode ser reescrita dessa forma, sem a interrogação no final:
^(1[4-9]|2[0-3]):[0-5]\d.*$
Mas o coringa casa tudo. Teoricamente, essa ER vai casar a primeira hora, e depois o coringa vai casar todo o resto do texto, até o último caractere da última linha, e aí o cifrão do final casa com o fim de linha
Mas isso só se a opção do RegexPal “Dot matches All” estiver marcada
Corrijam-me se eu estiver errado.
Agora eu já fiz o exemplo que você pediu…
eddie:~ humberto$ python3.0
Python 3.0a5+ (py3k:63200, May 13 2008, 02:25:45)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.
>>> pattern = ‘^(1[4-9]|2[0-3]):([0-5]\d)\s(.*)’
>>> s = “”"12:45 Tinkie Winkie
… 13:59 Dipsie Silva
… 14:01 Chuck
… 14:30 Lala Tasty Cream
… 14:50 Po McCartney
… 20:20 Bozo The Clown”"”
>>> import re
>>> for line in s.split(’\n’):
… match = re.match(pattern, line)
… if match:
… print(match.groups())
…
(’14′, ‘01′, ‘Chuck’)
(’14′, ‘30′, ‘Lala Tasty Cream’)
(’14′, ‘50′, ‘Po McCartney’)
(’20′, ‘20′, ‘Bozo The Clown’)
Pode parecer mentira mais baixei o Cheat Sheet de regex ontem e me intertecei pelo assunto e estava lendo o guia do Aurélio http://guia-er.sourceforge.net/ quando resolvo ler os meus feeds e acho este post.
Fora isto ótimo trabalho é a primeira vez que comento mais acompanho o Nerdson desde o Nerdson vai ao fisl 8.0.
A mais uma coisa estou usando o Add-on do firefox Regular Expressions Tester https://addons.mozilla.org/pt-BR/firefox/addon/2077
para testar minhas expressões regulares não usei ele muito mas parece ser uma alternativa interessante ao regexpal.
Não pude deixar de comentar. O quadrinho ficou muito bom e o post tbm =D parabéns!
aviso antes do comentário: minha capacidade cognitiva tende a zero nesta manhã nada ensolarada de domingo.
“Isso é algum tipo de regra de português? Eu detestava aquelas aulas…
Não, não… é algo bem mais complexo e… divertido.” ¬¬’
Então você também tem o livrinho do Aurélio, né? Eu ganhei naquela promoção que ele fez: http://aurelio.wordpress.com/2007/11/13/convenca-me-a-te-dar-um-livro/
Essa sem dúvida é a melhor maneira de se aprender um assunto tão “matemático”. O Aurélio é um cara genial, ele é um talento nato não só na área de expressões regulares: a habilidade comunicativa dele é de se admirar.
Aliás, a sua também é. Que bom que temos tantos talentos na comunidade.
Legal cara, caiu como uma luva, estava procurando um material sobre expressões regulares para estudar e me deparo com essa charge
hehehehehehe
Estou estudando por esse link http://www.amk.ca/python/howto/regex/
fica ai se alguém se interessar…
vlw!
A correção do Humberto pega 14:00 como atraso, não endendo muito de ER, mas fiz uma alteração que resolveu esse erro:
^(1[4-9]|2[0-3]):([1-5]\d|0[1-9]).*$
Não se ficou elegante, mas funciona
[...] Nerdson não vai à escola » Em terra de metacaractere, quem tem um asterisco é rei (tags: nerdson.com 2008 mes4 dia18 at_home regexp comics blog_post explicação_introdutória) [...]
Poxa, sua didática é impressionante, Karlisson. Quem me dera ser bom assim…
Isso merece uma indicação. Lá vou eu atualizar um post…
De manhã, se possível.
eu não entendo (praticamente) nada de programação e entendi isso.
muito divertido xD
vc devia dar aula mesmo!
salut!
Confesso não ter lido a explicação de ER por já ter conhecimento disso…
mas a tirinha ta 10 !
parabens kra…
[]’s efusivos
Cara, você passou as E.R. de uma forma bem simples, o livro do Aurélio também é bom, eu li a versão online dele.
Agora eu me pergunto, como eu uso isso na linguagem que programo.
Eu era ZERO em ER, sabia oque era mas nunca fui atrás para aprender, com esse teu post me motivou a estudar, parabéns e obrigado!
*.*!!! REGEXP RULEZ!! XDDD
Essa daí eu gostei mesmo, lido com regexps no dia-a-dia do trabalho, achei esta muito engraçada XDDDD Meus parabéns Karlisson!
Grande Karlisson,
Que maravilha de conteúdo! A tirinha chama a atenção e o artigo complementa. Essa sua junção de diversão e ensinamento técnico ficou muito boa, parabéns!
Genial a “história” do metacaractere que se recuperou de sua ganância
Coloquei um link especial para esse post lá no portal de Expressões Regulares, já no início dos links para que mais pessoas possam chegar até aqui.
Só tenho uma pequenina correção: o correto é curinga, com u mesmo.
http://aurelio.wordpress.com/2006/09/17/caractere-curinga/
Abração!
Opa, valeu, Aurélio! Corrigido! \o/
Expressões regulares ou “Regex” são extremamente úteis na área de programação ou para modelagem de diagramas. A linguagem PERL é uma das que mais dão ênfase.
No início é bem chatinho de se entender, é preciso praticar e muito mas vale a pena
Este site para testar do RegexPal não conhecia, atualmente eu uso o do Tool.Lymas (http://tools.lymas.com.br/regexp_br.php), bem ai fica a dica para mais um site
O texto tá sensacional, muito fácil de aprender assim… mas o melhor pra mim foi o título. kkkkkkkkkk
Valeu Kerlisson, mais uma vez, você está de parabéns!
Nossa, eu já vi muito post nerd aqui, mas esse está d+ (os quadrinhos). A explicação de ER também está muito boa, graças ao livro do Aurélio hoje eu já não sou um zero à esquerda em ER hehehehe.
Acho que nunca comentei antes, mas visito o blog constantemente e sempre fico esperando mais quadrinhos =)
Parabéns pelo ótimo trabalho, continue assim =)
InFog
Sendo um pouco atípico, existe um lugar bem melhor para aprender expressões regulares. O Karlisson fez um post sensacionalmente didático e claro a respeito do assunto, este aqui. Se quiser continuar a ler, agradeço
[...]
[Trackback Manual]
heaueueasadhu, ficou muito massa a tirinha, parabéns e continue com essa ótima criatividade
Ficou pai d’egua a piada heheheh
Putz, e eu que sempre achei que ER fosse Entidade Relacionamento! Vivi esse tempo todo uma mentira???
@Leandro
Não confundir com DER
Adorei. Mais um link pra eu indicar, quando alguém estiver iniciando em expressões regulares!
Nao basta a piada , tem aula tb
Que tal uma tirinha do que os nerds fazem no feriado?
:p
hehe… vlw pela aula… voce se daria bem sendo professor, entendi perfeitamente! =)
Obrigado! eu nem sabia sobre ER =/
mas agora aprendi!
Fala Nerdson!
Parabéns pelo blog cara muito show.
Estou indicando para muitas pessoas acessarem como algo realmente interessante, criativo e divertido.
Conseguiu recuperar seu notebook? Ele ainda vive?
Abraços!
Opá opá, caro amigo!
Muito bom o post! Incrível sua capacidade de fazer piadas com nossas nerdices!
Respondendo a um matador de aula acima, as expressões regulares são de fundamental utilidade para se fazer padrões de ataques em pacotes de redes. Usamos amplamente as ER’s no projeto HLBR (hlbr sourceforge net), em meio ao uso da libpcre, Perl Compatible Regular Expression.
Gostaria também de deixar minha dica: kregexpeditor. Um aplicativo nativo do ambiente KDE que permite teste de ER’s com uma visualização gráfica dos átomos. O único porém é o engine baseado em Posix (não sei se é um porém, mas prefiro as PCRE).
Muito bacana o blog e as explicações simplex.
Está de parabéns;..
Indico para os próximos..
porra cara vc é muito bom, se não está vc ja deveria esta gnhando dinheiro com esse blog, muito criativo mesmo, vc tem futuro, parabens…
Concordo que você deveria dar aulas…
E sobre o .*… gosto dele, aliás segundo um “teste nerd” sou como ele
http://blog.griebeler.com/2008/08/mais-inutilidades.html
Nerdson, esse artigo está ótimo. Rapidamente consegui entender as ER o que ficou confuso no livro de SCJP.
Senti falta da explicação do ^, mas o resto está muito simples e didático. Parabens!
Bando de viciados em teletubies…