Заменить несколько пробелов с одиночным пробелом в Python

У меня есть эта строка:

mystring = 'Here is  some   text   I      wrote   '

Как я могу подставить двойные, тройные (...) пробелы только к одному пробелу, чтобы получить:

mystring = 'Here is some text I wrote'

Ответ 1

Простая возможность (если вы предпочитаете избегать RE),

' '.join(mystring.split())

Разделение и объединение выполняют задачу, о которой вы явно спрашиваете - плюс, они также делают дополнительный, о котором вы не говорите, но видите в вашем примере, удаляя конечные пробелы; -).

Ответ 2

import re

re.sub( '\s+', ' ', mystring ).strip()

это также заменит все вкладки, символы новой строки и другие символы типа "пробелы".

полоса() в конце будет отрезать любые конечные пробелы, как вы просили.

Ответ 3

Для полноты вы также можете использовать:

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 split/join solution работает как минимум так же быстро (обычно значительно больше).

В вашем примере, используя значения по умолчанию 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]


EDIT:

Просто натолкнулся на этот пост, который обеспечивает довольно длительное сравнение скоростей этих методов.

Ответ 4

string.replace("  ","")

Все четное количество пробелов исключено