Expressões regulares em Python

Resumo : neste tutorial, você aprenderá sobre as expressões regulares do Python e como usar as funções de expressão regular mais comumente usadas.

Introdução às expressões regulares do Python

Expressões regulares (chamadas regex ou regexp) especificam padrões de pesquisa. Exemplos típicos de expressões regulares são os padrões de correspondência de endereços de e-mail, números de telefone e números de cartão de crédito.

Expressões regulares são essencialmente uma linguagem de programação especializada incorporada em Python. E você pode interagir com expressões regulares por meio do módulo integrado reem Python.

O seguinte mostra um exemplo de uma expressão regular simples:

'\d'Linguagem de código:  Python  ( python )

Neste exemplo, uma expressão regular é uma string que contém um padrão de pesquisa. O '\d'é um conjunto de caracteres de dígitos que corresponde a qualquer dígito de 0 a 9.

Observe que você aprenderá como construir padrões mais complexos e avançados nos próximos tutoriais. Este tutorial se concentra nas funções que lidam com expressões regulares.

Para usar esta expressão regular, siga estas etapas:

Primeiro, importe o remódulo:

import reLinguagem de código:  Python  ( python )

Segundo, compile a expressão regular em um Patternobjeto:

p = re.compile('\d')Linguagem de código:  Python  ( python )

Terceiro, use um dos métodos do Patternobjeto para corresponder a uma string:

s = "Python 3.10 was released on October 04, 2021"
result = p.findall(s)

print(result)Linguagem de código:  Python  ( python )

Saída:

['3', '1', '0', '0', '4', '2', '0', '2', '1']Linguagem de código:  Python  ( python )

O findall()método retorna uma lista de dígitos únicos na string s.

A seguir mostra o programa completo:

import re


p = re.compile('\d')
s = "Python 3.10 was released on October 04, 2021"

results = p.findall(s)
print(results)Linguagem de código:  Python  ( python )

Além do findall()método, o Patternobjeto possui outros métodos essenciais que permitem combinar uma string:

Método Propósito
match() Encontre o padrão no início de uma string
search() Retornar a primeira correspondência de um padrão em uma string
findall() Retornar todas as correspondências de um padrão em uma string
finditer() Retornar todas as correspondências de um padrão como um iterador

Funções de expressão regular Python

Além da Patternclasse, o remódulo possui algumas funções que casam uma string com um padrão:

  • match()
  • search()
  • findall()
  • finditer()

Essas funções têm os mesmos nomes dos métodos do Patternobjeto. Além disso, eles usam os mesmos argumentos dos métodos correspondentes do Patternobjeto. No entanto, você não precisa compilar manualmente a expressão regular antes de usá-la.

O exemplo a seguir mostra o mesmo programa que usa a findall()função em vez do findall()método de um Patternobjeto:

import re

s = "Python 3.10 was released on October 04, 2021."
results = re.findall('\d',s)
print(results)Linguagem de código:  Python  ( python )

Usar as funções do remódulo é mais conciso que os métodos do Patternobjeto porque você não precisa compilar expressões regulares manualmente.

Nos bastidores, essas funções criam um Patternobjeto e chamam o método apropriado nele. Eles também armazenam a expressão regular compilada em um cache para otimização de velocidade.

Isso significa que se você chamar a mesma expressão regular pela segunda vez, essas funções não precisarão recompilar a expressão regular. Em vez disso, eles obtêm a expressão regular compilada do cache.

Você deve usar as refunções ou métodos do Patternobjeto?

Se você usar uma expressão regular dentro de um loop , o Patternobjeto poderá salvar algumas chamadas de função. Porém, se você usar fora dos loops, a diferença é muito pequena devido ao cache interno.

As seções a seguir discutem as funções mais comumente usadas no remódulo, incluindo search(), match()e fullmatch().

função pesquisar()

A search()função procura um padrão dentro de uma string. Se houver uma correspondência, ele retornará o primeiro objeto Match ou, caso contrário, None. Por exemplo:

import re

s = "Python 3.10 was released on October 04, 2021."

pattern = '\d{2}'
match = re.search(pattern, s) 
print(type(match))
print(match)Linguagem de código:  Python  ( python )

Saída:

<class 're.Match'>
<re.Match object; span=(9, 11), match='10'>Linguagem de código:  Python  ( python )

Neste exemplo, a search()função retorna os dois primeiros dígitos da string scomo Matchobjeto.

Objeto de correspondência

O Matchobjeto fornece informações sobre a string correspondente. Possui os seguintes métodos importantes:

Método Descrição
group() Retorne a string correspondente
start() Retornar a posição inicial da partida
end() Retorne a posição final da partida
span() Retorna uma tupla (início, fim) que especifica as posições da correspondência

O exemplo a seguir examina o Matchobjeto:

import re


s = "Python 3.10 was released on October 04, 2021."
result = re.search('\d', s) 

print('Matched string:',result.group())
print('Starting position:', result.start())
print('Ending position:',result.end())
print('Positions:',result.span())Linguagem de código:  Python  ( python )

Saída:

Matched string: 3
Starting position: 7
Ending position: 8
Positions: (7, 8)Linguagem de código:  Python  ( python )

função match()

A função match() retorna um Matchobjeto se encontrar um padrão no início de uma string. Por exemplo:

import re

l = ['Python', 
    'CPython is an implementation of Python written in C', 
    'Jython is a Java implementation of Python',
     'IronPython is Python on .NET framework']

pattern = '\wython'
for s in l:
    result = re.match(pattern,s)
    print(result)Linguagem de código:  Python  ( python )

Saída:

<re.Match object; span=(0, 6), match='Python'>
None
<re.Match object; span=(0, 6), match='Jython'>
NoneLinguagem de código:  Python  ( python )

Neste exemplo, \wé o conjunto de caracteres de palavra que corresponde a qualquer caractere único.

Corresponde \wythona qualquer string que comece com qualquer caractere de palavra cantada e seja seguida pela string literal ython, por exemplo, Python.

Como a match()função só encontra o padrão no início de uma string, as seguintes strings correspondem ao padrão:

Python
Jython is a Java implementation of PythonLinguagem de código:  Python  ( python )

E a seguinte string não corresponde:

'CPython is an implementation of Python written in C'
'IronPython is Python on .NET framework'Linguagem de código:  Python  ( python )

função fullmatch()

A fullmatch()função retorna um Matchobjeto se toda a string corresponder a um padrão ou Nonenão. O exemplo a seguir usa a fullmatch()função para corresponder uma string com quatro dígitos:

import re

s = "2021"
pattern = '\d{4}'
result = re.fullmatch(pattern, s)
print(result)Linguagem de código:  Python  ( python )

Saída:

<re.Match object; span=(0, 4), match='2019'>Linguagem de código:  Python  ( python )

O padrão '\d{4}'corresponde a uma string com quatro dígitos. Portanto, a fullmatch()função retorna a string 2021.

Se você colocar o número 2021no meio ou no final da string, o fullmatch()retornará None. Por exemplo:

import re

s = "Python 3.10 released in 2021"
pattern = '\d{4}'
result = re.fullmatch(pattern, s)
print(result)Linguagem de código:  Python  ( python )

Saída:

NoneLinguagem de código:  Python  ( python )

Expressões regulares e strings brutas

É importante observar que Python e expressões regulares são linguagens de programação diferentes. Eles têm suas próprias sintaxes.

O remódulo é a interface entre as linguagens de programação Python e de expressão regular. Ele se comporta como um intérprete entre eles.

Para construir um padrão, as expressões regulares geralmente usam uma barra invertida, '\'por exemplo \d, e \w. Mas isso colide com o uso da barra invertida pelo Python para o mesmo propósito em literais de string.

Por exemplo, suponha que você precise corresponder à seguinte string:

s = '\section'Linguagem de código:  JavaScript  ( javascript )

Em Python, a barra invertida ( \) é um caractere especial. Para construir uma expressão regular, você precisa escapar de qualquer barra invertida precedendo cada uma delas com uma barra invertida ( \):

pattern = '\\section'Linguagem de código:  JavaScript  ( javascript )

Em expressões regulares, o padrão deve ser '\\section'. No entanto, para expressar esse padrão em uma string literal em Python, você precisa usar mais duas barras invertidas para escapar de ambas as barras invertidas novamente:

pattern = '\\\\section'Linguagem de código:  JavaScript  ( javascript )

Simplificando, para corresponder a uma barra invertida literal ( '\'), você deve escrever '\\\\'porque a expressão regular deve ser '\\'e cada barra invertida deve ser expressa como '\\'dentro de uma string literal em Python.

Isso resulta em muitas barras invertidas repetidas. Conseqüentemente, torna as expressões regulares difíceis de ler e compreender.

Uma solução é usar strings brutas em Python para expressões regulares porque strings brutas tratam a barra invertida ( \) como um caractere literal, não um caractere especial.

Para transformar uma string normal em uma string bruta, você a prefixa com a letra rou R. Por exemplo:

import re

s = '\section'
pattern = r'\\section'
result = re.findall(pattern, s)

print(result)
Linguagem de código:  JavaScript  ( javascript )

Saída:

['\\section']Linguagem de código:  JSON/JSON com comentários  ( json )

Observe que em Python ‘\section’ e ‘\\section’ são iguais:

p1 = '\\section'
p2 = '\section'

print(p1==p2) # trueLinguagem de código:  PHP  ( php )

Na prática, você encontrará expressões regulares construídas em Python usando strings brutas.

Resumo

  • Uma expressão regular é uma string que contém caracteres especiais para combinar uma string com um padrão.
  • Use o Patternobjeto ou funções no remódulo para procurar um padrão em uma string.
  • Use strings brutas para construir expressões regulares para evitar escapar das barras invertidas.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *