在Python中用单个空格替换多个空格

cre*_*ivz 275 python

我有这个字符串:

mystring = 'Here is  some   text   I      wrote   '
Run Code Online (Sandbox Code Playgroud)

我怎样才能将double,triple(...)空格替换为一个空格,以便我得到:

mystring = 'Here is some text I wrote'
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 590

一个简单的可能性(如果你宁愿避免RE)是

' '.join(mystring.split())
Run Code Online (Sandbox Code Playgroud)

拆分和连接执行您明确询问的任务 - 此外,他们还会执行您未讨论的额外任务,但在您的示例中可以看到,删除尾随空格;-).

  • @Roman,是的,`x.split()`(和`x.split(None)`)在长度为1+的whitespace_(包括制表符,换行符等,如re的'\ s`)的_sequences上分裂 - 和确实非常快.所以,总是很乐意提供帮助! (12认同)
  • 这是一个非常优雅的解决方案,但我想提一下,这也将删除任何换行符 (6认同)
  • 哦,很酷,我正在尝试使用类似的解决方案,但使用split('')然后使用过滤器删除空元素.我从来不知道分裂,没有像这样的论据.这也快得多,timeit.py为此提供了大约0.74usec,而正则表达式则为5.75usec. (5认同)
  • @trudolf,当然,因为linebreaks*是*whitespace - ''\n'.isspace()`是'True` - 所以*没有*替换的任何代码都会违反问题**问题的未表达*意图*当然可能与它的非常明确的表达方式不同,但是,思维阅读并不是一种非常普遍的技能:-). (5认同)
  • 为了避免 '\n' 与 ' ' 混合,可以使用 splitlines() ,如下所示: ' '.join((''.join(text.splitlines())).split()) (2认同)
  • 要仅删除连续的重复空格,可以使用 `' '.join(mystring.split(' '))`。这也将删除前导和尾随空格,但会保留换行符、制表符等。 (2认同)

hro*_*est 133

import re

re.sub('\s+', ' ', mystring).strip()
Run Code Online (Sandbox Code Playgroud)

这也将替换所有选项卡,换行符和其他"类似空格"的字符.

strip()遗嘱远程任意开头和结尾的空格.

  • 如果你真的只想替换空格(''),请使用`re.sub('+','',mystring).strip()` (9认同)
  • 为Python 3使用`re.sub(r'\ s +','',mystring).strip()` (4认同)

Dav*_*d C 32

为完整起见,您还可以使用:

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('  ', ' ')
Run Code Online (Sandbox Code Playgroud)

这将在具有相对较少空格的字符串上快速工作(比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]
Run Code Online (Sandbox Code Playgroud)


编辑:

刚刚看到这篇文章提供了这些方法的速度相当长的比较.