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.
- 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.
- 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.
- 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.
- 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.
- Ponto (.): Corresponde a um personagem cuja identidade é desconhecida. Por exemplo, ac corresponderá a aac, abc, acc, a2c e assim por diante.
- 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.
- Dollar ($): Corresponde ao último caractere do padrão. Por exemplo, um $ corresponderá a palavras que terminam com um , como Van, Dan e Plano.
- 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:
- 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.
- 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.
- B: retorna uma correspondência se o caractere não for encontrado no início ou no final de uma palavra.
- d: Corresponde aos caracteres numéricos presentes na string. Por exemplo, / d * corresponderá a números como 1, 12, 1232, etc.
- D: Corresponde a caracteres não numéricos na string. / D corresponderá a a, b, c, f, etc.
- s: Corresponde a um caractere de espaço em branco no texto.
- S: Corresponde a um caractere diferente de espaço em branco no texto.
- 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.
- W: retorna uma correspondência se a string não contém caracteres alfanuméricos ou sublinhados.
- 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
Procurar()
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.