Как убрать лишние пробелы в строке Python (strip)?
После ввода или чтения из файла в строке остаются пробелы и перевод строки по краям, и сравнения ломаются. Как обрезать пробелы в начале и конце? И как убрать только слева или только справа, а также все внутри?
2 ответа
Для пробелов по краям — метод strip(). Он убирает пробелы, табы и переводы строк слева и справа, возвращая новую строку:
s = ' привет \n'
print(s.strip()) # 'привет'
print(repr(s.strip())) # 'привет' — без пробелов и \n
Есть варианты только с одной стороны:
' abc '.lstrip() # 'abc ' — только слева
' abc '.rstrip() # ' abc' — только справа
Это частая причина «непонятных» багов: после input() или чтения строки файла на конце висит \n или пробел, и 'да' == 'да ' оказывается False. strip() это лечит:
answer = input().strip()
if answer == 'да':
...
Можно убрать конкретные символы, передав их в аргументе (не пробелы):
'***важно***'.strip('*') # 'важно'
'https://site/'.rstrip('/') # 'https://site'
Важно: аргумент это набор символов, а не подстрока. 'xxabcxx'.strip('xy') уберёт любые x и y по краям, в любом порядке.
А вот пробелы внутри строки strip не трогает. Чтобы убрать их, используйте replace(' ', '') (все пробелы) или нормализуйте через ' '.join(s.split()) — это схлопывает любые повторяющиеся пробелы в один:
' '.join('много пробелов'.split()) # 'много пробелов'
И помните — строки неизменяемы, результат strip нужно присвоить.
Маленькое уточнение про аргумент strip: новички часто думают, что 'hello world'.strip('world') уберёт слово 'world'. На самом деле он уберёт любые символы из набора {w,o,r,l,d} по краям — получится 'hello ' (а 'h','e' остались, 'o' с конца снят). Чтобы убрать именно подстроку с конца, в Python 3.9+ есть removesuffix:
'file.txt'.removesuffix('.txt') # 'file'
'name_temp'.removeprefix('name_') # 'temp'
Это как раз для случая «отрезать конкретное окончание/начало», а не набор символов.