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