我有这个字符串:

mystring = 'Here is  some   text   I      wrote   '

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

mystring = 'Here is some text I wrote'

当前回答

一个简单的可能性(如果您宁愿避免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]

编辑:

刚刚看到这篇文章,它提供了一个相当长的比较这些方法的速度。

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

' '.join(mystring.split())

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

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

要匹配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有意义 模式,对于字节模式则被忽略。对应于内联 国旗(?)。

Strip()将远程控制任何前导和尾随空格。