如果我有一个字符串
"this is a string"
如何缩短它以使我在单词之间只有一个空格而不是多个空格? (空格的数量是随机的)
"this is a string"
答案 0 :(得分:13)
你可以使用string.split
和" ".join(list)
以合理的pythonic方式实现这一点 - 可能有更高效的算法,但它们看起来不太好。
顺便说一下,这比使用正则表达式要快得多,至少在样本字符串上是这样的:
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
答案 1 :(得分:6)
re.sub(r'\s+', ' ', 'this is a string')
您可以预编译并存储它,以获得更好的性能:
MULT_SPACES = re.compile(r'\s+')
MULT_SPACES.sub(' ', 'this is a string')
答案 2 :(得分:2)
试试这个:
s = "this is a string"
tokens = s.split()
neat_s = " ".join(tokens)
字符串的split函数将返回按空格分割的非空标记列表。所以如果你试试
"this is a string".split()
你会回来的
['this', 'is', 'a', 'string']
字符串的join函数将使用字符串本身作为分隔符将标记列表连接在一起。在这种情况下,我们需要一个空格,所以
" ".join("this is a string".split())
将在空间出现时拆分,丢弃空,然后再次连接,用空格分隔。有关字符串操作的更多信息,请查看Python的common string function documentation。
编辑:我误解了将分隔符传递给split函数时会发生什么。请参阅markuz的答案。
答案 3 :(得分: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'
>>>