本问题已经有最佳答案,请猛点这里访问。
我有这根绳子:
mystring = 'Here is some text I wrote '
如何将双空格、三空格(…)替换为一个空格,以便:
mystring = 'Here is some text I wrote'
您可能应该说"用一个空格替换多个空格",因为空格是一类字符(制表符、换行符等)。
一个简单的可能性是
' '.join(mystring.split())
split和join执行您明确要求的任务——另外,它们还执行您不谈论但在示例中看到的额外任务,删除尾随空格;-)。
哦,酷,我在摸索一个类似的解决方案,但使用了拆分("")和过滤器来删除空元素。我从不知道分裂,没有这样的论据。这个速度也快得多,timeit.py给了我大约0.74的usec,而正则表达式为5.75的usec。
@是的,是的,x.split()和x.split(None)在空格序列(包括制表符、换行符等)上进行了拆分,就像re's \s的长度为1+,而且速度非常快。所以,总是乐于助人!
这是一个非常优雅的解决方案,但我想说的是,这也将删除任何换行符。
@当然,trudolf,因为换行符是空白的——'
'.isspace()是True——所以任何没有替换的代码都会违反问题的要求(当然,问题的未表达意图可能不同于它的非常明确的表达,但是,读心术不是一种非常广泛的技能——)。
import re
re.sub('\s+', ' ', mystring).strip()
这也将替换所有制表符、换行符和其他类似于空格的字符。
strip()将远程处理任何前导和尾随空格。
如果您真的只想替换空格(""),请使用re.sub(' +', ' ', mystring).strip()
对python 3使用re.sub(r'\s+', ' ', mystring).strip()。
为了完整性,您还可以使用:
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]
< BR>编辑:
刚刚看到这篇文章,它提供了这些方法的速度的相当长的比较。
线条比其他线条多,因此"Python"更少,但更清晰。
string.replace(" ","")
所有偶数空格都被删除
如果您只有两个空格,并且不能完全解决问题,那么这将导致错误。
错了。对于给定的例子,它甚至不起作用,因为它会导致'Here issome text Iwrote '。