2010-11-04 165 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