代码之家  ›  专栏  ›  技术社区  ›  leoluk

多行regex替换

  •  1
  • leoluk  · 技术社区  · 14 年前

    我想将文本转换为:

    $$
    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 回复  |  直到 6 年前
        1
  •  9
  •   Ryan Ginstrom    14 年前

    我建议你使用re.m(多行)标志,把你捕获的所有东西都吃光,而不是一个美元符号。

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

    使用python 2.7.12 我已经证实这是可行的:

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

    对于Dotall标志,根据官方文件:

    R.S

    关于.dotall

    使“.”特殊字符与中的任何字符匹配 全部,包括换行符;如果没有此标志,“”将匹配任何内容 除了换行。