您可以使用
\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))
输出:
param A val A
param B val B
注意: 后面多个空格不会被这种方式改变。如果要处理可以省略最后的\b
,那么再次转换为单个空格。
如@JvdV所述,\b
不考虑其他范围内的字符。例如,如果您有一个类似"[ param A val A ]"
的字符串,则上面的模式将无法匹配它。相反,您可以使用 正向截断断言((?<=\S)
) 和 正向预查断言 ((?=\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 ]'
\b
只能识别\w
以外的字符。 - JvdV(?=\S)
断言,因为 OP 没有说尾随空格不应该被替换。{2,}
是贪婪的,所以(?<=\S)\s{2,}
就可以了。 - blhsing