压缩连续的空格

5

我该如何在Python中折叠连续的空白符?

"a b   c   d      e" --> "a b c d e"
3个回答

14
假设
s = 'a b   c   d      e'

那么

' '.join(s.split())
'a b c d e'

这将为您提供指定的输出。

这是通过使用 split() 将字符串分解为单个字符列表 ['a', 'b', 'c', 'd', 'e'], 然后再使用 join() 函数将它们用单个空格连接起来形成一个字符串。 split() 还会处理任何前导或尾随空白。

基于 Python 之禅中的 简洁胜于复杂,以避免正则表达式 "two problem" 问题 :)


1
@downvoter 如果没有任何解释的负评并不能帮助任何人(包括 OP、SO 或我)。这是一个对 OP 问题的功能性解决方案。我很乐意纠正任何错误或改进答案,但这需要一些建设性的反馈。 - Levon
2
@Ωmega 我不明白.. 你是在说可能存在的看不见的空白字符吗?我想原帖作者应该会提到。如果在 "d" 和 "e" 之间有混合了制表符和空格的序列,当你“折叠”它时,你会保留哪个?选制表符还是空格? - Levon

5

使用正则表达式 (因为有标签):

re.sub('\s+', ' ', "a b   c   d      e")

2
@Ωmega,我不明白你为什么这样想。而且,为什么要对提供正确输出的答案进行负评? - JBernardo
1
@Ωmega 如果你认为这是问题的正确解释,那么在你的回答中解释清楚,而不是浪费其他人的时间... 你可能在过度思考一个简单的问题(但这不是我的问题)。 - JBernardo
1
我建议您使用\s{2,}。这样可以将单个空格保留不变,而不是用其自身替换。仍然要点赞。 - Tim Pietzcker

0
如果您不关心第一个元素的前导空格和最后一个元素的尾随空格,请使用以下代码:
re.sub('\s+(?=\s)', '', str)

如果您这样做,那么去除前导和尾随空格的解决方案是:
re.sub('(?:^\s+|\s+(?=\s)|\s+$)', '', str)

3
^$ 已经是零宽断言了,不需要用环视将它们包起来。 - Alan Moore
2
我认为@Levon的答案是这个问题可能有的最好的答案,那么为什么我要写另一个呢?你为什么认为(假设我们正在处理混合空格)最后一个是你应该保留的?为什么不是第一个?为什么要做出这样的假设呢? - Tim Pietzcker
@TimPietzcker - 关于IT规范,包括默认规则、常见误解等,有一些规定(大多数程序员从未听说过)。在大学里,我曾经上过相关课程。将这些规则应用到OP的问题中>> (1) 程序员不应该假设空格只是空格键。(2) 默认字符串截断是从右边开始... - Ωmega

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