У меня есть эта строка:
mystring = 'Here is some text I wrote '
Как я могу подставить двойные, тройные (...) пробелы только к одному пробелу, чтобы получить:
mystring = 'Here is some text I wrote'
У меня есть эта строка:
mystring = 'Here is some text I wrote '
Как я могу подставить двойные, тройные (...) пробелы только к одному пробелу, чтобы получить:
mystring = 'Here is some text I wrote'
Простая возможность (если вы предпочитаете избегать RE),
' '.join(mystring.split())
Разделение и объединение выполняют задачу, о которой вы явно спрашиваете - плюс, они также делают дополнительный, о котором вы не говорите, но видите в вашем примере, удаляя конечные пробелы; -).
import re
re.sub( '\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 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:
Просто натолкнулся на этот пост, который обеспечивает довольно длительное сравнение скоростей этих методов.
string.replace(" ","")
Все четное количество пробелов исключено