Использование поведения str.split без параметра sep:
>>> s = " \t foo \n bar "
>>> "".join(s.split())
'foobar'
Если вы хотите удалить пробелы вместо всех пробелов:
>>> s.replace(" ", "")
'\tfoo\nbar'
Преждевременная оптимизация
Несмотря на то, что эффективность не является главной целью - написание ясного кода - вот некоторые начальные моменты времени:
$ python -m timeit '"".join(" \t foo \n bar ".split())'
1000000 loops, best of 3: 1.38 usec per loop
$ python -m timeit -s 'import re' 're.sub(r"\s+", "", " \t foo \n bar ")'
100000 loops, best of 3: 15.6 usec per loop
Обратите внимание, что регулярное выражение кэшируется, поэтому оно не такое медленное, как вы думаете. Компиляция его заранее помогает некоторым, но на практике это будет иметь значение, только если вы вызовете это много раз:
$ python -m timeit -s 'import re; e = re.compile(r"\s+")' 'e.sub("", " \t foo \n bar ")'
100000 loops, best of 3: 7.76 usec per loop
Несмотря на то, что re.sub медленнее в 11,3 раза, помните, что ваши узкие места наверняка в другом месте. Большинство программ не заметят разницы между любым из этих 3 вариантов.