Удалите пробелы в Python, используя string.whitespace
Python string.whitespace отлично:
>>> string.whitespace
'\t\n\x0b\x0c\r '
Как я могу использовать это со строкой, не прибегая к ручному вводу в '\ t\\n \...\n для регулярного выражения?
Например, он должен иметь возможность:
"Пожалуйста,\n не \t больно\x0b меня."
в
"Пожалуйста, не причиняйте мне вреда".
Я бы, вероятно, захотел сохранить одиночные пробелы, но было бы достаточно просто перевести string.whitespace [: - 1] Я полагаю.
Ответы
Ответ 1
Для этого варианта использования существует специальный случайный ярлык!
Если вы вызываете str.split
без аргумента, он разбивается на пробелы пробелов вместо отдельных символов. Итак:
>>> ' '.join("Please \n don't \t hurt \x0b me.".split())
"Please don't hurt me."
Ответ 2
Что случилось с классом символов \s
?
>>> import re
>>> pattern = re.compile(r'\s+')
>>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.")
"Please don't hurt me."
Ответ 3
Сделаем некоторые разумные предположения:
(1) Вы действительно хотите заменить любой пробел символами пробела одним пробелом (пробег имеет длину 1 или больше).
(2) Вы хотите, чтобы один и тот же код работал с минимальными изменениями в Python 2.X с объектами unicode.
(3) Вы не хотите, чтобы ваш код принимал вещи, которые не гарантированы в документах
(4) Вы хотите, чтобы один и тот же код работал с минимальными изменениями с объектами Python 3.X str.
В текущем выбранном ответе есть следующие проблемы:
(a) изменяет " " * 3
на " " * 2
, то есть удаляет повторяющиеся пробелы, но не в трех экземплярах, в четырех экземплярах и т.д. [fail required 1]
(b) изменяет "foo\tbar\tzot"
на "foobarzot"
[fail required 1]
(c) при подаче объекта юникода получает TypeError: translate() takes exactly one argument (2 given)
[fail require 2]
(d) использует string.whitespace[:-1]
[fail required 3; порядок символов в string.whitespace не гарантируется]
(e) использует string.whitespace[:-1]
[fail required 4; в Python 2.X, string.whitespace '\t\n\x0b\x0c\r '
; в Python 3.X это '\ t\n\r\x0b\x0c']
Ответ " ".join(s.split())
и ответ re.sub(r"\s+", " ", s)
не имеют этих проблем.
Ответ 4
Вы можете использовать метод перевода
import string
s = "Please \n don't \t hurt \x0b me."
s = s.translate(None, string.whitespace[:-1]) # python 2.6 and up
s = s.translate(string.maketrans('',''), string.whitespace[:-1]) # python 2.5, dunno further down
>>> s
"Please don't hurt me."
И затем удалите повторяющиеся пробелы
s.replace(' ', ' ')
>>> s
"Please don't hurt me."
Ответ 5
отправная точка.. (хотя она не короче, чем ручная сборка пробельного цирка).
>>> from string import whitespace as ws
>>> import re
>>> p = re.compile('(%s)' % ('|'.join([c for c in ws])))
>>> s = "Please \n don't \t hurt \x0b me."
>>> p.sub('', s)
"Pleasedon'thurtme."
Или, если вы хотите уменьшить пробел до максимума:
>>> p1 = re.compile('(%s)' % ('|'.join([c for c in ws if not c == ' '])))
>>> p2 = re.compile(' +')
>>> s = "Please \n don't \t hurt \x0b me."
>>> p2.sub(' ', p1.sub('', s))
"Please don't hurt me."
Третий способ, более компактный:
>>> import string
>>> s = "Please \n don't \t hurt \x0b me."
>>> s.translate(None, string.whitespace[])
"Pleasedon'thurtme."
>>> s.translate(None, string.whitespace[:5])
"Please don't hurt me."
>>> ' '.join(s.translate(None, string.whitespace[:5]).split())
"Please don't hurt me."