Reemplazo de expresiones regulares multilínea

Quiero transformar un texto como:

$$ foo bar $$ 

a

  

y $\alpha$ a .

Para reemplazar una sola línea, hice esto:

 re.sub(r"\$(.*)\$", r"", text) 

… y funciona bien.

Ahora, agregué la bandera multilínea para capturar la multilínea:

 re.sub(r"(?i)\$\$(.*)\$\$", r"", text) 

… pero vuelve:

  foo bar  

¿Por qué? Estoy seguro de que es algo trivial, pero no puedo imaginar qué.

Yo sugeriría usar la bandera re.M (multilínea), y engullir todo lo que no es un signo de dólar en su captura.

 >>> import re >>> t = """$$ foo bar $$""" >>> re.sub(r"\$\$([^\$]+)\$\$", r"<% tex \1 %>", t, re.M) '<% tex \nfoo\nbar\n %>' 

Con Python 2.7.12 he verificado que esto funcionará:

 >>> import re >>> t = """$$ ... foo ... bar ... $$""" >>> re.sub(r"\$\$(.*?)\$\$", r"<% tex \1 %>", t, flags=re.DOTALL) '<% tex \nfoo\nbar\n %>' 

En cuanto a la bandera DOTALL, según el documento oficial:

re.S

re.DOTALL

Hacer el ‘.’ el carácter especial coincide con cualquier carácter, incluida una nueva línea; sin esta bandera, ‘.’ coincidirá con cualquier cosa, excepto una nueva línea.