使用string.whitespace删除Python中的空格

Python的string.whitespace很棒:

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

如何使用这个string而不诉诸手动input'\ t | \ n | …等等正则expression式?

例如,它应该能够变成:“请\ n不要伤害\ x我的。”

“请不要伤害我。”

我可能想要保留单个空格,但是很简单,只要去string.whitespace [: – 1]我想。

这个用例有一个特殊的快捷方式!

如果你没有参数调用str.split ,它会在空白而不是单个字符上分割。 所以:

 >>> ' '.join("Please \n don't \t hurt \x0b me.".split()) "Please don't hurt me." 

这个angular色类有什么问题?

 >>> import re >>> pattern = re.compile(r'\s+') >>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.") "Please don't hurt me." 

我们来做一些合理的假设:

(1)你真的想用一个空格来replace任何空白字符的运行(一个运行长度为1或更大)。

(2)您希望相同的代码在Python 2.X下使用unicode对象进行最小的更改。

(3)你不希望你的代码假设在文档中没有保证的东西

(4)您希望使用相同的代码,使用Python 3.X str对象进行最小的更改。

当前select的答案有这些问题:

(a)将" " * 3改为" " * 2即删除重复的空格而不是三重,四重等空格。 [不符合要求1]

(b)将"foo\tbar\tzot"改为"foobarzot" [失败要求1]

(c)当提供一个unicode对象时,得到TypeError: translate() takes exactly one argument (2 given) [failed requirements 2]

(d)使用string.whitespace[:-1] [不符合要求3; 不保证string.whitespace中的字符顺序]

(e)使用string.whitespace[:-1] [不符合要求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)答案没有这些问题。

你可以使用翻译方法

 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." 

或者,如果你想减less空白到最大的一个:

 >>> 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."