re - Expressões Regulares
O módulo re corresponde, busca e substitui texto via regex. Compile padrões para reutilização; use strings brutas r"..." para escapes legíveis; prefira métodos de string quando regex for excessivo.
Receita
import re
EMAIL = re.compile(r"^[\w.+-]+@[\w-]+\.[\w.-]+$")
def valid_email(value: str) -> bool:
return bool(EMAIL.match(value))Quando usar isso:
- Análise e extração de logs
- Tokenização de texto estruturado, mas irregular
- Validação com limites de padrão conhecidos
- Substituições semelhantes a
sed - Divisão por espaços em branco variáveis
Exemplo de Trabalho
import re
LOG_LINE = re.compile(
r"^(?P<level>INFO|ERROR)\s+(?P<msg>.+)$"
)
def parse_log_lines(text: str) -> list[dict[str, str]]:
rows = []
for line in text.strip().splitlines():
m = LOG_LINE.match(line)
if m:
rows.append(m.groupdict())
return rows
sample = "INFO started\nERROR disk full\n"
print(parse_log_lines(sample))
redacted = re.sub(r"\b\d{4}-\d{4}-\d{4}-\d{4}\b", "[CARD]", "4111-1111-1111-1111")
print(redacted)O que isso demonstra:
- Grupos nomeados via
(?P<nome>...) matchancora o início;searchescaneia em qualquer lugarsubsubstitui padrões de dados sensíveis- Compile uma vez no nível do módulo para caminhos de acesso rápido
Mergulho Profundo
Métodos Comuns
| Método | Propósito |
|---|---|
re.search | Primeira correspondência em qualquer lugar |
re.match | Início da string |
re.findall | Todas as não sobrepostas |
re.sub | Substituir |
Flags
re.IGNORECASE,re.MULTILINE,re.DOTALLre.compile(..., flags)combina
Armadilhas
- Backtracking catastrófico - quantificadores aninhados maliciosos. Correção: limites possessivos, grupos atômicos ou timeout do motor de regex.
- Regex excessivo - validação de e-mail/URL incompleta em comparação com RFC real. Correção: padrão pragmático + verificação secundária.
- Recompilação em loop - lento. Correção: padrões compilados no nível do módulo.
- Confusão entre
matchesearch-matchperde correspondências no meio da string. Correção: escolha o método correto. \wdependente de localidade - surpresas com unicode. Correção: classes de caracteres explícitas[A-Za-z0-9_].
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| str.split/partition | Delimitador fixo | Padrão variável |
| parsimonious/lark | Linguagens de gramática | Extração simples |
| pandas str.extract | Dados em colunas | String única |
FAQs
String bruta é necessária?
Não é obrigatório, mas a clareza r"\n" vs "\\n" é fortemente recomendada.
Grupos em findall?
Retorna tuplas se houver múltiplos grupos de captura - use finditer para objetos.
Guloso vs. preguiçoso?
Quantificadores preguiçosos *?, +? - correspondem ao trecho mínimo.
Regex verboso?
re.compile(r"...", re.VERBOSE) permite comentários e espaços em branco no padrão.
Unicode?
Padrões de string unicode padrão em Python 3; use (?a) para apenas ASCII quando necessário.
Contagem de substituição?
sub(pattern, repl, s, count=1) limita as substituições.
Lookahead?
(?=...) lookahead positivo - afirma sem consumir.
Testando regex?
Casos controlados por tabela em pytest; documente o padrão na docstring.
JSON em regex?
Não analise JSON com regex - use o módulo json.
re vs regex PyPI?
O módulo regex adiciona recursos; a biblioteca padrão é suficiente para a maioria dos serviços.
Relacionados
- json & Serialização - analise estruturado em vez disso
- subprocess - analise a saída do comando
- Visão Geral da Biblioteca Padrão - mapa
- Strings & f-strings - noções básicas de texto
Versões de Stack: Esta página foi escrita para Python 3.14.0 (3.14 estável, 3.13 em manutenção), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ e uv 0.6+.