2016-01-23 46 views
1

我正在创建一些代码来替换空格。 我想要一个双空间变成一个单一的空间和一个空间变成什么都不是。如何替换类似的字符串

实施例:

string = "t e s t t e s t" 
string = string.replace(' ', ' ').replace(' ', '') 
print (string) 

的输出为 “testest”,因为它替换所有的空间。 如何使输出“测试测试”?

由于

回答

1

一个正则表达式的方法无疑是可能的,但对于一个快速的解决方案,第一分割对双空间,然后使用理解,以除去在每个元件的单个空格后在单个空间重新加入在分割:

>>> string = "t e s t t e s t" 
>>> ' '.join(word.replace(' ', '') for word in string.split(' ')) 
'test test' 
1

只是另一个想法:

>>> s = 't e s t t e s t' 
>>> s.replace(' ', ' ').replace(' ', '').replace(' ', '') 
'test test' 

似乎更快:

>>> timeit(lambda: s.replace(' ', ' ').replace(' ', '').replace(' ', '')) 
2.7822862677683133 
>>> timeit(lambda: ' '.join(w.replace(' ','') for w in s.split(' '))) 
7.702567737466012 

和正则表达式(至少这一个)是短,但慢了很多:

>>> timeit(lambda: re.sub(' (?)', r'\1', s)) 
37.2261058654488 
+0

在任何情况下,我都不会太在意速度,但我喜欢首先将空间加倍的想法。 (我认为它是否比分裂和重新加入的方法更清晰,但至少值得了解。)由于某些原因,当你编辑你的答案以添加正则表达式时,间距就被搞砸了,这会破坏你的主元素回答。 –

+0

@JohnY是的,我对速度并不太在意,无论如何,我只是有点好奇,所以我做了测试并分享了它。你是什​​么意思间距被搞砸了?我确实改变了空格(用零替换三,而不是用一个替换四),但它仍然可以工作。 –

+0

我一定误解了它。尽管如此,我发现在4个空格变为1时很容易看到你正在做什么。另外,如果输入以三个相邻空格开始,这会稍微改变效果。当然,OP从来没有明确说过在这种情况下应该发生什么,也可能没有关系,但我的直觉是三重空间应该被看作更像是“双空间接着一个空间”(变成单一)比“三个单一的空间”(变空)。 –

0

我喜欢这个正则表达式的解决方案,因为你可以轻松地阅读这是怎么回事:

>>> import re 
>>> string = "t e s t t e s t" 
>>> re.sub(' {1,2}', lambda m: '' if m.group() == ' ' else ' ', string) 
'test test' 

我们搜索一个或两个空格,并用空字符串替换一个空格,但用一个空格替换两个空格。