如何去除字符串中的所有空白字符

238 投票
14 回答
450478 浏览
提问于 2025-04-16 04:18

我想知道怎么去掉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倍,但要记住,性能瓶颈肯定在其他地方。大多数程序在这三种选择之间不会察觉到什么区别。

撰写回答