在Python中使用string.whitespace去除空白字符
Python的string.whitespace非常好用:
>>> string.whitespace
'\t\n\x0b\x0c\r '
我该如何在字符串中使用它,而不需要手动输入'\t|\n|...等等来做正则表达式呢?
举个例子,它应该能把:
"请 \n 不要 \t 伤害 \x0b 我."
变成
"请不要伤害我."
我可能想保留单个空格,不过我想只要用string.whitespace[:-1]就能轻松搞定了。
5 个回答
让我们做一些合理的假设:
(1) 你真的想把连续的空白字符替换成一个空格(连续的意思是长度为1或更长)。
(2) 你希望同样的代码在Python 2.X中也能用,且能处理unicode对象,改动要尽量少。
(3) 你不希望你的代码假设一些文档中没有保证的事情。
(4) 你希望同样的代码在Python 3.X的字符串对象中也能用,改动要尽量少。
目前选中的答案存在以下问题:
(a) 把 " " * 3
变成 " " * 2
,也就是说,它去掉了重复的空格,但没有去掉三次、四次等的空格。[不符合要求1]
(b) 把 "foo\tbar\tzot"
变成 "foobarzot"
[不符合要求1]
(c) 当输入一个unicode对象时,会出现 TypeError: translate() takes exactly one argument (2 given)
的错误 [不符合要求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)
这两个答案就没有这些问题。
这个\s
字符类有什么问题呢?
>>> import re
>>> pattern = re.compile(r'\s+')
>>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.")
"Please don't hurt me."
其实针对这种情况,有一个特别简单的方法!
如果你在调用 str.split
时不传任何参数,它会根据连续的空白字符来分割字符串,而不是一个一个字符来分割。所以:
>>> ' '.join("Please \n don't \t hurt \x0b me.".split())
"Please don't hurt me."