string.whitespace Python является большим:
>>> string.whitespace
'\t\n\x0b\x0c\r '
Как я использую это со строкой, не обращаясь к ручному вводу в '\t |\n |... и т.д. для regex?
Например, это должно быть в состоянии повернуться: "\n не делают вреда \t \x0b меня".
в
"Не причиняйте мне боль".
Я, вероятно, хотел бы сохранить одиночные пробелы, но будет достаточно легко просто пойти string.whitespace [:-1], я предполагаю.
Именно для этого варианта использования существует специальный ярлык!
Если вы вызываете str.split
без аргумента, он разбивается на пробелы вместо одиночные персонажи. Итак:
>>> ' '.join("Please \n don't \t hurt \x0b me.".split())
"Please don't hurt me."
Что не так с \ s
класс персонажа?
>>> import re
>>> pattern = re.compile(r'\s+')
>>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.")
"Please don't hurt me."
Вы можете использовать метод 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."
отправная точка .. (хотя это не короче, чем вручную собрать цирк пробелов) ..
>>> 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) Вы действительно хотите заменить любой пробег пробельных символов одним пробелом (пробег длиной 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)
не имеют этих проблем.