2010-11-04 81 views
1

我想变换文字,如:多行正则表达式替换

$$ 
foo 
bar 
$$ 

<% tex 
foo 
bar 
%> 

$\alpha$<% tex \alpha %>

对于单行替换,我这样做:

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

...并能正常工作。

现在,我加入了多标志赶上多一个:

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

...但它返回:

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

为什么?我确信这是件小事,但我无法想象出什么。

回答

8

我建议使用re.M(多行)标志,并吞噬一切不是美元符号在你的捕捉。

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

由于[^ \ $]包含换行符,此解决方案可以工作 - 甚至不需要多行标志。 – twneale 2010-11-05 00:23:51

+0

这一个工作:-) – leoluk 2010-11-05 01:02:03

+1

多行标志甚至位于错误的位置,因为第三个参数是“count”。如果有的话你应该做'flag = re.M'。 – cronos 2016-02-26 10:55:32