Torne os scripts Python mais inteligentes com regex: 5 exemplos práticos

por Nada Em Troca
7 minutos de leitura
7 maneiras úteis de manipular um arquivo de texto com Python

Se você trabalha com strings em seus scripts Python e está escrevendo uma lógica obscura para processá-las, então você precisa examinar regex em Python. Ele permite descrever padrões em vez de escrever lógica processual. Vejamos alguns exemplos do mundo real onde o Python re módulo torna os scripts mais inteligentes.

Valide entradas sorrateiras do usuário

Ao validar a entrada do usuário sem regex, você provavelmente escreveu um código que parecia errado. Suponha que você queira validar um nome de usuário com estas regras:

  • Apenas letras, números e sublinhados
  • Deve começar com uma letra
  • Comprimento entre 3 e 16 caracteres

Este é um requisito comum. Vamos ver o que você precisa fazer sem usar Python re módulo:

def is_valid_username(username):     if len(username) < 3 or len(username) > 16:         return False      if not username[0].isalpha():         return False      for char in username:         if not (char.isalnum() or char == "_"):             return False      return True

Isso funciona,​​​​ mas é detalhado, fácil de bagunçar e cada nova regra significa adicionar mais lógica. É exatamente aí que o re módulo brilha. Você descreve as regras declarativamente usando re.compile() e use esse padrão em todos os lugares:

import re  USERNAME_PATTERN = re.compile(r"^[a-zA-Z][a-zA-Z0-9_]{2,15}$")  def is_valid_username(username):     return bool(USERNAME_PATTERN.fullmatch(username)) 
Validando nomes de usuário com diversas regras usando o módulo re do Python.

Vamos entender o que está acontecendo.

  • ^: Isso indica o início da string
  • [a-zA-Z]: Deve começar com uma letra
  • [a-zA-Z0-9_]{2,15}: Os caracteres permitidos e o comprimento restante
  • $: Isso indica o fim da string

Depois de começar a validar entradas com refica difícil voltar atrás. Você expressa as regras diretamente e o Python faz o trabalho pesado.

Logotipo do Python sobre fundo desfocado do código Python, com a palavra 'Python' escrita em amarelo embaixo.
6 razões pelas quais o Python interativo é uma virada de jogo para mim

Nenhum programa? Sem problemas!

1
Por David Delony

Extraia dados de texto confuso

Em algum momento, todo script Python se transforma em um texto confuso. Arquivos de log, capturas de pacotes, e-mails, HTML copiado, entre outros. O desafio é criar essa estrutura sem escrever código de análise frágil, linha por linha.

Imagine que você está processando um arquivo de log de um aplicativo e deseja extrair carimbos de data/hora e mensagens de erro. Uma linha de log típica pode ser assim:

[2025-01-02 14:33:21] ERROR: Connection timed out after 30 seconds

Você pode tentar assim:

def parse_log_line(line):     if not line.startswith("["):         return None      parts = line.split("]")     timestamp = parts[0][1:]      if "ERROR:" not in parts[1]:         return None      message = parts[1].split("ERROR:")[1].strip()     return timestamp, message

Isso funciona exatamente para o formato que você testou. Mas é frágil. Espaços extras, colchetes ausentes ou palavras ligeiramente diferentes podem quebrar a lógica. Além disso, a intenção do código está enterrada na ginástica de cordas. Com o re módulo, você pode descrever a estrutura da linha em vez de cortá-la manualmente.

import re  LOG_PATTERN = re.compile(     r"[(?P[d-: ]+)]s+ERROR:s+(?P.+)" )  def parse_log_line(line):     match = LOG_PATTERN.search(line)     if not match:         return None      return match.group("timestamp"), match.group("message") 
Extraindo dados de arquivos de log usando o módulo re do Python.

Aqui, dizemos ao Python exatamente o que estamos procurando: um carimbo de data/hora entre colchetes, seguido pela palavra “ERRO”, seguido pelo resto da mensagem.

Limpe e normalize o texto em uma linha

A limpeza de texto é uma daquelas tarefas que parece simples até que você realmente a execute. Freqüentemente, você precisa lidar com espaços em branco extras, separadores inconsistentes, pontuação aleatória ou peculiaridades de formatação que tornam a lógica posterior irritante.

Digamos que você esteja processando um texto enviado pelo usuário e queira normalizá-lo antes de armazená-lo ou compará-lo. Suas regras são:

  • Remover espaços em branco à esquerda e à direita
  • Substitua vários espaços, tabulações ou novas linhas por um único espaço
  • Remova caracteres não alfanuméricos (exceto espaços)
  • Converta tudo para letras minúsculas

Sem usar reuma abordagem típica pode ser assim:

def clean_text(text):     text = text.strip()     text = text.replace("n", " ").replace("t", " ")          while "  " in text:         text = text.replace("  ", " ")          cleaned = []     for char in text:         if char.isalnum() or char == " ":             cleaned.append(char)      return "".join(cleaned).lower()

Isso não é terrível, mas é barulhento. A intenção está espalhada por loops e operações repetidas. E se quiser ajustar as regras, você voltará a editar várias linhas.

Com Python re.sub()você pode descrever padrões de bagunça em vez de lidar com eles um caso de cada vez.

import re  def clean_text(text):     text = re.sub(r"s+", " ", text) # normalize whitespace     text = re.sub(r"[^a-zA-Z0-9 ]", "", text) # remove punctuation     return text.strip().lower()
Limpando e normalizando texto bagunçado usando o módulo do Python.

Essa é a mesma lógica, expressada com muito mais clareza.

7 maneiras úteis de manipular um arquivo de texto com Python

Pare de brigar com seus arquivos e use Python para concluir todas as tarefas rotineiras.

Por Zunaid Ali

Localizar e substituir inteligente

Todo programador Python sabe str.replace(). É simples, rápido e perfeitamente adequado, até que você precise de contexto. O momento em que sua substituição depende de onde algo aparece, do que o rodeia ou de parte do que você combinou, str.replace() fica sem vapor.

Imagine que você está trabalhando com registros ou dados exportados que contêm informações confidenciais e deseja mascarar endereços de e-mail antes de armazenar ou compartilhar o arquivo.

User john.doe@example.com logged in from 10.0.0.5

Você quer isso:

User ***@example.com logged in from 10.0.0.5 

Usando métodos básicos de string, isso rapidamente fica estranho:

def mask_email(text):     words = text.split()     masked = []      for word in words:         if "@" in word:             username, domain = word.split("@", 1)             masked.append("***@" + domain)         else:             masked.append(word)      return " ".join(masked) 

Isso pressupõe que os e-mails são separados por espaço, não lidam bem com a pontuação e misturam análise com lógica de substituição. Com re.sub()você pode combinar endereços de e-mail diretamente e substituir apenas a parte de seu interesse.

import re  EMAIL_PATTERN = re.compile(r"([w.-]+)@([w.-]+.w+)")  def mask_emails(text):     return EMAIL_PATTERN.sub(r"***@2", text)
Mascarando endereços de e-mail de um arquivo de log usando o módulo re do Python.

Aqui, Python re módulo faz o trabalho pesado. O padrão encontra strings semelhantes a e-mail em qualquer lugar do texto, os grupos de captura isolam o nome de usuário e o domínio e a substituição reutiliza parte da correspondência por meio de 2. Isso é encontrar e substituir com consciência.

Analisar dados semiestruturados

Mesmo em uma situação de nicho, quando alguns dados não estão estruturados de forma limpa e em formato totalmente livre, o Python re módulo silenciosamente salva o dia. Suponha que você receba strings como esta:

name=John age=32 role=admin active=true 

Seu objetivo é transformar isso em um dicionário. O formato é consistente, mas não há garantias sobre espaçamento, ordem ou quais chaves aparecem. Você apenas sabe que é uma sequência de pares de valores-chave. Como primeira tentativa, você pode tentar split():

def parse_kv_string(text):     result = {}     parts = text.split()      for part in parts:         if "=" not in part:             continue         key, value = part.split("=", 1)         result[key] = value      return result

Isso funciona até que os valores se tornem mais complexos, o espaçamento seja alterado ou você queira validação. Mais uma vez, a lógica para encontrar os dados e processá-los está fortemente interligada.

Com Python re.findall()você pode descrever a estrutura diretamente e deixar o mecanismo fazer a varredura.

import re  KV_PATTERN = re.compile(r"(w+)=([^s]+)")  def parse_kv_string(text):     return dict(KV_PATTERN.findall(text))
Transformar dados semiestruturados, como pares de valores-chave, em dicionários usando o módulo re do Python.

Esse padrão único expressa todo o formato: uma chave semelhante a uma palavra, seguida pelo sinal de igual (=), seguida por um valor sem espaço em branco. Python re módulo extrai todos os pares em uma passagem.

Logotipo do Python sobre fundo desfocado do código Python, com a palavra 'Python' escrita em amarelo embaixo.
8 usos práticos para o módulo Python os

Construindo a ponte entre Python e seu sistema operacional.

3
Por Zunaid Ali

Se você é um programador Python que evita regex, comece aos poucos. Usar re.fullmatch() para validação. Tentar re.sub() na próxima vez que você estiver limpando o texto. Assim que os padrões clicarem, você se verá escrevendo scripts mais curtos que fazem mais.

Este artigo foi útil?
Gostei0Não Gostei0

Deixe um comentário

Are you sure want to unlock this post?
Unlock left : 0
Are you sure want to cancel subscription?
-
00:00
00:00
Update Required Flash plugin
-
00:00
00:00