Table of contents
Expressões regulares, também conhecidas como regex ou re, são sequências de caracteres que definem padrões de busca em textos 📝.
De forma breve, o regex no Python permite procurar, combinar, substituir e manipular textos de maneira eficiente. Alguns elementos essenciais incluem:
Importação do módulo
Para usar expressões regulares, é necessário importar o módulo 👇.
import re
Funções principais
re.search(padrão, string)
este procura a primeira ocorrência do padrão na string.
re.match(padrão, string)
este verifica se o padrão ocorre no inicio da string
re.findall(padrão, string)
este retorna todas as ocorrências do padrão na string.
re.sub(padrão, replace, string)
este substitui todas as ocorrências do padrão na string pelo texto de substituição.
📧Validar E-mail
Bora 🚀 criar um padrão para verificar estes email : fulano@alunos.edu.br
e fulano_2@alunos.br
import re
email = input("Email: ").strip()
if "@" in email:
print("valido")
else:
print("inválido")
Pronto!.
Só que não, este 👆 código verifica se há um "@" dentro de um email, mas se digitar somente @ estará válido. Se dividir em usuário
@ domínio
, pode ser interessante.
usuario, dominio = email.split("@")
# ['fulano','aluno.edu.br']
O split() 👆 vai dividir em usuário, domínio e vai retornar uma lista 📝, como sabemos que são dois valores, pode-se desempacotar diretamente nas variáveis como está no código acima.
import re
email = input("Email: ").strip()
if usuario and domain.endswith(".br"):
print("válido")
else:
print("inválido")
O problema é se por erro o usuário digita fulano@.br
estará válido, mas você e eu sabemos que não é válido na realidade.
Reproduzindo o mesmo código escrito, só que dessa vez usando regex 👇.
import re
email = input("Email: ").strip()
if re.search("@", email):
print("valido")
else:
print("invalido")
A documentação do 👉 regex está bem detalhada, aqui apresento uma lista pequena de alguns padrões:
.
qualquer caractere com exceção de nova linha*
0 ou mais repetições+
1 ou mais repetições?
0 ou 1 repetição^
indica onde começa$
indica onde termina[]
conjunto de caracteres\w
palavra, inclui número e '_'A|B
é A ou B(...)
grupo(?: ...)
não capturar essa versão
Bora 🚀 entender como funciona:
import re
email = input("Email: ").strip()
if re.search(".+@.+", email): #.+ igual ..*
print("válido")
else:
print("inválido")
Nesse 👆 código, .+
indica "qualquer caractere e pode repetir 1 ou mais vezes." O usuário não pode burlar, escrevendo simplesmente @ ou deixando em branco, mas pode burlar escrevendo qualquer palavra.
import re
email = input("Email: ").strip()
if re.search(r"^.+@.+\.br$", email):
print("válido")
else:
print("inválido")
Nesse👆 código há um melhor tratamento que o anterior, e este significa : "começa com qualquer caractere e pode repetir 1 ou mais vezes @ qualquer caractere e termina em .br" agora ficou limitado, mas ainda pode ser burlado escrevendo "@@" e ser válido. E repare que agora contem um r"... "
significa raw e serve para o python não interpretar o \ como nova linha.
import re
email = input("Email: ").strip()
if re.search(r"^[a-zA-Z0-9_]+@[a-zA-Z]+\.br$", email):
print("válido")
else:
print("inválido")
Aqui👆 significa " começa num conjunto (com qualquer letra do alfabeto minúscula ou maiúscula, incluindo número e ' _ ' ) e pode repetir 1 ou mais vezes @ conjunto (só letras do alfabeto) repete 1 ou mais vezes e termina em '.br' " Veja que neste caso temos [a-zA-Z0-9] = \w
import re
email = input("Email: ").strip()
if re.search(r"^\w+@[a-zA-Z]+\.br$", email):
print("válido")
else:
print("inválido")
re.search() tem um parâmetro chamado re.IGNORECASE
que ignora a formatação 👇.
import re
email = input("Email: ").strip()
if re.search(r"^(\w+\.)?(\w+\.)?\w+@(\w+\.)?\w+(\.edu|\.com|\.gov)?\.br$", email, re.IGNORECASE):
print("válido")
else:
print("inválido")
Nesse 👆 caso, (\w+\.)?
significa "qualquer letra- palavra e deve ter um ponto no final, e '?' indica que este pode ou não existir e não repete, ou seja, 0 ou 1" dessa forma valida os dois email que terminam em 👨"alunos.edu.br
" e 👨"alunos.br
" .
O (\.edu|\.com|\.gov)?
indica que " há um grupo que pode ser uma ou outra palavra dentro desse grupo e pode acontecer ou não (0,1)".
Com essa validação pode-se testar diferentes tipos de nomes compostos, e passar o teste (válido), mas ainda há um erro, se o usuário tiver nomes muito compostos tipo: 'fulano.1.cr7.2024.12@alunos.br
' será considerado "inválido".
Veja um exemplo de regex que alguns sites usam para validar e-mails e mesmo assim contem falhas ao validar 👇.
/(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])