Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果不使用正则表达式,则在Python中将字符串中的多个空格减少为一个_Python_Python 3.x - Fatal编程技术网

如果不使用正则表达式,则在Python中将字符串中的多个空格减少为一个

如果不使用正则表达式,则在Python中将字符串中的多个空格减少为一个,python,python-3.x,Python,Python 3.x,在回答这个问题时,我对如何在不使用正则表达式的情况下在Python中将字符串中的多个空格减少为一表示怀疑。假设字符串如下所示: s = "Mary had a little lamb" ' '.join(('-' + s + '-').split())[1:-1] 我想到的第一个解决办法是 ' '.join(s.split()) 但是,如果字符串类似于 s = " Mary had a little lamb " 为了保留前导空格和尾随空格(如果有),我提

在回答这个问题时,我对如何在不使用正则表达式的情况下在Python中将字符串中的多个空格减少为一表示怀疑。假设字符串如下所示:

s = "Mary    had    a little lamb"
' '.join(('-' + s + '-').split())[1:-1]
我想到的第一个解决办法是

' '.join(s.split())
但是,如果字符串类似于

s = "    Mary    had    a little lamb  "
为了保留前导空格和尾随空格(如果有),我提出了一种稍微不同的方法,在字符串的开头和结尾添加了一个伪字符(在本例中为“-”),然后在拆分后将其删除。代码如下:

s = "Mary    had    a little lamb"
' '.join(('-' + s + '-').split())[1:-1]
有没有其他内置函数或其他pythonic方法来实现这一点

编辑:
通过保留前导和尾随空格,我的意思是,如果字符串的开头和/或结尾有多个空格,那么这些多个空格也应该减少为单个空格

您可以使用
减少

>>> reduce(lambda x, y: x if x[-1]==' ' and y==' ' else x+y, s) if s else ''
' Mary had a little lamb '

此代码将保留空格。我知道这不是必需的,但我将把它留在这里。

您可以使用类似以下内容:

from itertools import groupby

s = "    Mary    had    a little lamb  "
res = ''.join(' ' if is_space else ''.join(chars) for is_space, chars in groupby(s, str.isspace))
#  Mary had a little lamb 

这对我来说似乎很好

test_str = "    Mary    had    a little lamb  "
while "  " in test_str:
    test_str = test_str.replace("  ", " ")

print test_str # yield ' Mary had a little lamb '

(len(s)-len(s.lstrip())*“”+“”.join(s.lstrip().rstrip().split())+(len(s)-len(s.rstrip())*''

我喜欢你的解决方案。除此之外,我会选择正则表达式。虽然你的解决方案肯定需要注释,但正则表达式可能不需要。当我尝试使用伪字符的解决方案时,它不会保留前导/尾随空格,我不明白。@Totem,一个更正:我提到的解决方案一开始会减少多个空格将字符串结尾处的空格和/或缩为一个空格。这样做不会保留所有空格。通过前导空格和尾随空格,我的意思是,如果字符串开头或结尾处有多个空格,那么这些多个空格也应该缩为一个空格。在这个解决方案中,您可以保留所有空格。Shi alexander,我是我们ing python3.3看起来像reduce()在3.x中不存在version@Pulimon在Python3中,它被移动到了
functools
:从functools import reduce开始
我只是写了这篇文章,尽管我决定反对
str.isspace
,因为那样也会占用制表符。@DSM是的……我很懒……尽管……
lambda ch:ch=''
实际上并没有太多ffort:p这并没有像OP在问题中所要求的那样保留前导和尾随空格。