代码之家  ›  专栏  ›  技术社区  ›  Mei Zhang

regex sub忽略字符串结尾字符

  •  0
  • Mei Zhang  · 技术社区  · 4 年前

    为什么要打印这个python代码 |ab|| 而不是 |ab|d\nefgh| c

    import re
    
    s = re.sub(
        "^(.*){1}c(.*){2}$",
        "|\\1|\\2|",
        """abcd
        efgh""",
        flags=re.DOTALL,
        count=1
    )
    print(s)
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   PacketLoss    4 年前

    似乎没有必要 {1} {2} 在这里。只要把它们取下来,它就会像你想的那样工作。

    ^(.*)c(.*)
    
    re.sub(
        "^(.*)c(.*)",
        "|\\1|\\2|",
        """abcd
        efgh""",
        flags=re.DOTALL,
    )
    '|ab|d\n    efgh|'
    
        2
  •  1
  •   The fourth bird    4 年前

    你得到这个结果的原因是 {2}

    第一次迭代有您想要的部分,但是再次重复它,组值将作为 .* 可以匹配0+个字符。


    使用 (.*)c c ,也可以使用求反字符类。

    如果使用原始字符串表示法 r"\1" 你不需要双反斜杠

    ^([^c]*)c(.*)
    

    Regex demo

    import re
    
    s = re.sub(
        "^([^c]*)c(.*)",
        r"|\1|\2|",
        """abcd
        efgh""",
        flags=re.DOTALL,
        count=1
    )
    print(s)
    

    输出

    |ab|d
        efgh|