Aperfeiçoe suas habilidades em manipulação de texto com Expressões Regulares (Regex) e Replace em Python
Tags: regex, python, programming, datascience
Published: 2023-07-11 09:22:42

A manipulação de texto é uma tarefa essencial em muitos projetos de programação, e o Python oferece recursos poderosos para lidar com padrões de texto complexos. Expressões regulares (Regex) e a função de substituição (replace) são ferramentas fundamentais nesse contexto. Neste artigo, vamos explorar de forma detalhada como usar a biblioteca `re` do Python para aplicar substituições em padrões de texto usando expressões regulares, além de fornecer exemplos didáticos para facilitar o entendimento.

O que são expressões regulares?
Expressões regulares são sequências de caracteres que definem um padrão de busca. Elas são úteis para encontrar, validar e manipular padrões de texto complexos. No Python, podemos usar o módulo `re` para trabalhar com expressões regulares, que fornece várias funções, incluindo `search`, `match`, `findall` e `sub`.

A função `sub` e a substituição de padrões:
A função `sub` é usada para substituir padrões de texto encontrados em uma string por um novo valor. Ela possui a seguinte sintaxe:
```python
re.sub(pattern, replacement, string)
```
- `pattern`: o padrão de busca (expressão regular) que desejamos encontrar.
- `replacement`: o valor pelo qual queremos substituir o padrão.
- `string`: a string na qual desejamos realizar a substituição.

Exemplos detalhados e didáticos:

## **1 - Removendo números de telefone de uma string:**
Suponha que temos uma string que contém números de telefone e queremos removê-los completamente. Podemos fazer isso usando a função `sub` em conjunto com uma expressão regular simples que identifica números de telefone:
```python
import re

texto = "Entre em contato pelo número (123) 456-7890 ou no celular 98765-4321."

resultado = re.sub(r'\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}', '', texto)

print(resultado)
```
Neste exemplo, a expressão regular `\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}` busca por padrões que se assemelham a números de telefone, como "(123) 456-7890" e "98765-4321". Ao utilizar a função `sub`, substituímos esses padrões por uma string vazia, removendo-os completamente do texto de origem.

## **2 - Substituindo palavras repetidas:**
Vamos supor que temos um texto com palavras duplicadas e queremos corrigir essas duplicações. Podemos utilizar a função `sub` em conjunto com uma expressão regular que identifica palavras repetidas:
```python
import re

texto = "Este este é um exemplo exemplo de duplicação de palavras."

resultado = re.sub(r'\b(\w+)\s+\1\b', r'\1', texto)

print(resultado)
```
Nesse exemplo, a expressão regular `\b(\w+)\s+\1\b` busca por palavras duplicadas. Ao utilizar a função `sub`, substituímos essas duplicações pela primeira ocorrência da palavra, resultando em um texto sem palavras repetidas.

## **3 - Removendo espaços em excesso:**
Suponha que temos uma string com vários espaços consecutivos e queremos substituí-los por apenas um espaço. Podemos usar a função `sub` em conjunto com uma expressão regular que identifica espaços em excesso:
```python
import re

texto = "Este   texto     possui  espaços em     excesso."

resultado = re.sub(r'\s+', ' ', texto)

print(resultado)
```
Nesse exemplo, a expressão regular `\s+` identifica uma ou mais ocorrências de espaços em branco. Ao utilizar a função `sub`, substituímos esses espaços consecutivos por um único espaço, resultando em um texto com espaços em excesso removidos.

## **4 - Destrinchando as possibilidades:**

- `\(?`: O caractere `\(` corresponde a um parêntese aberto literalmente. O caractere `?` indica que o parêntese aberto é opcional. Portanto, essa parte da expressão permite que um texto contenha ou não um parêntese aberto.

- `\d{3}`: A sequência `\d` corresponde a qualquer dígito numérico. O quantificador `{3}` indica que deve haver exatamente 3 dígitos consecutivos. Portanto, essa parte da expressão busca por um bloco de três dígitos numéricos consecutivos.

- `\)?`: O caractere `\)` corresponde a um parêntese fechado literalmente. O caractere `?` indica que o parêntese fechado é opcional. Portanto, essa parte da expressão permite que um texto contenha ou não um parêntese fechado.

- `[-.\s]?`: Essa parte da expressão procura por um caractere que pode ser um hífen (`-`), um ponto (`.`) ou um espaço em branco (`\s`). O caractere `?` indica que essa sequência é opcional. Portanto, essa parte da expressão permite que um texto contenha ou não um caractere de pontuação ou espaço após o bloco de três dígitos.

- `\d{3}`: Essa parte da expressão busca por um bloco de três dígitos numéricos consecutivos.

- `[-.\s]?`: Essa parte é semelhante à explicação anterior. Ela procura por um caractere opcional de pontuação ou espaço em branco após o segundo bloco de três dígitos.

- `\d{4}`: Essa parte da expressão busca por um bloco de quatro dígitos numéricos consecutivos.

Agora, vamos explorar diversos exemplos de como aplicar essa expressão regular em outras situações:

4.1 - Encontrar e substituir endereços de e-mail:
Suponha que você tenha um texto com várias ocorrências de endereços de e-mail e deseje substituí-los por uma palavra genérica, como "EMAIL". Você pode usar a expressão regular com a função `sub` da seguinte maneira:
```python
import re

texto = "Entre em contato pelo e-mail exemplo1@example.com ou no endereço exemplo2@example.com."

resultado = re.sub(r'\b\w+@\w+\.\w+\b', 'EMAIL', texto)

print(resultado)
```
Saída:
```
Entre em contato pelo e-mail EMAIL ou no endereço EMAIL.
```
Nesse exemplo, a expressão regular `\b\w+@\w+\.\w+\b` busca por padrões que correspondem a endereços de e-mail. A função `sub` substitui todos os endereços de e-mail encontrados por "EMAIL".

4.2 - Padronizar datas em um formato específico:
Suponha que você tenha um texto com datas em diferentes formatos e queira padronizá-las no formato "dd/mm/aaaa". Você pode usar a expressão regular com a função `sub` da seguinte maneira:
```python
import re

texto = "As datas podem ser 01/12/2022, 10-02-2023 ou 2024/03/20."

resultado = re.sub(r'(\d{2})[-./](\d{2})[-./](\d{4})', r'\2/\1/\3', texto)

print(resultado)
```
Saída:
```
As datas podem ser 12/01/2022, 02/10/2023 ou 20/03/2024.
```
Nesse exemplo, a expressão regular `(\d{2})[-./](\d{2})[-./](\d{4})` busca por padrões que correspondem a datas em diferentes formatos. A função `sub` reorganiza os grupos de dígitos encontrados para o formato "dd/mm/aaaa", substituindo as datas originais.

4 - Remover tags HTML de um texto:
Suponha que você tenha um texto com várias tags HTML e queira remover todas elas, deixando apenas o conteúdo textual. Você pode usar a expressão regular com a função `sub` da seguinte maneira:
```python
import re

texto = "<h1>Título</h1><p>Parágrafo de exemplo</p><a href='https://exemplo.com'>Link</a>"

resultado = re.sub(r'<.*?>', '', texto)

print(resultado)
```
Saída:
```
Título Parágrafo de exemplo Link
```
Nesse exemplo, a expressão regular `<.*?>` busca por padrões que correspondem a tags HTML. A função `sub` substitui todas as tags encontradas por uma string vazia, removendo-as do texto.

Esses exemplos ilustram como a expressão regular \(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4} pode ser adaptada e aplicada em diferentes contextos para manipulação de texto de forma eficiente e precisa.

---

As expressões regulares em conjunto com a função `sub` do módulo `re` do Python fornecem uma maneira poderosa e flexível de manipular padrões de texto. Neste artigo, exploramos de forma detalhada como usar expressões regulares com a função `sub` para substituir padrões de texto. Os exemplos didáticos demonstram o uso prático dessas técnicas, permitindo que você aprimore suas habilidades em manipulação de texto e resolva desafios relacionados a padrões específicos em seus projetos Python.