Вы можете использовать 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