在Python中,在字符串中,如果不是前导多个空格,则用单个空格删除多个空格

Ksp*_*spr 3 python regex

我有各种可能有多个前导空格的字符串。

string_1 = '    param A     val A'
string_2 = 'param B    val B'

....
Run Code Online (Sandbox Code Playgroud)

如果多个空格不在字符串的开头,我想用一个空格替换所有多个空格。

我希望上面的输出变成

 string_1 = '    param A val A'z
 string_2 = 'param B val B'
Run Code Online (Sandbox Code Playgroud)

我当前的解决方案无论如何都会用一个空格替换所有多个空格。

 re.sub('\s+',' ',s)
Run Code Online (Sandbox Code Playgroud)

我将如何构造一个仅捕获非前导多个空格的模式?

Sor*_*ary 5

您可以使用\b\s{2,}\b作为您的模式,如果这些多个空格领先,则它们不在单词边界内。对于多个空格也可以使用{2,}而不是+排除单个空格:

import re


string_1 = "    param A     val A"
string_2 = "param B    val B"


pattern = re.compile(r"\b\s{2,}\b")
for test in (string_1, string_2):
    print(pattern.sub(" ", test))
Run Code Online (Sandbox Code Playgroud)

输出:

    param A val A
param B val B
Run Code Online (Sandbox Code Playgroud)

注意:尾随多个空格不会以这种方式更改。为此,您可以省略 last \bthen if 再次转换为单个空格。


正如@JvdV 所指出的,\b不考虑其他范围的字符。例如,如果您有一个类似 的字符串"[ param A val A ]",则上述模式将不适用于它。相反,您可以使用Positive Look Behind断言 ( (?<=\S)) 和Positive Look Ahead断言 ( (?=\S)) 来匹配任何非空白字符:

>>> import re
>>> text = "[    param A     val A    ]"
>>> re.sub(r"\b\s{2,}\b", " ", text)
'[    param A val A    ]'
>>> re.sub(r"(?<=\S)\s{2,}(?=\S)", " ", text)
'[ param A val A ]'
Run Code Online (Sandbox Code Playgroud)