【问题标题】:How to remove multiple spaces between words in Python, without the leading spaces如何在Python中删除单词之间的多个空格,没有前导空格
【发布时间】:2020-01-12 18:40:13
【问题描述】:

我正在编写一个简单的 Sublime Text 插件来修剪单词之间多余的、不必要的空格,但不触及前导空格以免弄乱 Python 格式。

我有:

[spaces*******are********here]if****not***regions***and**default_to_all:

想得到:

[spaces***are***still****here]if not regions and default_to_all:

考虑

regions = view.find_all('\w\s{2,}\w')
view.erase(edit, region)

但它也会删除第一个和最后一个字母。

【问题讨论】:

  • 您能否添加一个我的答案无法捕捉到的字符串示例?我对您到底需要什么感到有些困惑。

标签: python sublimetext sublime-text-plugin


【解决方案1】:

对于不匹配的前导空格意味着您要匹配非空格字符后面的多个空格(并将其替换为单个空格),因此您可以将 (?<=\S) +(?=\S) 替换为单个空格“”。

解释:

(?<=\S) +(?=\S)
(?<=              Positive look-behind, which means preceded by...
    \S                non-space character
      )           end of look-behind group
        +         more than 1 space
         (?=\S)   Positive look-ahead, which means followed by...
                      non-space character
                  end of look-ahead group

这应该很容易理解。不过,您可能需要对其进行一些调整以处理尾随空格。

有关详细信息,请参阅“regular expressions 101”。

但是,作为关于您的意图的旁注: 这不会是重新格式化代码的可靠方法。除了前导空格外,还有许多重要的多重空格情况。最明显的是字符串文字中的空格。

【讨论】:

  • 谢谢!但是我怎样才能避免删除第一个字符呢?请看下图。
  • 不明白删除第一个字符是什么意思。创建一个 regex101 示例来演示您的问题
  • 请查看:regex101.com/r/5d1cCY/1 谢谢!
  • @AlexanderPaulWansiedler 不明白您要做什么。它只是在做您正在寻找的事情:匹配“非哈希字符后跟一堆空格”
  • 我只想删除空格。如您所见,有时也会删除空格之前的非空格字符。我怎样才能避免这种情况?
【解决方案2】:

如果我理解正确,这应该有效:

>>> r = re.compile(r'( *[\S]*)(?: +)(\n)?')
>>> s = '       if   not regions    and  default_to_all:\n     foo'
>>> r.sub(' ', s)
   if not regions and default_to_all:
 foo

【讨论】:

  • 抱歉,不行。正如我所说,应保留每行中的前导空格。 (r'\s+') 会杀死所有的人。
  • @Alexander 所以应该保留换行符后的前导空格(即\n)?
  • @Alexander 我的新模式有什么问题?它保留开头的所有空格,以及任何换行符之后的所有空格?
  • {2,}$ 表示行尾前有空格,但是单词之间的空格呢?
  • @Alexander 抱歉,我不敢相信我发布了最后一个。我添加了另一个更新。