【问题标题】:Without regex reduce multiple spaces in a string to one in Python没有正则表达式,在 Python 中将字符串中的多个空格减少为一个
【发布时间】:2014-01-11 14:24:55
【问题描述】:

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

s = "Mary    had    a little lamb"

我想到的第一个解决方案是

' '.join(s.split())

但如果字符串类似于

,这将不会保留前导和尾随空格
s = "    Mary    had    a little lamb  "

为了节省前导和尾随空格(如果存在),我想出了一个稍微不同的方法,我在字符串的开头和结尾添加了一个虚拟字符(在本例中为“-”),我稍后会这样做拆分后删除。代码如下:

' '.join(('-' + s + '-').split())[1:-1]

是否有任何其他内置函数或其他 Python 方式来执行此操作?

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

【问题讨论】:

  • 我喜欢你的解决方案。除此之外,我会使用正则表达式。虽然你的肯定需要评论,但正则表达式可能不需要。
  • 当我尝试使用虚拟字符的解决方案时,它不会保留前导/尾随空格,我不明白..
  • @Totem,更正:我提到的解决方案会将字符串开头和/或结尾的多个空格减少为一个空格。它不会节省所有空间

标签: python python-3.x


【解决方案1】:

你可以使用类似的东西:

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 

【讨论】:

  • 我只是在写这篇文章,尽管我决定反对str.isspace,因为这也会吸引标签。
  • @DSM 是的...我很懒...虽然...lambda ch: ch == ' ' 并没有更多的努力:p
【解决方案2】:

你可以使用reduce:

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

【讨论】:

  • 嗨,alexander,我正在使用 python3.3,好像 reduce() 在 3.x 版本中不存在
  • @Pulimon 在Python3中移动到functoolsfrom functools import reduce
【解决方案3】:
>>> s = "    Mary    had    a little lamb  "
>>> s
'    Mary had a little lamb  '
>>> len0 = len(s)
>>> s = s.rstrip()
>>> len1 = len(s)
>>> s = s.lstrip()
>>> s = " ".join(s.split())
>>> print s
Mary had a little lamb
>>> s = s.rjust(len1).ljust(len0)
>>> s
'    Mary had a little lamb  '

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

【讨论】:

  • 嗨 loa_in_:我所说的前导和尾随空格是指如果在字符串的开头或结尾有多个空格,那么这些多个空格也应该减少为一个空格。在此解决方案中,您可以节省所有空间
【解决方案4】:

这对我来说似乎很好。

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 '

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 这不会保留前导和尾随空格,正如 OP 在问题中所要求的那样。
    猜你喜欢
    • 2019-09-04
    • 1970-01-01
    • 2013-09-11
    • 2017-10-01
    • 2017-10-07
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多