多行正则表达式替换

时间:2010-11-04 23:59:20

标签: python regex

我想转换像:

这样的文字
$$
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  %>

为什么呢?我确定这是微不足道的,但我无法想象。

2 个答案:

答案 0 :(得分:9)

我建议使用re.M(多线)标记,并在捕获中吞噬所有不是美元符号的内容。

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

答案 1 :(得分:1)

使用python 2.7.12 我已验证这可以正常工作:

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

关于DOTALL标志,根据官方文件:

  

re.S

     

re.DOTALL

     

设为“。”特殊字符与处的任何字符匹配   全部,包括换行符;没有此标志,“。”会匹配任何东西   除了换行符。