从字符串中删除空格的首选方法

11

我想要从一个字符串中去除所有的空格。

" as fa sdf sdfsdf "

结果应为:

"asfasdfsdfsdf"

有几种方法可以实现这个目标,我在思考哪一种是最好的。

1.

"".join(" as fa   sdf sdfsdf ".split())

2.

" as fa   sdf sdfsdf ".replace(" ", "")

我假设还有更多的选择。
哪一个更受欢迎?

8个回答

6

我认为最好、最有效的方法是第二个版本:" as fa sdf sdfsdf ".replace(" ", ""),你可以使用timeit模块作为证据:

  • python -m timeit '"".join(" as fa sdf sdfsdf ".split())'

    1000000 次循环中,最优秀的 3 次结果:每次循环耗时 0.554 微秒

  • python -m timeit '" as fa sdf sdfsdf ".replace(" ", "")'

    1000000 次循环中,最优秀的 3 次结果:每次循环耗时 0.405 微秒


我想你是指“迭代”吗? - Thomas

4

replace(" ", "") 是最清晰和最简洁的。


2
选择+1选项是因为它最清晰地描述了意图。(您想要“删除空格”,而不是“使用不同的分隔符拆分和连接字符串”)。 - Heinzi

4

使用此方法可以一次性删除所有空格:

import re

s = ' as fa   sdf sdfsdf '
s = re.sub(r'\s+', '', s)

s
=> 'asfasdfsdfsdf'

这种方法的好处是它消除了所有字符之间的空格——一个、两个、无论有多少个,因为正则表达式r'\s+'匹配“一个或多个”空白字符——包括空格、制表符等。

但是普通的替换将逐个字母地查看并完成删除所有空格的相同任务。由于计算复杂度较低,可能更有效率。 - Steven Lu
1
根据您的情况,您可能需要考虑其他类型的空格,如\r、\n、\t制表符,或一些非常奇怪的Unicode空格,比如" "。话虽如此,还有很多要考虑的——您可能希望使用白名单而不是黑名单。 - HelloSam

2

使用 replace 方法不能移除所有空格字符(例如换行符,制表符):

>>> 'abc\t\ndef'.replace(" ", "")
'abc\t\ndef'

我喜欢使用 string.translate
>>> import string
>>> 'abc\t\ndef'.translate(None, string.whitespace)
'abcdef'

编辑:对于Unicode字符串,string.translate 不起作用;您可能希望使用 re.sub('\s', '', 'abc\n\tdef') 代替。


我认为这个方法值得更多的认可(也就是说,我应该阅读字符串模块文档)。 :) - Talvalin
@martineau,不幸的是,string.translate在Python 3中无法与Unicode字符串一起使用(或根本无法用于删除)。 - Samuel Isaacson
@SamuelIsaacson,不正确。Python 3:'abc\t\ndef'.translate(str.maketrans('','',string.whitespace))。字典键必须是Unicode序数值(整数),而不是字符。 - Mark Tolonen

2

正则表达式

>>> str = "   as fa sdf sdfsdf  "
>>> import re
>>> re.sub(r'\s', '', str)

1
+1 是因为它支持 Unicode 并且删除了所有类型的空格,而不仅仅是空格字符(尽管使用了与内置类型相同的变量名“str”)。 - martineau

1

再加入一个:

from string import whitespace
ws = set(whitespace)
''.join(ch for ch in my_string if ch not in ws)

''.join(ch for ch in my_string if not ch.isspace()) - Steven Rumbalski

1

re.sub(" ","", s) 是我最喜欢的。


单个字符替换用re?糟糕... - Jon Clements

0

正则表达式很简单,而且它很有效。 split() 稍微有点复杂。相比之下,正则表达式更受欢迎。


我完全同意。但问题不是关于正则表达式的。 - Konrad Rudolph
抱歉,我回复时想到了Java。 - hologram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接