Удалите пробелы в Python, используя string.whitespace - программирование
Подтвердить что ты не робот

Удалите пробелы в Python, используя string.whitespace

Python string.whitespace отлично:

>>> string.whitespace
'\t\n\x0b\x0c\r '

Как я могу использовать это со строкой, не прибегая к ручному вводу в '\ t\\n \...\n для регулярного выражения?

Например, он должен иметь возможность: "Пожалуйста,\n не \t больно\x0b меня."

в

"Пожалуйста, не причиняйте мне вреда".

Я бы, вероятно, захотел сохранить одиночные пробелы, но было бы достаточно просто перевести string.whitespace [: - 1] Я полагаю.

4b9b3361

Ответ 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."