在Python中消除字符串中的多个空格字符

1 投票
4 回答
3017 浏览
提问于 2025-04-15 23:24

如果我有一个字符串

"this is   a    string"

我该怎么做才能把它缩短,让单词之间只留一个空格,而不是多个空格呢?(空格的数量是随机的)

"this is a string"

4 个回答

2

这段话的意思是,Ben Gartner 给出的答案差不多,但他还加了一个检查,看看这个字符串是不是空的。

>>> a = 'this is   a    string'
>>> ' '.join([k for k in a.split(" ") if k])
'this is a string'
>>> 

如果你不检查字符串是否为空,你会得到这个结果:

>>> ' '.join([k for k in a.split(" ")])
'this is   a    string'
>>>
6
re.sub(r'\s+', ' ', 'this is   a    string')
MULT_SPACES = re.compile(r'\s+')
MULT_SPACES.sub(' ', 'this is   a    string')

你可以提前编译并保存这个,这样可能会提高性能:

13

你可以使用 string.split" ".join(list) 这样的方法来实现这个功能,这种方式在Python中算是比较优雅的做法。虽然可能有更高效的算法,但它们看起来就没这么好。

顺便提一下,这种方法比用正则表达式要快很多,至少在这个示例字符串上是这样的:

import re
import timeit

s = "this    is   a     string"

def do_regex():
    for x in xrange(100000):
        a = re.sub(r'\s+', ' ', s)

def do_join():
    for x in xrange(100000):
        a = " ".join(s.split())


if __name__ == '__main__':
    t1 = timeit.Timer(do_regex).timeit(number=5)
    print "Regex: ", t1
    t2 = timeit.Timer(do_join).timeit(number=5)
    print "Join: ", t2


$ python revsjoin.py 
Regex:  2.70868492126
Join:  0.333452224731

编译这个正则表达式确实能提高性能,但前提是你要在编译后的正则表达式上调用 sub,而不是把编译后的形式作为参数传给 re.sub

def do_regex_compile():
  pattern = re.compile(r'\s+')
  for x in xrange(100000):
    # Don't do this
    # a = re.sub(pattern, ' ', s)
    a = pattern.sub(' ', s)

$ python revsjoin.py  
Regex:  2.72924399376
Compiled Regex:  1.5852200985
Join:  0.33763718605

撰写回答