устранение множественных вхождений пробелов в строке в python - PullRequest
1 голос
/ 01 июня 2010

Если у меня есть строка

"this is   a    string"

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

"this is a string"

Ответы [ 4 ]

13 голосов
/ 01 июня 2010

Вы можете использовать string.split и " ".join(list), чтобы сделать это разумно питоническим способом - возможно, есть более эффективные алгоритмы, но они не будут выглядеть так хорошо.

Между прочим, это намного быстрее, чем использование регулярных выражений, по крайней мере, в примере строки:

import re
import timeit

s = "this    is   a     string"

def do_regex():
    for x in xrange(100000):
        a = re.sub(r'\s+', ' ', s)

def do_join():
    for x in xrange(100000):
        a = " ".join(s.split())


if __name__ == '__main__':
    t1 = timeit.Timer(do_regex).timeit(number=5)
    print "Regex: ", t1
    t2 = timeit.Timer(do_join).timeit(number=5)
    print "Join: ", t2


$ python revsjoin.py 
Regex:  2.70868492126
Join:  0.333452224731

Компиляция этого регулярного выражения улучшает производительность, но только если вы вызовете sub для скомпилированного регулярного выражения вместо передачи скомпилированной формы в re.sub в качестве аргумента:

def do_regex_compile():
  pattern = re.compile(r'\s+')
  for x in xrange(100000):
    # Don't do this
    # a = re.sub(pattern, ' ', s)
    a = pattern.sub(' ', s)

$ python revsjoin.py  
Regex:  2.72924399376
Compiled Regex:  1.5852200985
Join:  0.33763718605
6 голосов
/ 01 июня 2010
re.sub(r'\s+', ' ', 'this is   a    string')

Вы можете предварительно скомпилировать и сохранить это для потенциально лучшей производительности:

MULT_SPACES = re.compile(r'\s+')
MULT_SPACES.sub(' ', 'this is   a    string')
2 голосов
/ 01 июня 2010

Почти тот же ответ Бена Гартнера, но это добавляет проверку "если это не пустая строка".

>>> a = 'this is   a    string'
>>> ' '.join([k for k in a.split(" ") if k])
'this is a string'
>>> 

если вы не проверите пустые строки, вы получите:

>>> ' '.join([k for k in a.split(" ")])
'this is   a    string'
>>>
2 голосов
/ 01 июня 2010

Попробуйте это:

s = "this is   a    string"
tokens = s.split()
neat_s = " ".join(tokens)

Функция разделения строки возвращает список непустых токенов, разделенных пробелами. Так что если вы попробуете

"this is   a    string".split()

ты вернешься

['this', 'is', 'a', 'string']

Функция соединения строки объединит список токенов, используя саму строку в качестве разделителя. В этом случае мы хотим пробел, поэтому

" ".join("this is   a    string".split())

Будет разбито на вхождения пробела, отбросит пустые места, затем снова объединится, разделив пробелами. Подробнее о строковых операциях можно узнать из документации Python *1013* о строковых функциях.

РЕДАКТИРОВАТЬ: я неправильно понял, что происходит, когда вы передаете разделитель в функцию разделения. См. Ответ Маркуза на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...