Blog DP6

Blog da DP6 com novidades, boas práticas e recomendações do mundo de marketing digital. Web analytics, data visualization, DMP, Atribuição, mobile e outros tópicos são abordados no nosso blog.

Follow publication

Regex: o guia essencial das expressões regulares

--

Alguns anos atrás fizemos aqui no blog uma série de 2 posts sobre Expressões Regulares (as temidas RegEx).

A nossa ideia, lá em 2016, foi divulgar esse recurso e incentivar a sua utilização. Não é à toa que esses estão entre os posts mais lidos do nosso blog, mesmo 5 anos depois. As pessoas que têm contato com RegEx costumam ter medo desses códigos que, convenhamos, podem parecer assustadores. Mesmo o nosso post de 2019 sobre o livro Expressões Regulares — Uma Abordagem Divertida, que é uma resenha e indicação do ótimo livro do Aurélio Jargas, sempre aparece entre os mais acessados.

Por que estudar expressões regulares

Mas primeiro, porque a DP6, uma empresa de dados, se preocupa com expressões regulares? E mais importante, que diferença isso faz na sua vida? Bem, a resposta é simples.

Expressões regulares (ou regex, as vezes regexp) são sequências de caracteres que descrevem um padrão de busca em um texto. Elas foram desenvolvidas para fazer buscas em texto de forma eficiente, e por isso mesmo que você ache que elas não façam parte do seu dia a dia, toda vez que você usa Ctrl+F no seu navegador ou editor de texto, elas estão lá (mesmo que escondidas).

E o fato é que pelo poder que elas têm, elas estão presentes em várias ferramentas da nossa rotina de analytics. Quer fazer um filtro em um relatório no Google Analytics para mostrar páginas específicas? Basta usar uma regex. Quer pesquisar, extrair, ou substituir um padrão de uma célula na sua planilha? Várias funções de regex estão disponíveis. Ou ainda, precisa encontrar uma linha específica em um arquivo csv de milhões de linhas? Fazer uma consulta com um WHERE que não vai ter dezenas de “OR” no seu banco de dados? Tudo isso pode ser feito com regex!

Alguns casos bem comuns de utilização de regex são:
- Pesquisa ou formatação de data (trocar de dd/mm/aaaa para aaaa-mm-dd por exemplo)

- Pesquisa de PII dentro da sua base de dados (CPF, email)

- Validação de campos com formatos específicos (telefone, email, CPF)

A ideia é que possamos usar regex para otimizar processos, e não para torná-los mais complicados. Enfim, dada essa longa introdução, o que você precisa saber sobre regex para se virar?

Como escrever uma expressão regular

Resumindo, uma regex é uma combinação de caracteres. Alguns deles são reservados, por isso vamos chamá-los de metacaracteres:
. ? * + ^ $ | — [ ] { } ( ) \

Esses são os símbolos que definem como a expressão é interpretada, e cada um deles tem um significado. Mas, antes de passar por eles, vamos desmistificar uma coisa: mesmo que a expressão contenha somente texto comum, ela ainda é uma regex! Vejam no exemplo abaixo:

Nesse caso a minha regex é simplesmente a palavra “data”. Quando você escreve os caracteres, eles vão ser interpretados literalmente, um por um, e na ordem que você colocar. Então pesquisar um texto simples não requer nenhum conhecimento extra.

Agora vamos evoluir um pouco. Digamos que eu quero pegar as combinações “data company” e “data science”. Imagino que você esteja supondo que basta escrever exatamente o que quer encontrar, certo? Mas como pegar as duas expressões ao mesmo tempo?

Caracteres de agrupamento: | ( )

Para isso vou apresentar o primeiro modificador, o de “OU”. Esse símbolo é o |, que é chamado de “barra vertical” ou de “pipe”. No exemplo, eu quero que meu texto ache “data company” ou “data science”. Vamos ver:

Aqui podemos ver que funciona como esperado! Esse é provavelmente o modificador mais importante para você usar.

Mas meu texto também tem “data analysts” e “data engineers”, e eu quero que minha expressão encontre todos esses 4. Neste caso, podemos simplesmente continuar usando OU, mas existe um jeito ainda mais eficiente de fazer isso! Perceberam que todos são “data [alguma coisa]”? Então por que não escrever “data” somente uma vez, e apenas acrescentar o restante? Para isso, existem os parênteses! Eles servem para agrupar palavras na expressão. No nosso caso, podemos fazer assim:

Dessa forma, minha expressão ficou muito menor do que se eu tivesse que repetir “data” todas as vezes. Mas veja só, o texto tem ainda mais uma combinação: “data analytics”, que não estava prevista antes. Existe algum jeito de aceitar qualquer combinação de “data [alguma coisa]”?

Para isso preciso apresentar outros 2 tipos de metacaracteres: os especificadores e os quantificadores. Vamos começar com os primeiros:

Caracteres especificadores: . [ ^ — ] \

Os especificadores servem para definir o que você procura. Eles são caracteres especiais que servem para facilitar como a expressão é escrita. O mais comum é o ponto, que significa “qualquer coisa”. Por exemplo, se eu fizer uma expressão com um ponto no nosso texto, fica assim:

Veja que ele encontrou todos os 150 caracteres, independente se são letras, números, espaços ou símbolos.

Os outros especificadores são os colchetes [] e a barra invertida \. Os colchetes são uma evolução da junção de grupos (parênteses) e OU. Vamos usar um exemplo mais simples para ficar claro:

Nesse caso, fiz uma expressão para pegar todas as vogais. A primeira funciona, mas ela tem 4 caracteres a mais do que a segunda. Novamente, a ideia das expressões regulares é ser eficiente. Mas, e se eu quisesse pegar todas as letras do alfabeto? Escrever todas elas não parece muito eficiente. E é aí que posso apresentar o hífen, que aumenta muito o poder da lista. Por exemplo, para pegar todo o alfabeto, basta escrever que quero as letras de a até z da seguinte forma:

Isso também funciona para quaisquer pontos que queira parar, como de a até m, assim como também vale para os números:

E o restante que falei sobre as listas continua valendo: se eu combinar os dois, a expressão continua funcionando, como se fosse um “OU”:

E ainda temos mais um modificador que complementa a lista, o acento circunflexo ^. Dentro de uma lista ele significa “tudo menos o que está dentro da lista”. Por exemplo, se eu refizer os dois primeiros com o símbolo de negação:

Como você pode imaginar, a lista aceita qualquer caractere, incluindo símbolos e espaços. Mas, para facilitar, nós temos alguns padrões de busca prontos para tipos diferentes. Por exemplo, para pegar qualquer número, existe o \d. Para pegar qualquer letra (tecnicamente “caracteres de palavras” incluindo números e underlines), existe \w. Para pegar tudo menos números, \D. Tudo menos letras, \W. Isso consegue diminuir bastante o tamanho das nossas expressões. Resumindo, a lista de equivalências é essa aqui:
- [0–9] = \d

- [^0-9] = \D

- [a-zA-Z0–9_] = \w

- [^a-zA-Z0–9_] = \W

Também existe o \s, que serve para pegar qualquer espaço, incluindo tabs e quebras de linha.

Enfim, sei que parece bastante coisa, mas ainda não acabou!

Caracteres quantificadores: + * { }

Eu mencionei que além dos especificadores também existem os quantificadores. Nós já sabemos escrever o que encontrar no texto, mas também precisamos dizer quantas vezes as coisas precisam aparecer. Esses são mais simples, então vamos lá:
Começando pelas chaves {}. Elas tem a seguinte sintaxe: [caractere]{n,m} onde n é o número mínimo, e e m é o número máximo de repetições do [caractere].

Ok, eu sei que parece confuso, então vamos fazer o seguinte: quantas palavras de menos de 3 letras tem lá no nosso texto?

Eu poderia fazer assim, pegando palavras de uma, duas ou três letras:

Ou aproveitar o quantificador. Nesse caso, fica assim:

Viram que o resultado é o mesmo?

Agora digamos que eu queira palavras com exatamente 4 letras. Basta omitir o número máximo, e já funciona!

E se eu quiser palavras de 4 ou mais letras? Nesse caso, é só colocar a vírgula, mas deixar o número máximo vazio:

E eu fiz questão de passar por todos esse casos para apresentar os outros 3 quantificadores:
- {0,1} = ? (opcional)

- {0,} = * (0 ou mais)

- {1,} = + (1 ou mais)

Pode parecer confuso, mas com um pouco de prática fica fácil de entender. Por exemplo, se eu quiser pegar todas as palavras do meu texto, independentemente do tamanho, basta pegar tudo que tem 1 ou mais caracteres:

Se eu quiser encontrar inclusive os espaços vazios:

Esse não é o melhor exemplo, então vamos entrar no mundo de analytics por um instante. Digamos que eu queira pegar todas as páginas do site da dp6 para analisar. Eu posso fazer assim:

Nesse caso eu quero tudo que contém dp6.com.br, independente se a url continua ou não depois do br.

De qualquer forma, a utilização dos quantificadores realmente vem com a prática. Então vamos voltar para o caso de uso: pegar todas as combinações de “data [alguma coisa]” lá no texto inicial:

Usando o especificador de letra e a quantidade maior que um, nós conseguimos!

Âncoras: ^ $ \b

Antes de finalizar, tem mais 4 caracteres que é importante conhecer:
- ^ (fora da lista) significa o começo da linha

- $ significa no fim da linha

- \b significa “extremidade da palavra”

Vamos falar sobre eles brevemente:
Se você estiver atente nos meus exemplos, vai ver que isso foi usado no exemplo das páginas do site. O primeiro significa que só vai dar match com o que começa exatamente na minha expressão. Para ficar mais claro, aqui vai o exemplo sem ele:

Como a regex procura sempre dentro do texto, não faz diferença se ela vai encontrar a palavra exatamente como eu quero ou se vai ter isso dentro de algo no texto.

O segundo tem a mesma ideia, mas serve para marcar o fim da linha ou do texto. Por exemplo:

O terceiro serve para marcar palavras sem precisar acrescentar o espaço antes e depois da sua expressão, como eu fiz na maior parte dos exemplos aqui. Ele ajuda a garantir que a regex vai funcionar exatamente como esperado. Voltando ao nosso exemplo de palavras de 4 letras, posso trocar os espaços na expressão pelo \b:

E dessa forma garantimos que todas as palavras foram identificadas, inclusive a última que é seguida de uma exclamação, e não de um espaço.

E, por fim, existe também a barra invertida \ antes de outro metacaractere, que serve para “escapar” o caractere seguinte e garantir que ele vai ser procurado como texto, e não com o significado dele nas regex. Se eu mudar um pouco o exemplo, vamos ver que o ponto é interpretado como “qualquer coisa”:

Ao acrescentar a barra de escape, dizemos que o ponto deve ser interpretado literalmente como um ponto. Isso ajuda a garantir que a sua expressão vai funcionar somente como esperado, e que não vai encontrar padrões que você não espera.

Como praticar e onde estudar

Considerando o tamanho desse texto pode parecer que o conteúdo é muito difícil, mas garanto que com um pouco de prática tudo isso ficará natural para você, assim como é para mim. Para praticar e testar regex eu utilizo o site regex101.com. Ele também tem um quiz para você testar seus conhecimentos, além de explicação da regex que você escreve e um guia de referência rápida resumindo todos os símbolos possíveis. Outros sites que já usei são o regexr.com e os testes do hackerrank.

Além disso, as minhas referências são o livro do Aurélio, que tem uma didática incrível (se estiver curioso, lê a resenha aqui no blog); e as documentações da mozilla (fica a referência do regex cheatsheet).

As expressões podem ser muito mais complexas do que eu mostrei aqui, mas o objetivo hoje era apresentar o essencial para conseguir trabalhar com regex. Se quiserem, podemos continuar dando dicas de regex: trazer as expressões avançadas, boas práticas de escrita e até alguns detalhes de performance, além de mais exemplos práticos. Se isso te interessa, vamos fazer um combinado: clica nas palminhas ali em baixo e compartilha esse post com todo mundo. Se ele for bastante lido, nós voltamos com uma continuação!

Perfil do autor: Carlos Magalhães | Google Certified Professional Data Engineer e Professional Cloud Architect. Atualmente desenvolvedor e Engenheiro de Dados na DP6, trabalha com coleta e estruturação de dados desde 2019.

Tem alguma dúvida sobre marketing digital?

Conheça o #DP6Responde. Você pode trazer todas as suas dúvidas e nós responderemos para você em formato de vídeo. Nosso time de especialistas é formado por profissionais com trajetórias fora da curva e que estão preparados para informar tudo o que você sempre quis saber sobre a cultura data-driven.

Clique aqui e envie sua pergunta para os nossos especialistas.

Outros canais da DP6

contato@dp6.com.br
Site:
https://www.dp6.com.br

DP6 News: https://info.dp6.com.br/dp6-news

LinkedIn: https://www.linkedin.com/company/dp6

Instagram: @somosdp6
Facebook: https://www.facebook.com/dp6.com.br

Podcast: https://anchor.fm/podcastdp6

YouTube: https://www.youtube.com/c/DP6br/videos

Projetos Open Source: https://dp6.github.io

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Published in Blog DP6

Blog da DP6 com novidades, boas práticas e recomendações do mundo de marketing digital. Web analytics, data visualization, DMP, Atribuição, mobile e outros tópicos são abordados no nosso blog.

No responses yet

Write a response