多行正则替换

5 投票
2 回答
19300 浏览
提问于 2025-04-16 06:35

我想把一段文本像这样:

$$
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 个回答

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

这个标志让句点(.)这个特殊字符可以匹配任何字符,包括换行符;如果没有这个标志,句点就只能匹配除了换行符以外的其他字符。

12

我建议你使用 re.M(多行)这个标志,并且在捕获时尽量把除了美元符号以外的所有内容都抓取到。

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

撰写回答