O guia do iniciante para expressões regulares com Python

Se você é um programador, é provável que já saiba o que são expressões regulares (regex). Os padrões Regex foram implementados em quase todas as linguagens de programação convencionais, mas ainda assim, o poder e a versatilidade desses padrões não são reconhecidos pela maioria dos desenvolvedores.

Este guia é sobre expressões regulares e como você pode usá-las na linguagem de programação Python.

O que são expressões regulares?

Expressões regulares são padrões que ajudam um usuário a combinar combinações de caracteres em arquivos de texto e strings. Você pode usar expressões regulares para filtrar ou encontrar um padrão específico na saída de um comando ou documento.

Existem vários casos de uso de expressões regulares, sendo o mais conhecido o comando grep no Linux . Outros aplicativos incluem a filtragem de informações, como a extração de endereços de e-mail e números de telefone de um despejo de dados.

A principal razão pela qual muitos desenvolvedores se desviam das expressões regulares é a falta de consciência sobre o poder da correspondência de padrões. Alguns até acham as expressões regulares confusas devido à grande quantidade de caracteres e sequências usadas nos padrões.

Qualquer que seja o motivo, as expressões regulares são e serão um dos aspectos mais importantes da programação que todos devem conhecer.

Expressões regulares: correspondência de caracteres e sequências

Regex é uma linguagem totalmente nova em si. Um mecanismo de regex interpreta padrões compostos por vários caracteres equipados com significados específicos. Literais básicos, como caracteres alfanuméricos, correspondem a si mesmos. Mas caracteres complexos como $, *, +, {, etc. ajudam na correspondência de ordem superior.

  1. Asterisco (*): Corresponde ao caractere anterior zero ou mais vezes. O significado literal do caractere seria "Elemento multiplicado n vezes". Por exemplo, se a expressão regular for abc * , as strings correspondentes serão ab, abc, abcc, abccc, abcccc, etc. A expressão [bc] * corresponderá a bc, bcbc, bcbc, etc.
  2. Mais (+): Corresponde ao caractere anterior uma ou mais vezes. O funcionamento do caractere + é semelhante a * , mas o caractere + omite o padrão se o caractere não ocorrer. Por exemplo, abc + corresponderá a abc, abcc, abccc, etc., mas não a ab.
  3. Ponto de interrogação (?): Corresponde ao caractere anterior zero ou uma vez (es). Por exemplo, o padrão abc? corresponderá apenas a ab e abc.
  4. Pipe (|): Usado como um operador OR binário. Corresponde a qualquer um dos caracteres anteriores e posteriores à barra vertical. Por exemplo, a | b corresponderá a a ou b.
  5. Ponto (.): Corresponde a um personagem cuja identidade é desconhecida. Por exemplo, ac corresponderá a aac, abc, acc, a2c e assim por diante.
  6. Cenoura (^): Corresponde ao primeiro caractere do padrão. Por exemplo, ^ Ra corresponderá a palavras que começam com Ra , como Coelho, Guaxinim e Aleatório.
  7. Dollar ($): Corresponde ao último caractere do padrão. Por exemplo, um $ corresponderá a palavras que terminam com um , como Van, Dan e Plano.
  8. Hífen (-): usado para definir um intervalo de caracteres. Por exemplo, [0-9] corresponderá a todos os caracteres numéricos de um dígito.

As sequências especiais usadas em padrões de expressão regular são:

  1. A: Retorna uma correspondência se os caracteres seguintes estiverem presentes no início da string. Por exemplo, AEle corresponderá palavras que começam com O , como O, Eles, Eles, etc.
  2. b: Retorna uma correspondência se o caractere for encontrado no início ou no final de uma palavra. Por exemplo, bmad e mad b corresponderão a palavras como feito e nômade, respectivamente.
  3. B: retorna uma correspondência se o caractere não for encontrado no início ou no final de uma palavra.
  4. d: Corresponde aos caracteres numéricos presentes na string. Por exemplo, / d * corresponderá a números como 1, 12, 1232, etc.
  5. D: Corresponde a caracteres não numéricos na string. / D corresponderá a a, b, c, f, etc.
  6. s: Corresponde a um caractere de espaço em branco no texto.
  7. S: Corresponde a um caractere diferente de espaço em branco no texto.
  8. w: Retorna uma correspondência se a string contiver caracteres alfanuméricos incluindo sublinhados. Por exemplo, w corresponderá a a, b, c, d, 1, 2, 3, etc.
  9. W: retorna uma correspondência se a string não contém caracteres alfanuméricos ou sublinhados.
  10. Z: Corresponde aos caracteres no final de uma string. Por exemplo, end Z corresponderá a palavras que terminam com end , como bend, emend, tend, etc.

Métodos Python para expressões regulares

Em Python, a biblioteca re fornece todas as funções e utilitários necessários para implementar regex em seus programas. Você não precisa baixar a biblioteca usando pip, pois ela vem pré-instalada com o interpretador Python.

Para importar a nova biblioteca em Python, adicione o seguinte código ao seu script:

 import re

Observe que, ao passar expressões regulares em Python, usamos strings brutas, pois elas não interpretam caracteres especiais como n e t de maneira diferente.

Partida()

O método re.match () em Python retorna um objeto regex se o programa encontrar uma correspondência no início da string especificada. Esta função leva dois argumentos básicos:

 re.match(pattern, string)

… onde pattern é a expressão regular e string é o texto que precisa ser pesquisado.

Dê uma olhada no trecho de código abaixo.

 import re
match = re.match(r'Word', "This sentence contains a Word")
print(match)

O caractere r antes da string significa string bruta.

Resultado:

 None

O código mencionado retorna None porque o Word não estava presente no início da string.

Se uma correspondência for encontrada, você pode imprimir a correspondência usando o método group () que pertence ao objeto regex.

 import re
match = re.match(r'Word', "Word is hard to read")
print(match.group(0))

Resultado:

 Word

O método re.search () aceita argumentos semelhantes a re.match (). Enquanto match () retorna apenas as correspondências presentes no início da string, search () retornará correspondências encontradas em qualquer índice da string.

 import re
match = re.search(r'Word', "This sentence contains a Word. Word is hard to read.")
print(match.group(0))

Observe que os métodos match () e search () retornarão apenas uma correspondência de padrão. No código mencionado acima, o Word aparece duas vezes. Mas a função search () irá corresponder apenas à primeira ocorrência da palavra.

 Word

Encontrar tudo()

Como você já pode imaginar, o método findall () retorna todas as correspondências possíveis na string.

 import re
match = re.search(r'Word', "This sentence contains a Word. Word is hard to read.")
for elem in match:
print(elem)

Em vez de retornar um objeto regex, a função findall () retorna uma lista de todas as correspondências. Você pode iterar pela lista usando um loop for em python .

Dividir()

Se você quiser dividir uma string em subcadeias usando um padrão como delimitador, a função split () é a que você precisa.

 import re
split = re.split(r'and', "This word and that and this are different.")
print(split)

Resultado:

 ['This word", "that", "this are different."]

Sub()

O método sub () permite que um usuário substitua uma palavra específica no lugar de um padrão. Leva os seguintes argumentos.

 re.sub(pattern, replacement, string)

Considere este snippet de código:

 import re
result = re.sub(r'and', 'or', "Dave and Harry must be punished.")
print(result)

Resultado:

 Dave or Harry must be punished.

Compilar()

O método re.compile () na biblioteca re permite que um usuário armazene uma versão compilada do padrão de expressão regular na memória. Em seguida, usando o objeto compilado, o usuário pode filtrar rapidamente o despejo de texto especificado para padrões correspondentes.

 import re
pattern = re.compile('Python')
match = pattern.findall("Python is a great language for writing scripts. Python is easy to learn.")
print(match)

Essa função é usada principalmente para salvar padrões que consomem muitos recursos e precisam de muito tempo para serem executados. Compilar e salvar o padrão como um objeto de antemão resolve esse problema.

Aproveite o poder do Regex com Python

Quando você está trabalhando com arquivos de texto e saída, regex é uma ótima ferramenta à sua disposição. Você pode escrever rapidamente algum código para filtrar ou substituir padrões específicos no documento.

Memorizar todos os caracteres e sequências correspondentes pode ser difícil se você está apenas começando com regex. Para melhorar as expressões regulares, consultar uma lista de caracteres, métodos e sequências de vez em quando definitivamente o ajudará a longo prazo.