如何从字符串中删除所有空格


179

如何删除python字符串中的所有空格?例如,我希望将一个字符串strip my spaces转换成stripmyspaces,但是我似乎无法通过以下方式完成此操作strip()

>>> 'strip my spaces'.strip()
'strip my spaces'

13
请注意,str.strip仅影响前导和尾随空格。

Answers:


309

利用没有sep参数的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倍,但请记住,您的瓶颈肯定会在其他地方。大多数程序不会注意到这三个选择之间的区别。


它可能比\s+替换慢。我会坚持下去。
OTZ

@OTZ:您可能会感到惊讶,但是会看到“记住”注释。

@Roger Hmm。有趣。您有没有尝试过该s.translate方法?它可能胜过本页上显示的所有方法。
OTZ 2010年

@Roger Pate:您不需要'table'参数来进行翻译,它可能是None-尽管令人惊讶的是,这使它变慢了……
martineau 2010年

1
尝试myString.translate(None, " \t\r\n\v")。仅需Roger最快的(拆分和合并)技术,就可节省83%的时间。不知道它是否涵盖了所有拆分的空白字符,但是对于大多数ASCII应用程序来说,它可能就足够了。
brianmearns 2012年

60
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'

还可以处理您不会想到的所有空白字符(相信我,有很多)。


3
与公认的答案相比,这比解决方案的难度小得多。
约翰·史密斯

这比其他答案更明确,因此对我来说是蛋糕。
特里斯坦,

34

或者,

"strip my spaces".translate( None, string.whitespace )

这是Python3版本:

"strip my spaces".translate(str.maketrans('', '', string.whitespace))

这似乎是最pythonic的。为什么没有将它推高到最高?
rbp

答案中的Python 3代码确实有效。@DanMenes的评论已过时
igo

3
NameError: name 'string' is not defined
Zelphir Kaltstahl

@ZelphirKaltstahl,您需要import string
Shahryar Saljoughi,

13

最简单的方法是使用replace:

"foo bar\t".replace(" ", "").replace("\t", "")

或者,使用正则表达式:

import re
re.sub(r"\s", "", "foo bar\t")

8

在Python中删除起始空间

string1="    This is Test String to strip leading space"
print string1
print string1.lstrip()

在Python中删除尾随或结尾空格

string2="This is Test String to strip trailing space     "
print string2
print string2.rstrip()

在Python中从字符串的开头和结尾删除空格

string3="    This is Test String to strip leading and trailing space      "
print string3
print string3.strip()

删除python中的所有空格

string4="   This is Test String to test all the spaces        "
print string4
print string4.replace(" ", "")


2
import re
re.sub(' ','','strip my spaces')

3
欢迎来到SO。尽管我们感谢您的回答,但如果它在其他答案的基础上提供附加价值,那会更好。在这种情况下,您的答案没有提供其他价值,因为另一个用户已经发布了该解决方案。如果以前的回答对您有所帮助,则一旦您有足够的声誉,就应该投票赞成
Maximilian Peters

这没有回答“如何删除所有空白”的问题。它只会删除空格
Nick

2

如Roger Pate所述,以下代码为我工作:

s = " \t foo \n bar "
"".join(s.split())
'foobar'

我正在使用Jupyter Notebook运行以下代码:

i=0
ProductList=[]
while i < len(new_list): 
   temp=''                            # new_list[i]=temp=' Plain   Utthapam  '
   #temp=new_list[i].strip()          #if we want o/p as: 'Plain Utthapam'
   temp="".join(new_list[i].split())  #o/p: 'PlainUtthapam' 
   temp=temp.upper()                  #o/p:'PLAINUTTHAPAM' 
   ProductList.append(temp)
   i=i+2

2

可以使用过滤列表的标准技术,尽管它们不如split/jointranslate方法有效。

我们需要一组空格:

>>> import string
>>> ws = set(string.whitespace)

filter内置:

>>> "".join(filter(lambda c: c not in ws, "strip my spaces"))
'stripmyspaces'

列表理解(是,请使用方括号:请参见下面的基准):

>>> import string
>>> "".join([c for c in "strip my spaces" if c not in ws])
'stripmyspaces'

折:

>>> import functools
>>> "".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))
'stripmyspaces'

基准测试:

>>> from timeit import timeit
>>> timeit('"".join("strip my spaces".split())')
0.17734256500003198
>>> timeit('"strip my spaces".translate(ws_dict)', 'import string; ws_dict = {ord(ws):None for ws in string.whitespace}')
0.457635745999994
>>> timeit('re.sub(r"\s+", "", "strip my spaces")', 'import re')
1.017787621000025

>>> SETUP = 'import string, operator, functools, itertools; ws = set(string.whitespace)'
>>> timeit('"".join([c for c in "strip my spaces" if c not in ws])', SETUP)
0.6484303600000203
>>> timeit('"".join(c for c in "strip my spaces" if c not in ws)', SETUP)
0.950212219999969
>>> timeit('"".join(filter(lambda c: c not in ws, "strip my spaces"))', SETUP)
1.3164566040000523
>>> timeit('"".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))', SETUP)
1.6947649049999995

0

TL / DR

该解决方案已使用Python 3.6进行了测试

要在Python3中从字符串中去除所有空格,可以使用以下函数:

def remove_spaces(in_string: str):
    return in_string.translate(str.maketrans({' ': ''})

要删除任何空格字符('\ t \ n \ r \ x0b \ x0c'),可以使用以下功能:

import string
def remove_whitespace(in_string: str):
    return in_string.translate(str.maketrans(dict.fromkeys(string.whitespace)))

说明

Python的str.translate方法是str的内置类方法,它获取一个表并返回字符串的副本,其中每个字符都通过传递的转换表进行映射。str.translate的完整文档

使用创建转换表str.maketrans。此方法是的另一个内置类方法str。在这里,我们仅将其与一个参数一起使用,在本例中为字典,其中的键是要替换的字符,映射到具有字符替换值的值。它返回一个转换表以与一起使用str.translatestr.maketrans的完整文档

stringpython中的模块包含一些常见的字符串操作和常量。string.whitespace是一个常量,它返回一个字符串,其中包含所有被视为空格的ASCII字符。这包括字符空格,制表符,换行符,返回符,换页符和垂直制表符。字符串的完整文档

在第二个函数dict.fromkeys中,用于创建字典,其中的键是string.whitespace每个带有value 的字符串返回的字符Nonedict.fromkeys的完整文档


0

如果不是最佳性能的要求,而您只想简单地做一些事情,则可以使用字符串类的内置“ isspace”方法定义一个基本函数来测试每个字符:

def remove_space(input_string):
    no_white_space = ''
    for c in input_string:
        if not c.isspace():
            no_white_space += c
    return no_white_space

no_white_space这种方式构建字符串将不会具有理想的性能,但是解决方案很容易理解。

>>> remove_space('strip my spaces')
'stripmyspaces'

如果您不想定义一个函数,则可以将其转换为与列表理解相似的东西。从最佳答案的join解决方案中借用:

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.