在Python中将多个空格替换为单个空格
我有这样一个字符串:
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())
这里的分割和连接正好完成了你想要的任务——而且,它们还额外做了一件你没有提到但在你的例子中可以看到的事情,那就是去掉了末尾的空格;-)