在Python中消除字符串中的多个空格字符
如果我有一个字符串
"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