Tutorial: como funcionam as expressões regulares no Python!

Descubra agora as expressões regulares do Python: encontre padrões básicos e complexos, repetições ou faça correspondências, veja como trabalhar com as bibliotecas e muito mais!


Expressões regulares são usadas para identificar se existe um padrão em uma determinada sequência de caracteres (sequência) ou não. Eles ajudam na manipulação de dados textuais, o que geralmente é um pré-requisito para projetos de ciência de dados que envolvem mineração de texto.

Você deve ter encontrado alguma aplicação de expressões regulares: elas são usadas no servidor para validar o formato de endereços de email ou senha durante o registro, usadas para analisar arquivos de dados de texto para localizar, substituir ou excluir determinada string, etc.

Veja bem, expressões regulares são extremamente poderosas e, neste tutorial, você aprenderá a usá-las no Python.

Expressões regulares em Python

No Python, expressões regulares são suportadas pelo módulo re. Isso significa que, se você deseja começar a usá-los em seus scripts Python, precisará importar este módulo com a ajuda de import:

Expressões regulares no Python

Padrões básicos: caracteres comuns

Você pode lidar facilmente com muitos padrões básicos no Python usando os caracteres comuns. Caracteres comuns são as expressões regulares mais simples. Eles se combinam exatamente e não têm um significado especial em sua sintaxe de expressão regular.

Exemplos são ‘A’, ‘a’, ‘X’, ‘5’.

Caracteres comuns podem ser usados ​​para executar correspondências exatas simples:

Padrões básicos - caracteres comuns

A função match() retornará um objeto de correspondência se o texto corresponder ao padrão. Caso contrário, ele retornará None. O módulo re também contém várias outras funções e você aprenderá algumas delas posteriormente neste tutorial.

Por enquanto, vamos nos concentrar em personagens comuns! Você percebe o r no início do padrão Cookie?

Isso é chamado de literal de cadeia bruta. Muda conforme a string literal é interpretada. Tais literais são armazenados como aparecem.

Por exemplo,\ é apenas uma barra invertida quando prefixada com uma, em vez de r ser interpretada como uma sequência de escape. Você verá o que isso significa com caracteres especiais . Às vezes, a sintaxe envolve caracteres com escape de barra invertida e, para impedir que esses caracteres sejam interpretados como sequências de escape, use o prefixo bruto r . Você realmente não precisa disso para este exemplo, no entanto, é uma boa prática usá-lo para obter consistência.

Caracteres Curinga: Caracteres Especiais

Caracteres especiais são caracteres que não se combinam como vistos, mas que na verdade têm um significado especial quando usados ​​em uma expressão regular.

Os caracteres especiais mais usados ​​são:

.– Um periodo. Corresponde a qualquer caractere único, exceto o caractere de nova linha.

re.search(r'Co.k.e', 'Cookie').group()
'Cookie'

A função group() retorna a string correspondida por re. Você verá esta função com mais detalhes posteriormente.

\w– minúsculas w. Corresponde a qualquer letra, dígito ou sublinhado.

re.search(r'Co\wk\we', 'Cookie').group()
'Cookie'

\W– Maiúsculas w. Corresponde a qualquer caractere que não faça parte de \ w (w minúsculo).

re.search(r'C\Wke', '[email protected]').group()
'[email protected]'

\s– s minúsculas. Corresponde a um único caractere de espaço em branco, como: space, newline, tab, return.

re.search(r'Eat\scake', 'Eat cake').group()
'Eat cake'

\S– Maiúsculas. Corresponde a qualquer caractere que não faça parte de \ s (letras minúsculas).

re.search(r'Cook\Se', 'Cookie').group()
'Cookie'

\t– t minúsculo. Guia Correspondências.

re.search(r'Eat\tcake', 'Eat    cake').group()
'Eat\tcake'
  • \n– Letras minúsculas n. Corresponde a nova linha.
  • \r– r minúsculo. Correspondências retornam.
  • \d– minúsculo d. Corresponde ao dígito decimal de 0 a 9.
re.search(r'c\d\dkie', 'c00kie').group()
'c00kie'

^– Caret. Corresponde a um padrão no início da sequência.

re.search(r'^Eat', 'Eat cake').group()
'Eat'

$ – Corresponde a um padrão no final da string.

re.search(r'cake$', 'Eat cake').group()
'cake'
  • [abc] – Corresponde a ou b ou c.
  • [a-zA-Z0-9]– Corresponde a qualquer letra de (a a z) ou (A a Z) ou (0 a 9). Os caracteres que não estão dentro de um intervalo podem ser correspondidos complementando o conjunto. Se o primeiro caractere do conjunto for ^, todos os caracteres que não estão no conjunto serão correspondidos.
re.search(r'Number: [0-6]', 'Number: 5').group()
'Number: 5'
# Corresponde a qualquer caractere, exceto 5
re.search(r'Number: [^5]', 'Number: 0').group()
'Number: 0'

\A– Maiúsculas a. Corresponde apenas no início da string. Funciona em várias linhas também.

re.search(r'\A[A-E]ookie', 'Cookie').group()
'Cookie'

\b– minúsculas b. Corresponde apenas ao início ou final da palavra.

re.search(r'\b[A-E]ookie', 'Cookie').group()
'Cookie'

\– Barra invertida. Se o caractere após a barra invertida for um caractere de escape reconhecido, o significado especial do termo será adotado. Por exemplo, \n é considerado como nova linha. No entanto, se o caractere a seguir a \não for um caractere de escape reconhecido, ele \será tratado como qualquer outro caractere e transmitido.

Vejamos alguns exemplos:

# Isso verifica se há '\' na string em vez de '\t' devido ao '\' usava 
re.search(r'Back\\stail', 'Back\stail').group()
'Back\\stail'
# Isso trata '\s' como um personagem de escape, porque falta '\' no começo de '\s'
re.search(r'Back\stail', 'Back tail').group()
'Back lash'

Repetições

Torna-se bastante tedioso se você procura encontrar padrões longos em uma sequência. Felizmente, o módulo re lida com repetições usando os seguintes caracteres especiais:

  • + – Verifica se há um ou mais caracteres à esquerda.
re.search(r'Co+kie', 'Cooookie').group()
'Cooookie'

* – Verifica zero ou mais caracteres à sua esquerda.

# Verifica qualquer ocorrência de a ou o ou ambos na sequência especificada
re.search(r'Ca*o*kie', 'Caokie').group()
'Caokie'

? – Verifica exatamente zero ou um caractere à sua esquerda.

# Verifica exatamente zero ou uma ocorrência de a ou o ou ambos na sequência especificada
re.search(r'Colou?r', 'Color').group()
'Color'

Mas e se você quiser verificar o número exato de repetições de sequência?

Por exemplo, verificando a validade de um número de telefone em um aplicativo. Omódulo re lida com isso muito bem, usando as seguintes expressões regulares no Python:

{x} – Repita exatamente x número de vezes.

{x,} – Repita pelo menos x vezes ou mais.

{x, y} – Repita pelo menos x vezes, mas não mais que y vezes.

re.search(r'\d{9,10}', '0987654321').group()
'0987654321'

Os +*qualificadores estão a ser dito greedy.

Grupos e agrupamentos usando expressões regulares

Suponha que, quando você estiver validando endereços de e-mail e deseje verificar o nome de usuário e o host separadamente.

É quando o recurso group da expressão regular é útil. Ele permite que você escolha partes do texto correspondente.

Partes de um padrão de expressão regular delimitado por parênteses () são chamadas groups. O parêntese não altera o que a expressão corresponde, mas forma grupos dentro da sequência correspondente. Você tem utilizado a função group()o tempo todo nos exemplos deste tutorial. A planície match.group()sem nenhum argumento ainda é o texto correspondente, como de costume.

Tutorial Expressão regular do Python

Correspondência Greedy x Não Greedy

Quando um caractere especial corresponde ao máximo possível da sequência de busca (string), é considerado “Correspondência gananciosa”. É o comportamento normal de uma expressão regular, mas às vezes esse comportamento não é desejado:

pattern = "cookie"
sequence = "Cake and cookie"

heading  = r'<h1>TITLE</h1>'
re.match(r'<.*>', heading).group()
'<h1>TITLE</h1>'

O padrão <.*> corresponde a toda a cadeia, até a segunda ocorrência de >.

No entanto, se você quisesse apenas corresponder à primeira tag <h1>, poderia ter usado o qualificador ganancioso *? que corresponder ao mínimo de texto possível.

Adicionar ? depois do qualificador faz com que ele execute a partida de maneira não gananciosa ou mínima; Ou seja, o menor número possível de caracteres será correspondido. Quando você corre <.*>, você só terá uma correspondência <h1>.

heading  = r'<h1>TITLE</h1>'
re.match(r'<.*?>', heading).group()
'<h1>'

Biblioteca Python re

A biblioteca re em Python fornece várias funções que a tornam uma habilidade que vale a pena dominar. Você já viu alguns deles, como o re.search()re.match(). Vamos verificar algumas funções úteis em detalhes:

  • search(pattern, string, flags=0)

Com essa função, você percorre a sequência / sequência especificada procurando o primeiro local em que a expressão regular produz uma correspondência. Ele retorna um objeto de correspondência correspondente, se encontrado, caso contrário, retorna None se nenhuma posição na string corresponder ao padrão. Observe que None é diferente de encontrar uma correspondência de comprimento zero em algum momento da string.

pattern = "cookie"
sequence = "Cake and cookie"

re.search(pattern, sequence).group()
'cookie'
  • match(pattern, string, flags=0)

Retorna um objeto de correspondência correspondente se zero ou mais caracteres no início da string corresponderem ao padrão None. Caso contrário, ele retornará, se a sequência não corresponder ao padrão especificado.

pattern = "C"
sequence1 = "IceCream"

# Nenhuma partida desde "C" não está no início de "IceCream"
re.match(pattern, sequence1)
sequence2 = "Cake"

re.match(pattern,sequence2).group()
'C'

search() versus match()

A função match()verifica uma correspondência apenas no início da string (por padrão) enquanto a função search() verifica uma correspondência em qualquer lugar da string.

  • findall(pattern, string, flags=0)

Localiza todas as correspondências possíveis em toda a sequência e as retorna como uma lista de cadeias. Cada sequência retornada representa uma correspondência.

email_address = "Entre em contato conosco em: [email protected], [email protected]"

#'addresses' é uma lista que armazena toda a correspondência possível
addresses = re.findall(r'[\w\.-][email protected][\w\.-]+', email_address)
para endereço em addresses: 
    print(address)
[email protected]
[email protected]
  • sub(pattern, repl, string, count=0, flags=0)

Essa é a função substitute. Retorna a sequência obtida substituindo ou substituindo as ocorrências de padrão não sobrepostas mais à esquerda na sequência pela substituição repl. Se o padrão não for encontrado, a sequência será retornada inalterada.

email_address = "Entre em contato conosco em: [email protected]"
new_email_address = re.sub(r'([\w\.-]+)@([\w\.-]+)', r'[email protected]', email_address)
print(new_email_address)
Favor contate-nos por: [email protected]
  • compile(pattern, flags=0)

Compila um padrão de expressão regular em um objeto de expressão regular . Quando você precisar usar uma expressão várias vezes em um único programa, usar a função compile()para salvar o objeto de expressão regular resultante para reutilização é mais eficiente. Isso ocorre porque as versões compiladas dos padrões mais recentes passadas compile()e as funções de correspondência no nível do módulo são armazenadas em cache.

pattern = re.compile(r"cookie")
sequence = "Cake and cookie"
pattern.search(sequence).group()
'cookie'
# This is equivalent to:
re.search(pattern, sequence).group()
'cookie'

Dica : o comportamento de uma expressão pode ser modificado especificando um valor flags. Você pode adicionar flag como argumento extra às várias funções que você viu neste tutorial. Algumas das bandeiras utilizadas são: IGNORECASEDOTALLMULTILINEVERBOSE, etc.

Estudo de caso: Trabalhando com expressões regulares

Agora que você viu como funciona as expressões regulares no Python, estudando alguns exemplos, é hora de sujar as mãos! Neste estudo de caso, você colocará seu conhecimento para trabalhar!

Compartilhe

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on whatsapp
WhatsApp
Share on print
imprimir
Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on print

O que achou deste artigo?

Leia também