re.sub Python com uma bandeira não substitui todas as ocorrências

votos
41

Os docs Python dizer:

re.MULTILINE: Quando especificado, o personagem padrão '^' corresponde ao início da cadeia e no início de cada linha (imediatamente após cada nova linha) ... Por padrão, '^' corresponde apenas no início da cadeia ...

Então o que está acontecendo quando eu recebo 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.'
Publicado 03/09/2008 em 22:00
fonte usuário
Em outras línguas...                            


3 respostas

votos
95

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 a contagem, e não como uma bandeira.

Você precisa compilar o regex se você quiser usar bandeiras.

re.sub(re.compile('^//', re.MULTILINE), '', s)

Um flagsargumento foi adicionado em Python 2.7, de modo que a definição completa é agora:

re.sub(pattern, repl, string[, count, flags])

O que significa que:

re.sub('^//', '', s, flags=re.MULTILINE)

trabalho.

Respondeu 03/09/2008 em 22:08
fonte usuário

votos
8
re.sub('(?m)^//', '', s)
Respondeu 25/03/2010 em 17:10
fonte usuário

votos
6

A definição completa de re.subé:

re.sub(pattern, repl, string[, count, flags])

O que significa que se você contar Python quais são os parâmetros, então você pode passar flagssem passar count:

re.sub('^//', '', s, flags=re.MULTILINE)

ou, de forma mais concisa:

re.sub('^//', '', s, flags=re.M)
Respondeu 30/08/2011 em 19:33
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more