如何检测代码内的多个空格而不是行首

How to detect multiple spaces inside code and not at the beginning of line

我尝试重构 python 别人写的代码。 QA 不需要制表符,因此我用四个白色 space 替换了它们,但代码中也使用了很多制表符,而且不仅用于行首的缩进。

这是一段示例代码:

    def    post(self,     request,     format=None):
        action     =     request.query_params.get('action',     None)
        res     =     'UNKNOWN ACTION'
        hhtpstatus = status.HTTP_400_BAD_REQUEST


我试过这些正则表达式:

[^\S]([ ]{2,})[^\S]

这个 select 正确地包含了代码中的多个 space,但是 select 也是用于缩进的代码,这是我不想要的。如果我使用这个,我会松开缩进...

[^\s]([ ]{2,})[^\S]

这个比较好,代码里面只有select多个space,但是取了前面代码的最后一个字符,显然我两个都不想要。如果我使用它,我会通过在最后一个字符后面加上多个 space 来破坏所有代码...

我在 Atom 工作,正则表达式应该只检测代码之前和之后的代码包含的多个白色 space,而 select 只检测 space,所以我可以用单个 space

替换它们

我也试过 [^\W][^\w] 但不太成功:小资本仍然检测缩进 spaces,和 select 所有非单词代码字符 (, := 等等)。大写字母select只有space后面的字,没有space后面的其他码字,而且select也是多个space前面的最后一个字字符。 ..

有没有办法使用[^\s]([ ]{2,})[^\S],它只能正确检测代码中的多个space,但将其修改为contain/select ONLY spaces , 而不是最后一个前面的代码字符?因此,select一个字符后开始,如果这有意义的话...

您可以将 [^\s] 更改为 \S 并将 [^\S] 更改为 \s 并声明它们而不是使用环视。

如果匹配1个或多个space,并在右侧断言单个space,则替换为空字符串时将保留1个space。

(?<=\S)[ ]+(?=\s)

Regex demo

如果你不想在后面没有白色space字符时匹配最后的spaces,你可以匹配2个或更多spaces并断言一个非白色 space 字符在右边。

然后在替换中你可以使用单个 space.

(?<=\S)[ ]{2,}(?=\S)

Regex demo