如何从多行字符串中删除空格将其传递给另一个程序,然后再添加回空白?

2024-06-23 02:39:35 发布

您现在位置:Python中文网/ 问答频道 /正文

总结

我需要检测传递给脚本的多行字符串中第一行的缩进级别。储存起来。从其他行删除此缩进。将删除了缩进级别的多行字符串传递给另一个程序(我已经想好了该怎么做),将缩进添加到多行字符串中的所有行并将其打印到stdout(我也知道如何做)。在


具体地说,我对vim和Python格式化程序YAPF有一个问题。 yapf的工作方式是,如果python文件的格式不正确,就会导致错误。在

想象一下这个

def f():
   # imagine some very very long lines here that we want to reformat

如果我在vim中选择这个想象的行,然后按gq(我已经set formatprg=yapf),vim会用yapf的回溯来代替这几行,这当然不好。但如果我选择整个功能,它将完美地完成任务。在

你可以用

^{pr2}$

这将导致IndentationErrorecho 'fooo = 1' | yapf可以工作

所以我认为一个很好的解决方法是删除缩进存储第一行的缩进级别,以某种方式将不带缩进的字符串传递给yapf,然后将缩进添加到结果中。问题是我希望这是一个一行或接近,以便它可以直接存储在我的vimrc。所以python不是一个很好的匹配,因为我至少需要导入re-package等

所以我想到了perl。在

唯一的问题是我对perl不太了解。在

所以现在我的实验是这样的

$a = "    foo = 1\n    bar = '1'";
my ($indent, $text) = $a =~ m/^(\s+)(.*)$/m;
$command = "echo " . $text;
$out = `$command`;
print "$out\n";
print "$text\n";

我很乐意得到任何帮助。也许还有更简单的方法来做这个,我不知道。在


Tags: 方法字符串textecho程序方式vimout
1条回答
网友
1楼 · 发布于 2024-06-23 02:39:35

既然您似乎已经熟悉Python了,我建议您使用它的^{}模块,该模块包含dedent和(在3.3及更高版本中)indent函数,这些函数可以为您完成大部分工作:

import re
from textwrap import dedent, indent

whitespace = re.compile('\s+')

test_string = '''    while True:
        pass'''

leading_whitespace = whitespace.match(test_string)

dedented_text = dedent(test_string)

# Do whatever you want with dedented_text

indented_text = indent(dedented_text, leading_whitespace.group(0))

相关问题 更多 >