我如何剥离所有的空间在一个python字符串?例如,我想要一个像stripmyspaces这样的字符串变成stripmyspaces,但我似乎不能用strip()来完成:
>>> 'strip my spaces'.strip()
'strip my spaces'
我如何剥离所有的空间在一个python字符串?例如,我想要一个像stripmyspaces这样的字符串变成stripmyspaces,但我似乎不能用strip()来完成:
>>> 'strip my spaces'.strip()
'strip my spaces'
当前回答
TL /博士
这个解决方案使用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.translate的翻译表。str.maketrans的完整文档
python中的string模块包含一些常见的字符串操作和常量。字符串。whitespace是一个常量,返回一个包含所有被认为是空格的ASCII字符的字符串。这包括字符空格、制表符、换行符、返回符、换行符和垂直制表符。string.whitespace的完整文档
在第二个函数中,dict.fromkeys用于创建一个字典,其中键是string返回的字符串中的字符。每个值为None的空格。dict.fromkeys的完整文档
其他回答
TL /博士
这个解决方案使用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.translate的翻译表。str.maketrans的完整文档
python中的string模块包含一些常见的字符串操作和常量。字符串。whitespace是一个常量,返回一个包含所有被认为是空格的ASCII字符的字符串。这包括字符空格、制表符、换行符、返回符、换行符和垂直制表符。string.whitespace的完整文档
在第二个函数中,dict.fromkeys用于创建一个字典,其中键是string返回的字符串中的字符。每个值为None的空格。dict.fromkeys的完整文档
利用str.split没有sep参数的行为:
>>> 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倍,但请记住,瓶颈肯定在其他地方。大多数程序不会注意到这3个选项之间的区别。
筛选列表的标准技术适用,尽管它们不如拆分/连接或转换方法有效。
我们需要一组空白:
>>> import string
>>> ws = set(string.whitespace)
内置过滤器:
>>> "".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
另外,
"strip my spaces".translate( None, string.whitespace )
下面是Python3版本:
"strip my spaces".translate(str.maketrans('', '', string.whitespace))
import re
re.sub(' ','','strip my spaces')