如何去除字符串中的所有空白字符
我想知道怎么去掉Python字符串中的所有空格。比如,我希望把字符串 strip my spaces
变成 stripmyspaces
,但是我发现用 strip()
这个方法做不到:
>>> 'strip my spaces'.strip()
'strip my spaces'
14 个回答
42
另外,
"strip my spaces".translate( None, string.whitespace )
这是Python3版本:
"strip my spaces".translate(str.maketrans('', '', string.whitespace))
87
对于Python 3:
>>> import re
>>> re.sub(r'\s+', '', 'strip my \n\t\r ASCII and \u00A0 \u2003 Unicode spaces')
'stripmyASCIIandUnicodespaces'
>>> # Or, depending on the situation:
>>> re.sub(r'(\s|\u180B|\u200B|\u200C|\u200D|\u2060|\uFEFF)+', '', \
... '\uFEFF\t\t\t strip all \u000A kinds of \u200B whitespace \n')
'stripallkindsofwhitespace'
...可以处理你没想到的任何空白字符——相信我们,这种字符有很多。
\s
单独使用时总是能匹配ASCII空白字符:
- 普通空格
- 制表符(Tab)
- 换行符(\n)
- 回车符(\r)
- 换页符
- 竖直制表符
另外:
- 对于启用了
re.UNICODE
的Python 2, - 对于不需要额外操作的Python 3,
...\s
还可以匹配Unicode空白字符,比如:
- 不换行空格,
- 全角空格,
- 汉字空格,
...等等。完整列表可以在这里查看,找到“具有空白属性的Unicode字符”。
但是\s
并不包括那些不被归类为空白的字符,尽管它们实际上是空白,比如:
- 零宽连接符,
- 蒙古语元音分隔符,
- 零宽不换行空格(也叫字节顺序标记),
...等等。完整列表可以在这里查看,找到“没有空白属性的相关Unicode字符”。
所以这6个字符在第二个正则表达式中被包含,\u180B|\u200B|\u200C|\u200D|\u2060|\uFEFF
。
来源:
402
利用str.split在没有指定分隔符时的特性:
>>> s = " \t foo \n bar "
>>> "".join(s.split())
'foobar'
如果你只是想去掉空格,而不是所有的空白字符:
>>> s.replace(" ", "")
'\tfoo\nbar'
过早的优化
虽然效率不是最主要的目标——写出清晰的代码才是——这里有一些初步的时间测试结果:
$ python -m timeit '"".join(" \t foo \n bar ".split())'
1000000 loops, best of 3: 1.38 usec per loop
$ python -m timeit -s 'import re' 're.sub(r"\s+", "", " \t foo \n bar ")'
100000 loops, best of 3: 15.6 usec per loop
注意正则表达式是被缓存的,所以它并没有你想象中那么慢。提前编译它会有一些帮助,但如果你调用这个方法的次数不多,这点优化就没什么意义了:
$ python -m timeit -s 'import re; e = re.compile(r"\s+")' 'e.sub("", " \t foo \n bar ")'
100000 loops, best of 3: 7.76 usec per loop
虽然re.sub慢了11.3倍,但要记住,性能瓶颈肯定在其他地方。大多数程序在这三种选择之间不会察觉到什么区别。