Entendendo o comportamento do caractere "$" em expressões regulares no Python
- Ao usar o módulo
re do Python, é conhecido que ^ significa "início da string" e $ significa "fim da string".
- Porém,
$ nem sempre significa apenas "fim da string", e seu comportamento pode variar conforme a plataforma.
- No Python, quando o modo multilinha está desativado, o caractere
$ pode corresponder ao fim da string ou antes do caractere de nova linha no final da string.
Diferença entre corresponder ao fim da string e ao caractere de nova linha
- Com o modo multilinha desativado, no Python, para corresponder ao fim da string sem caractere de nova linha, não basta usar apenas
$.
- É possível usar
\z e \Z para corresponder ao fim da string.
- No Python, ao usar
re.MULTILINE, $ corresponde ao fim da string e ao fim de cada linha (logo antes do caractere de nova linha).
Comparação do comportamento de expressões regulares em várias plataformas
- Por meio de uma tabela que compara se há correspondência para o padrão em "cat\n" em várias plataformas, mostra-se que, se for permitido corresponder incluindo o caractere de nova linha, usar
$ no modo multilinha funciona de forma consistente.
- Para corresponder sem incluir o caractere de nova linha, deve-se usar
\z em todas as plataformas, exceto Python e ECMAScript; em Python e ECMAScript, deve-se usar respectivamente \Z ou $ sem modo multilinha.
Opinião do GN⁺
- Este artigo pode alertar desenvolvedores que usam expressões regulares sobre o comportamento inesperado do caractere
$ no Python.
- Expressões regulares são muito poderosas no processamento de strings, mas é enfatizado que é preciso cuidado, pois podem apresentar comportamentos diferentes conforme a plataforma.
- Desenvolvedores precisam estar cientes dessas diferenças e realizar testes adicionais para evitar problemas de compatibilidade ao desenvolver aplicações multiplataforma.
- Outras bibliotecas de expressões regulares que oferecem funcionalidades semelhantes incluem
java.util.regex do Java e System.Text.RegularExpressions do .NET, e também é necessário entender e usar corretamente as diferenças de comportamento de cada plataforma.
- Ao introduzir nova sintaxe ou novos comportamentos em expressões regulares, é preciso considerar a compatibilidade com o código existente, o impacto em desempenho e a curva de aprendizado da equipe, avaliando bem os benefícios e custos dessas mudanças.
1 comentários
Comentário do Hacker News
grep,sed,awk, Python etc.) trata isso, por padrão, como fim da linha.perlre: faz correspondência com o fim da string (ou antes da quebra de linha no fim da string; ou, com /m, antes de qualquer quebra de linha)