As expressões regulares são poderosas ferramentas de busca e manipulação de texto, amplamente utilizadas em diversas áreas, incluindo o processamento de linguagem natural (PLN). Elas permitem que você defina padrões complexos de texto e realize operações avançadas, como validação de dados, extração de informações e substituição de caracteres.
No contexto do PLN, as expressões regulares desempenham um papel crucial na análise e manipulação de textos. Elas possibilitam a identificação de entidades nomeadas, a detecção de padrões em frases, a normalização de dados e muito mais. Com sua capacidade de lidar com a complexidade da linguagem natural, as expressões regulares se tornaram uma ferramenta indispensável para desenvolvedores e pesquisadores nessa área.
Exemplos de Padrões de Busca em Python
Para os nossos exemplos utilizaremos a biblioteca python re (regular expression).
- Busca por um padrão simples:
import re
text = "O gato brinca com a bola."
pattern = "gato"
match = re.search(pattern, text)
if match:
print("Padrão encontrado:", match.group())
else:
print("Padrão não encontrado.")
Explicação: O código usa a função re.search()
para procurar o padrão "gato"
no texto "O gato brinca com a bola."
. Se o padrão for encontrado, a função match.group()
retorna a correspondência.
- Busca por um padrão com metacaracteres:
import re
text = "123 Rua dos Bobos, número 0"
pattern = r"\d+"
matches = re.findall(pattern, text)
print("Números encontrados:", matches)
Explicação: O código usa a função re.findall()
para encontrar todos os padrões que correspondem a um ou mais dígitos (\d+
) no texto "123 Rua dos Bobos, número 0"
. O resultado é uma lista contendo todas as correspondências.
- Busca por um padrão com repetição:
import re
text = "Hoje é um dia lindo!"
pattern = r"i{2}"
matches = re.findall(pattern, text)
print("Correspondências:", matches)
Explicação: O código usa a função re.findall()
para encontrar todas as ocorrências do padrão "i{2}"
, que corresponde a duas letras “i” consecutivas, no texto "Hoje é um dia lindo!"
. O resultado é uma lista contendo todas as correspondências.
- Busca por um padrão com alternância:
import re
text = "Gato, Rato, Pato"
pattern = r"G|R"
matches = re.findall(pattern, text)
print("Letras encontradas:", matches)
Explicação: O código usa a função re.findall()
para encontrar todas as ocorrências do padrão "G|R"
, que corresponde à letra “G” ou à letra “R”, no texto "Gato, Rato, Pato"
. O resultado é uma lista contendo todas as correspondências.
- Busca por um padrão com âncoras:
import re
text = "Python é uma linguagem incrível!"
pattern = r"^Python"
match = re.search(pattern, text)
if match:
print("Padrão encontrado no início da string:", match.group())
else:
print("Padrão não encontrado no início da string.")
Explicação: O código usa a função re.search()
para procurar o padrão "^Python"
, que corresponde à palavra “Python” no início da string, no texto "Python é uma linguagem incrível!"
. A âncora ^
indica o início da string. Se o padrão for encontrado, a função match.group()
retorna a correspondência.
- Busca por um padrão com classes de caracteres:
import re
text = "Hoje é um dia lindo!"
pattern = r"[aeiou]"
matches = re.findall(pattern, text)
print("Vogais encontradas:", matches)
Explicação: O código usa a função re.findall()
para encontrar todas as ocorrências de qualquer vogal ([aeiou]
) no texto "Hoje é um dia lindo!"
. O resultado é uma lista contendo todas as correspondências.
- Busca por um padrão com negação de classe de caracteres:
import re
text = "Hoje é um dia lindo!"
pattern = r"[^aeiou]"
matches = re.findall(pattern, text)
print("Consoantes encontradas:", matches)
Explicação: O código usa a função re.findall()
para encontrar todas as ocorrências de qualquer caractere que não seja uma vogal ([^aeiou]
) no texto "Hoje é um dia lindo!"
. O resultado é uma lista contendo todas as correspondências.
- Busca por um padrão com intervalos:
import re
text = "Tenho 25 anos."
pattern = r"\d{2}"
match = re.search(pattern, text)
if match:
print("Número encontrado:", match.group())
else:
print("Número não encontrado.")
Explicação: O código usa a função re.search()
para procurar o padrão "\d{2}"
, que corresponde a exatamente dois dígitos, no texto "Tenho 25 anos."
. Se o padrão for encontrado, a função match.group()
retorna a correspondência.
- Busca por um padrão com grupos de captura:
import re
text = "Nome: João Silva, Idade: 30 anos."
pattern = r"(\w+) (\w+), Idade: (\d+)"
match = re.search(pattern, text)
if match:
print("Nome:", match.group(1))
print("Sobrenome:", match.group(2))
print("Idade:", match.group(3))
else:
print("Padrão não encontrado.")
Explicação: O código usa a função re.search()
para procurar o padrão "(\w+) (\w+), Idade: (\d+)"
, que corresponde a um nome, um sobrenome e uma idade, no texto "Nome: João Silva, Idade: 30 anos."
. Os grupos de captura ()
permitem acessar as correspondências individuais usando match.group(index)
.
- Busca por um padrão com lookahead:
import re
text = "Hoje é um dia lindo! Amanhã será um dia ainda mais lindo."
pattern = r"lindo\b(?=.*ainda mais)"
match = re.search(pattern, text)
if match:
print("Padrão encontrado:", match.group())
else:
print("Padrão não encontrado.")
Explicação: O código usa a função re.search()
para procurar o padrão "lindo\b(?=.*ainda mais)"
, que corresponde à palavra “lindo” seguida de um limite de palavra (\b
) e um lookahead positivo ((?=.*ainda mais)
) que verifica se a string contém “ainda mais” em algum lugar depois de “lindo”, no texto "Hoje é um dia lindo! Amanhã será um dia ainda mais lindo."
. Se o padrão for encontrado, a função match.group()
retorna a correspondência.
Tabela de Metacaracteres Comuns
.
– Corresponde a qualquer caractere, exceto nova linha.^
– Indica o início de uma string.$
– Indica o final de uma string.*
– Corresponde a zero ou mais ocorrências do padrão anterior.+
– Corresponde a uma ou mais ocorrências do padrão anterior.?
– Corresponde a zero ou uma ocorrência do padrão anterior.{n}
– Corresponde exatamente a n ocorrências do padrão anterior.{n,}
– Corresponde a n ou mais ocorrências do padrão anterior.{n,m}
– Corresponde entre n e m ocorrências do padrão anterior.[]
– Define uma classe de caracteres, correspondendo a qualquer caractere dentro dos colchetes.[^]
– Define uma classe de caracteres negada, correspondendo a qualquer caractere que não esteja dentro dos colchetes.|
– Operador de alternância, corresponde a um padrão ou outro.()
– Grupos de captura, permite agrupar padrões e capturar correspondências.\
– Escapa um metacaractere, permitindo que ele seja tratado como um caractere literal.
As expressões regulares são uma ferramenta poderosa e versátil no processamento de texto, especialmente no processamento de linguagem natural. Com a capacidade de definir padrões complexos e realizar buscas e manipulações de maneira eficiente, elas se tornaram essenciais para desenvolvedores e pesquisadores. Ao dominar o uso de expressões regulares em Python, você pode aprimorar suas habilidades de análise de texto e abrir portas para novas possibilidades em projetos de PLN. Continue explorando e praticando, e você rapidamente se tornará um especialista em expressões regulares!
Para mais conteúdo relacionado, não esqueça de visitar nossos posts aqui no Janela do Dev.