2010-11-04 5 views
1

Je veux transformer un texte comme:multiligne Regex remplacer

$$ 
foo 
bar 
$$ 

à

<% tex 
foo 
bar 
%> 

et $\alpha$ à <% tex \alpha %>.

Pour la seule ligne remplacer, je l'ai fait:

re.sub(r"\$(.*)\$", r"<% tex \1 %>", text) 

... et il fonctionne très bien.

Maintenant, j'ai ajouté le drapeau multiligne pour attraper le multiligne un:

re.sub(r"(?i)\$\$(.*)\$\$", r"<% tex \1 %>", text) 

... mais il retourne:

<% tex %> 
foo 
bar 
<% tex %> 

Pourquoi? Je suis sûr que c'est quelque chose de trivial, mais je ne peux pas imaginer quoi.

Répondre

8

Je vous suggère d'utiliser le drapeau re.M (multiligne), et d'engloutir tout ce qui n'est pas un signe de dollar dans votre capture.

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

Cette solution fonctionne - et n'a même pas besoin du drapeau multiligne, puisque [^ \ $] inclut des sauts de ligne. – twneale

+0

celui-ci fonctionne :-) – leoluk

+1

Le drapeau multiligne est même à la mauvaise position, puisque le troisième argument est 'count'. Si du tout vous devriez faire 'flag = re.M'. – cronos