Python re.sub com um sinalizador não substitui todas as ocorrências
-
09-06-2019 - |
Pergunta
Os documentos do Python dizem:
re.MULTILINE:Quando especificado, o caractere padrão '^' corresponde ao início da string e ao início de cada linha (imediatamente após cada nova linha)...Por padrão, '^' corresponde apenas ao início da string...
Então, o que acontece quando obtenho o seguinte resultado inesperado?
>>> import re
>>> s = """// The quick brown fox.
... // Jumped over the lazy dog."""
>>> re.sub('^//', '', s, re.MULTILINE)
' The quick brown fox.\n// Jumped over the lazy dog.'
Solução
Veja a definição de re.sub
:
sub(pattern, repl, string[, count])
O quarto argumento é a contagem, você está usando re.MULTILINE
(que é 8) como contagem, não como bandeira.
Você deve compilar seu regex se desejar usar sinalizadores.
re.sub(re.compile('^//', re.MULTILINE), '', s)
A flags
argumento foi adicionado no Python 2.7, então a definição completa agora é:
re.sub(pattern, repl, string[, count, flags])
O que significa que:
re.sub('^//', '', s, flags=re.MULTILINE)
funciona.
Outras dicas
re.sub('(?m)^//', '', s)
A definição completa de re.sub
é:
re.sub(pattern, repl, string[, count, flags])
O que significa que se você disser ao Python quais são os parâmetros, poderá passar flags
sem passar count
:
re.sub('^//', '', s, flags=re.MULTILINE)
ou, mais concisamente:
re.sub('^//', '', s, flags=re.M)