Python RegEx: uma introdução a Regex com Python

RegEx é uma das coisas mais legais e úteis que aprendi no ano passado! Cada vez que uso, aprendo algo novo!

O que é uma expressão regular?

Expressões regulares (Regex) são símbolos usados ​​para representar um conjunto de strings. Possui aplicativos em várias linguagens e programas (por exemplo, em Forms e Data Studio). Com ele podemos:
Encontre todos os links na documentação;
Pesquisar e-mails, telefonemas;
remover/substituir caracteres indesejados;
texto normalizado/normalizado;
Corpora de processo para realizar o processamento de linguagem natural.

Biblioteca

Em python, o pacote que permite expressões regulares é o re.
reimportar
Existem alguns métodos neste pacote:

re.match: Determina se a expressão regular corresponde ao início da string. Retorna a posição da string de pesquisa.
re.search: varre toda a string, procurando a primeira posição em que essa expressão regular corresponde. Retorna a posição da string de pesquisa.
re.findall: Encontre todas as substrings que correspondam à expressão regular e as retorne como uma lista. Retorna uma lista de strings encontradas.
re.finditer: Localiza todas as substrings que correspondem à expressão regular e as retorna como um iterador.
re.sub: Encontre onde esta expressão regular corresponde e faça a substituição desejada. Retorna a string na qual a substituição foi realizada.

Vamos fazer alguns testes:

Já o finditer me retorna um objeto, que pode ser iterado:

E isso sim, me retorna as posições de ambas as palavras ‘regex’:

Finalmente, isso substitui a palavra ‘analisado’ por ‘avaliado’, resultando em: ‘Uma frase que será avaliada por regex porque regex é legal e útil’

OK, conhecemos o básico do método. Vamos um passo além.

Breve pano de fundo histórico

Eu sei que o que é realmente interessante é a prática, mas também é importante saber que o conceito de expressões regulares deriva da teoria da linguagem formal e da teoria dos autômatos, ambas parte do que chamamos de teoria da computação.

Cada uma das teorias citadas poderia ser discutida em um artigo exclusivo, mas de forma simples, os conceitos matemáticos foram fundidos através delas no que hoje conhecemos como ciência da computação, fundamento fundamental da tecnologia da informação.

Conceitos iniciais de sintaxe RegEx

Agora, para começar, vamos ter uma ideia aproximada de uma sintaxe bem simples.

Demonstrarei o uso desses conceitos na prática usando o regex101, uma ferramenta de construção e análise de expressões regulares. Use os links para ver exemplos práticos de cada tópico.

Caracteres amplos e exatos RegEx

Lembre-se de que você está escrevendo uma sequência padrão de caracteres, e cada caractere que você escreve pode ser classificado de duas maneiras:

Como um caractere exato: “a” refere-se especificamente ao caractere “a”;
Como metacaractere: “.” é o que chamamos de curinga, que se refere a qualquer caractere.
Se você deseja pesquisar especificamente por “.”, você precisa usar o padrão “\.”. (tente modificar e pesquisar especificamente por “.”).

Nos tópicos a seguir, apresentarei alguns outros metacaracteres para nos ajudar a construir padrões de pesquisa.

Marcadores de linha inicial e final (^ e $) RegEx

Esses sinalizadores indicam que você considera relevante apenas a ocorrência do padrão selecionado no início ou no final de uma linha. exemplo:

^Python – Encontra qualquer string que esteja em início de linha e contenham os caracteres “Python”.

Python$ – Encontra qualquer string que esteja em fim de linha e contenham os caracteres “Python”.

Marcadores de quantidade (* + ? e {}) RegEx

Os marcadores de quantidade representam repetições de um caractere ou sequência de caracteres em um padrão. exemplo:

Pyt* – Encontra strings com a sequência de caracteres “Py” seguida de zero ou mais ocorrências do caractere “t”.

Pyt+ – Encontra strings com a sequência de caracteres “Py” seguida de uma ou mais ocorrências do caractere “t”.

Pyt? – Encontra strings com a sequência de caracteres “Py” seguida de zero ou uma ocorrência do caractere “t”.

Pyt{3} – Encontra strings com a sequência de caracteres “Py” seguida de exatamente 3 ocorrências do caractere “t”.

Pyt{2, 4} – Encontra strings com a sequência de caracteres “Py” seguida de 2 a 4 ocorrências do caractere “t”.

Pyt{3,} – Encontra strings com a sequência de caracteres “Py” seguida de 3 ou mais ocorrências do caractere “t”.

Para utilizar uma sequência de caracteres na repetição, utilize () para demarcar a sequência a que você quer se referir. Exemplo:

Py(th)* – Encontra strings com a sequência de caracteres “Py” seguida de zero ou mais ocorrências do da sequência “th”.

Marcador de alternativa ou operador OR ( | )

Este token é usado para inserir caracteres alternativos ou sequências de caracteres no padrão. Na prática, funciona como o operador OR na sequência representada no esquema. exemplo:

Pyt|hon – Encontra strings com a sequência de caracteres “Pyt” ou strings com a sequência de caracteres “hon”.

Py(t|h) – Encontra strings com a sequência de caracteres “Py” seguida do caractere “t” ou do caractere “h”.

Py(t|h|o) – Encontra strings com a sequência de caracteres “Py” seguida do caractere “t” ou do caractere “h” ou do caractere “o”.

Marcador de definição de Conjuntos ([ ])

Usando este sinalizador, podemos definir um conjunto de caracteres para combinações de padrões. O último exemplo do tópico anterior pode ser reescrito da seguinte forma:

Py[tho] – Encontra strings com a sequência de caracteres “Py” seguida de um caractere pertencente ao conjunto (t, h, o).

Outros exemplos comuns de conjuntos utilizados:

Py[0-9] – Encontra strings com a sequência de caracteres “Py” seguida de um caractere pertencente ao conjunto de dígitos de 0 a 9.

Py[a-z] – Encontra strings com a sequência de caracteres “Py” seguida de um caractere pertencente ao conjunto de caracteres alfabéticos de “a” a “z”.

Marcadores de classes de caracteres (\w, \d, \s e .)

\w – Representa um caractere alfanumérico, incluindo ocorrências maiúsculas e minúsculas das letras e o caractere “_”.

\d – Representa um caractere numérico e equivale a definição do conjunto [0-9]

\s – Representa um espaço em branco, incluindo tabulações e quebras de linha

. – Como já mencionado, este caractere é utilizado como coringa e representa qualquer caractere.

A utilização de \W, \D e \S serve como negação de suas correspondentes descritas acima. \W vai encontrar, por exemplo, qualquer caractere que não seja relevante para \w.

Casos de uso de Py RegEx

maneira mais comum de usar o Python RegEx é pesquisar texto ou páginas da Web em busca de strings que correspondam a um padrão.

O script de raspagem da web cada vez mais popular é o exemplo atual, mas expressões regulares têm sido usadas em busca de palavras e algoritmos de substituição desde os primeiros editores de texto.

Algumas expressões regulares usadas em problemas cotidianos são:

Padrão para CPF;
Padrão para CEP;
Padrão para telefones;
Padrão para endereços de email;
Padrão para domínios DNS.
Python RegEx: O poder do Regex em conjunto com Python

Ok. Você deve estar se perguntando “E o Python RegEx, quando entra?”.

Por si só, Regex é uma maneira flexível de descrever padrões de interesse em strings. Combine isso com linguagens de programação para criar algoritmos, scripts e programas que realmente se descrevem como soluções.

Em Python RegEx, a biblioteca para manipulação de expressões regulares é re:

No Python 3, basta usar r” ” para criar um padrão Python RegEx. Então, se quiséssemos atribuir o padrão “Pyt*” do primeiro exemplo à variável x, poderíamos usar:

A partir daí, você pode aproveitar os métodos das bibliotecas acima para manipular strings por meio de expressões regulares.

Os tópicos a seguir descrevem os métodos mais comuns da biblioteca re.

Método re.match(default, string, flags=0)

Este método é usado para verificar se uma string contém um padrão específico. Seu correto funcionamento requer a passagem de dois parâmetros, para simplificar a demonstração, não utilizamos mais o parâmetro flags.

Por exemplo, se quiséssemos criar uma função que verificasse a estrutura do CPF (excluindo a relação matemática que deve estar contida entre os números do CPF), poderíamos declará-la da seguinte forma:

Eu uso cast to boolean (bool) porque o método match não retorna simplesmente True ou False. Se a string contiver o padrão especificado, o método retornará um objeto da classe Match, que possui outros métodos, que não serão descritos neste artigo.

O método findall é usado para retornar uma lista de ocorrências ou grupos de ocorrências de um padrão em uma string. Ele também requer argumentos de padrão e string para funcionar, e não cobrirei os argumentos de sinalizador novamente para simplificar o método.

Imagine que ao invés de validar o formato de um CPF, você deseja encontrar todos os CPFs contidos em uma string. Uma função pode ser escrita da seguinte forma:

Os mais atentos notarão que o mesmo padrão de string é descrito usando uma sintaxe diferente, neste caso CPF.

Não usei a notação de grupos de caracteres separados por ( ) , pois o método findall retorna uma lista de tuplas contendo os padrões referenciando os grupos respectivamente, neste caso queremos apenas obter uma lista de CPFs.

Muitas soluções para problemas cotidianos podem ser criadas usando esses métodos, mas muitas outras estão disponíveis na documentação oficial da biblioteca.

Por que aprender expressões regulares em Python RegEx?

As ideias apresentadas no artigo são básicas e envolvem uma compreensão simples dos conceitos Python ReGex, ou seja, as bibliotecas regex e python re.

Mesmo assim, a gama de situações em que eles podem ser usados ​​é enorme. Desde a simples manipulação de strings em arquivos de texto até a varredura de páginas da Web em busca de padrões de interesse.

Aprender a usar Python ReGex ou qualquer outra linguagem de programação pode acelerar a resolução de problemas relacionados ao trabalho com strings ou texto.

Quer aprender mais? Comente!