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

正则表达式将多个空格替换为同一类型的1

  •  1
  • Mittenchops  · 技术社区  · 5 年前

    我有以下文字:

    text = """
    This is multiple spaces:   see.
    
    This is multiple newlines:
    
    
    
    This is multiple tabs:      Done.
    """
    

    >>> p = re.sub(r"\s{1,}", "\1", text, flags=re.MULTILINE)
    >>> p
    '\x01This\x01is\x01multiple\x01spaces:\x01see.\x01This\x01is\x01multiple\x01newlines:\x01This\x01is\x01multiple\x01tabs:\x01Done.\x01'
    
    

    text = """
    This is multiple spaces: see.
    This is multiple newlines:
    This is multiple tabs:  Done.
    """
    
    2 回复  |  直到 5 年前
        1
  •  2
  •   pho    5 年前

    它不起作用,因为

    1. 您没有任何捕获组。你需要做一个。将正则表达式更改为 r"(\s){1,}" ,或 "r(\s)+"
    2. "\\1" r"\1"

    此代码提供所需的输出:

    p = re.sub(r"(\s){1,}", r"\1", text, flags=re.MULTILINE)
    
        2
  •  1
  •   Jacob Lee    5 年前

    我使用了一个肯定的lookback来检查在1个或多个相同的空白类型之前是否有1个特定的空白类型。只有制表符、空格和换行符时,正则表达式如下所示:

    r"((?<= ) +|(?<=\t)\t+|(?<=\n)\n+)"

    然而 string

    ' \t\n\r\x0b\x0c'

    所以,我只是使用了一些列表理解来创建上面的正则表达式 全部的 空白类型:

    "|".join(["(?<={}){}+".format(s, s) for s in string.whitespace])

    显式编写,如下所示:

    (?<= ) +|(?<=\t)\t+|(?<=\n)\n+|(?<=\r)\r+|(?<=\x0b)\x0b+|(?<=\x0c)\x0c+

    因此,使用一个测试字符串,再加上这个正则表达式,虽然很混乱,但它是有效的:

    >>> test = '  \t\t\n\n\r\r\x0b\x0b\x0c\x0c'
    >>> regex = re.compile(
            "|".join(
                ["(?<={}){}+".format(s, s) for s in string.whitespace]
            )
        )
    >>> regex.sub("", test)
    ' \t\n\r\x0b\x0c'