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

494 投票
3 回答
394656 浏览
提问于 2025-04-15 18:05

我有这样一个字符串:

mystring = 'Here is  some   text   I      wrote   '

我该怎么把里面的双空格、三空格(...)替换成一个单空格,这样我就能得到:

mystring = 'Here is some text I wrote'

3 个回答

48

为了完整性,你也可以使用:

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的分割/连接解决方案的速度至少和这个方法一样快(通常会快很多)。

在你的例子中,使用timeit.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]


编辑:

我刚看到这篇帖子,里面对这些方法的速度进行了比较,内容比较长。

197

正则表达式可以帮助我们更好地控制合并的空白字符。

如果想匹配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(字符串)模式: 匹配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模式是有意义的,对于字节模式则会被忽略。对应于内联标志 (?a)。

strip() 方法可以去掉字符串开头和结尾的空白字符。

1032

一个简单的方法(如果你想避免使用正则表达式)是

' '.join(mystring.split())

这里的分割和连接正好完成了你想要的任务——而且,它们还额外做了一件你没有提到但在你的例子中可以看到的事情,那就是去掉了末尾的空格;-)

撰写回答