Python 3.15 torna re.match() obsoleto em favor de re.prefixmatch
O Python 3.15 marca re.match() como obsoleto de forma branda em favor do novo re.prefixmatch(). Nada quebra, nada avisa e não há remoção prevista.
Por Claire Whitmore
3 min de leitura
Traduzido automaticamente do original em inglês, que Claire Whitmore verificou e editou. Prevalece a versão em inglês. Como trabalhamos

Em números
- Python version adding re.prefixmatch()
- 3.15
- runtime warnings a soft deprecation emits
- 0
O Python 3.15 acrescenta uma função chamada re.prefixmatch() e, em seu lugar, marca o re.match(), com 30 anos de idade, como obsoleto de forma branda. As duas fazem exatamente a mesma coisa. A mudança é sobre o nome, porque match significa a coisa errada em Python desde que a função existe.
A documentação do Python 3.15 para o módulo re expõe o motivo de forma direta. O novo nome é "mais explicitamente descritivo", diz ela, e os desenvolvedores devem usá-lo "para expressar melhor a intenção". Na maioria das outras linguagens, observa a documentação, match se refere ao comportamento que o Python sempre chamou de search().
O problema do nome
O re.match() do Python olha apenas o início de uma string. Ele se ancora na posição zero e para por ali. O re.search() percorre a string inteira procurando o padrão em qualquer posição.
A maioria das outras linguagens faz o contrário. O "match" delas é o "search" do Python. Quem chega do JavaScript, do Ruby ou do Go lê re.match() e espera, com razão, que ele encontre o padrão em qualquer lugar. Não encontra, e o erro que se segue é silencioso: o código simplesmente devolve None para uma entrada que deveria ter tratado.
re.match("world", "hello world") # None - ancorado no início
re.prefixmatch("world", "hello world") # None - mesma função, nome mais claro
re.search("world", "hello world") # corresponde
Hugo van Kemenade apresentou o argumento em um post publicado em 10 de setembro de 2026, citando o Zen do Python: "Explícito é melhor que implícito. Quem ler o nome prefixmatch() provavelmente entenderá a semântica pretendida."
Tanto a função no nível do módulo quanto o método dos padrões compilados recebem o novo nome. O re.Pattern.prefixmatch() acompanha o re.prefixmatch() na 3.15.
O que "obsoleto de forma branda" significa de verdade
A obsolescência branda é um processo específico definido na PEP 387, a política de compatibilidade retroativa do Python. Ela é bem mais fraca que uma obsolescência normal, e a diferença importa para quem mantém código antigo.
| Obsolescência branda | Obsolescência normal | |
|---|---|---|
| Aviso em tempo de execução | Nenhum | DeprecationWarning |
| Remoção agendada | Não | Sim, em uma versão definida |
| Continua documentada e testada | Sim | Sim, até a remoção |
| Recebe novos recursos | Não | Não |
A PEP 387 a define como "usar uma API que não deve mais ser usada para escrever código novo, mas que continua seguro usar em código existente". Ela também diz com clareza que a obsolescência branda "não emite aviso: é apenas mencionada na documentação".
Ou seja, o re.match() continua funcionando. Não há remoção agendada. Sua suíte de testes não vai começar a imprimir avisos ao migrar para a 3.15, e o python -W error não vai falhar por causa disso.
Qual das quatro usar
O módulo re agora oferece quatro formas de aplicar um padrão a uma string. Elas diferem apenas quanto ao lugar em que o padrão pode estar.
| Função | Corresponde | Adicionada na |
|---|---|---|
re.prefixmatch() | Somente no início | 3.15 |
re.match() | Somente no início, obsoleta de forma branda | 1.5 |
re.search() | Em qualquer ponto da string | 1.5 |
re.fullmatch() | A string inteira, do início ao fim | 3.4 |
O que isso significa para os desenvolvedores
Não há nada urgente a fazer. Esta é a rara mudança de API que não pede migração, não define prazo e não quebra código.
Em código novo na 3.15 ou posterior, escreva re.prefixmatch(). O nome diz a quem ler depois o que a chamada de fato faz, e é esse justamente o objetivo da mudança.
Para o código existente, o exercício útil não é um localizar e substituir. É uma auditoria. Cada chamada a re.match() na sua base de código é um ponto em que alguém pode ter querido dizer re.search(). Os testes não perceberiam isso se sempre passaram apenas entradas em que o padrão ficava no começo. Esses são erros reais anteriores à 3.15, e um grep rápido acha os candidatos mais depressa que qualquer ferramenta.
Tenha cuidado, porém, ao migrar direto para re.prefixmatch() numa biblioteca. Chamá-la faz o seu pacote exigir Python 3.15 ou mais recente, e re.match() é a grafia portátil entre versões até que a sua versão mínima suportada alcance esse patamar. Bases de código grandes convivem anos com essa diferença; os desenvolvedores do EVE Online começaram a migração para o Python 3 muito depois da separação de versões.
Vale reparar no sinal mais amplo. O time central do Python está disposto a gastar um nome novo e uma nota na documentação apenas para que uma API antiga seja lida corretamente, sem obrigar ninguém a mudar uma linha. Esse é um tipo barato de faxina, e quanto mais o Python fizer isso, menos retornos None silenciosos a próxima geração de desenvolvedores Python terá de depurar.
Fontes
- Soft-deprecating re.match() - hugovk.dev
- re - Regular expression operations (Python 3.15) - Python documentation
- What's New In Python 3.15 - Python documentation
- PEP 387 - Backwards Compatibility Policy - Python Enhancement Proposals
Artigos relacionados

Falha no SAP Cloud SDK for Python pode vazar segredos do OAuth2
Uma falha com CVSS 10.0 no SAP Cloud SDK for Python permite que atacantes redirecionem solicitações de tokens OAuth2 e roubem segredos de aplicativos. A versão 0.45.2 e posteriores corrigem o problema.

Fedora 45 chega com RPM 6.1, que bloqueia pacotes sem assinatura
O Fedora 45 saiu em 3 de novembro com o RPM 6.1, que recusa pacotes sem assinatura. Um teste do Tech AI Wire no Fedora 44 e no 45 mostra o erro e as soluções.

JIT do CPython será removido após a retirada da PEP 836
Os autores da PEP 836 a retiraram em 19 de outubro de 2026, então agora se espera que o compilador JIT experimental do CPython seja removido da branch main.