Skip to content
Tech AI Wire

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 Tech AI Wire Team

3 min de leitura

XLinkedIn
The Python 3.15 documentation page for the re module, showing the soft-deprecation note attached to re.match().

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 brandaObsolescência normal
Aviso em tempo de execuçãoNenhumDeprecationWarning
Remoção agendadaNãoSim, em uma versão definida
Continua documentada e testadaSimSim, até a remoção
Recebe novos recursosNãoNã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çãoCorrespondeAdicionada na
re.prefixmatch()Somente no início3.15
re.match()Somente no início, obsoleta de forma branda1.5
re.search()Em qualquer ponto da string1.5
re.fullmatch()A string inteira, do início ao fim3.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

  1. Soft-deprecating re.match() - hugovk.dev
  2. re - Regular expression operations (Python 3.15) - Python documentation
  3. What's New In Python 3.15 - Python documentation
  4. PEP 387 - Backwards Compatibility Policy - Python Enhancement Proposals

Artigos relacionados