Удалите пробел в Python с помощью string.whitespace

string.whitespace Python является большим:

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

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

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

в

"Не причиняйте мне боль".

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

47
задан Alex 14 December 2009 в 02:30
поделиться

5 ответов

Именно для этого варианта использования существует специальный ярлык!

Если вы вызываете str.split без аргумента, он разбивается на пробелы вместо одиночные персонажи. Итак:

>>> ' '.join("Please \n don't \t hurt \x0b me.".split())
"Please don't hurt me."
144
ответ дан 26 November 2019 в 19:11
поделиться

Что не так с \ s класс персонажа?

>>> import re

>>> pattern = re.compile(r'\s+')
>>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.")
"Please don't hurt me."
13
ответ дан 26 November 2019 в 19:11
поделиться

Вы можете использовать метод translate

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."
2
ответ дан 26 November 2019 в 19:11
поделиться

отправная точка .. (хотя это не короче, чем вручную собрать цирк пробелов) ..

>>> 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."
1
ответ дан 26 November 2019 в 19:11
поделиться

Давайте сделаем несколько разумных предположений:

(1) Вы действительно хотите заменить любой пробег пробельных символов одним пробелом (пробег длиной 1 или больше).

(2) Вы хотите, чтобы этот же код работал с минимальными изменениями на Python 2.X с объектами в уникоде.

(3) Вы не хотите, чтобы ваш код предполагал вещи, которые не гарантированы в документах

(4) Вы хотели бы, чтобы тот же самый код работал с минимальными изменениями с объектами на Python 3.X str.

(a) изменяет " " * 3 до " " * 2, т.е. удаляет дублирующиеся пробелы, но не тройные, квадратичные и т.д. Пробелы. [не выполняет требование 1]

(b) изменяет "foo\tbar\tzot" на "foobarzot" [не выполняет требование 1]

(c) при подаче объекта в уникоде, получает TypeError: translate() принимает ровно один аргумент (2 данно) [не выполняет требование 2]

(d) использует строку . пробел[:-1] [не удается выполнить требование 3; порядок символов в строке. пробел не гарантируется]

(e) использует string.whitespace[:-1] [не удовлетворяет требованию 4; на питоне 2.X строка.whitespace - это '\t\n\x0b\x0c\r '; на питоне 3. X, это ' \t\n\r\x0b\x0c']

Ответ " ".join(s.split()) и ответ re.sub(r"\s+", " ", s) не имеют этих проблем.

.
9
ответ дан 26 November 2019 в 19:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: