在Python中将多个空格替换为单个空格

我有这个字符串:

mystring = 'Here is  some   text   I      wrote   '

我如何用一个空格替换双,三重(…)空白字符,以便我得到:

mystring = 'Here is some text I wrote'
342954 次浏览

正则表达式可用于对组合的空白字符提供更多的控制。

要匹配unicode空白:

import re


_RE_COMBINE_WHITESPACE = re.compile(r"\s+")


my_str = _RE_COMBINE_WHITESPACE.sub(" ", my_str).strip()

只匹配ASCII空白:

import re


_RE_COMBINE_WHITESPACE = re.compile(r"(?a:\s+)")
_RE_STRIP_WHITESPACE = re.compile(r"(?a:^\s+|\s+$)")


my_str = _RE_COMBINE_WHITESPACE.sub(" ", my_str)
my_str = _RE_STRIP_WHITESPACE.sub("", my_str)

仅匹配ASCII空白有时对于保持x0b, x0c, x1c, x1d, x1e, x1f等控制字符是必要的。

参考:

关于\s:

为Unicode (str)模式: 匹配Unicode空白字符(包括[\t\n\r\f\v],以及许多其他字符,例如 在许多语言中,排版规则要求使用不间断空格)。 如果使用ASCII标志,则只匹配[\t\n\r\f\v]

关于re.ASCII:

使\w, \w, \b, \b, \d, \d, \s和\s只执行ascii匹配,而不是完全的Unicode匹配。这只对Unicode有意义 模式,对于字节模式则被忽略。对应于内联 标志(?). < / p >

strip()将远程控制任何前导和后面的空白。

一个简单的可能性(如果您宁愿避免REs)是

' '.join(mystring.split())

拆分和连接执行您明确要求的任务——此外,它们还执行您没有讨论但在示例中可以看到的额外任务,即删除尾随空格;-)。

为了完整起见,您还可以使用:

mystring = mystring.strip()  # the while loop will leave a trailing space,
# so the trailing whitespace must be dealt with
# before or after the while loop
while '  ' in mystring:
mystring = mystring.replace('  ', ' ')

它将快速处理空格相对较少的字符串(在这些情况下比re快)。

在任何情况下,Alex Martelli的拆分/联合解决方案执行得至少一样快(通常要快得多)。

在你的例子中,使用默认值time . timer .repeat(),我得到了以下时间:

str.replace: [1.4317800167340238, 1.4174888149192384, 1.4163512401715934]
re.sub:      [3.741931446594549,  3.8389395858970374, 3.973777672860706]
split/join:  [0.6530919432498195, 0.6252146571700905, 0.6346594329726258]
< p >
编辑:< / >强

刚刚遇到这篇文章,它提供了这些方法的速度比较。