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

Python 如何从多行字符串中删除空格并将其传递给另一个程序,然后再添加回空格? 总结,python,regex,perl,shell,vim,Python,Regex,Perl,Shell,Vim,我需要检测传递给脚本的多行字符串中第一行的缩进级别。保存它。从其他行中删除此缩进。将删除了缩进级别的多行字符串传递给另一个程序(我已经知道如何做),将缩进添加到多行字符串中的所有行,并将其打印到stdout(我也知道如何做) 具体来说,我对vim和Python格式化程序YAPF有一个问题。 yapf的工作方式是,如果python文件格式不正确,将导致错误 想象一下 def f(): # imagine some very very long lines here that we want

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


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

想象一下

def f():
   # imagine some very very long lines here that we want to reformat
如果我在vim中选择这些想象中的行,然后按
gq
(我已经
设置了formatprg=yapf
),vim会用yapf的回溯来替换这些行,当然这是不好的。但是如果我选择整个函数,它将完美地完成工作

您可以使用

echo '   fooo = 1' | yapf
这将导致缩进错误 而
echo'fooo=1'| yapf
将起作用

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

所以我想到了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";

我很乐意得到任何帮助。也许有更简单的方法可以做到这一点,我不知道。

因为您似乎已经熟悉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))

您当前的代码失败了吗,或者您只是在寻找代码复查?它没有失败,它显然不符合我的要求want@ThisSuitIsBlackNot首先,我不知道如何从所有行中删除第一行的缩进。这样做时,我不知道如何存储它。@ThisSuiteisBlack没有另一个问题是我不知道如何获取脚本输入的字符串。您是否尝试过改用“转义序列”选项卡\字符串中的t相当于一个tab。您是否可以帮助我如何将多行字符串传递给脚本?要传递给脚本,您可以指定多行字符串作为第一个参数;然后将其作为
sys.argv[1]
处理
dedent
indent
在3.4版中可用。@ccf,即
textwrap
模块,据我所知,它一直包含
dedent
(尽管2.5版修复了一个重要的错误)。我有兴趣了解
缩进
函数。谢谢你因为我在Python2.7中尝试了它,但得到了ImportError。@ccf,您应该能够从Python2.7中的textwrap import dedent中导入textwrap或
,但不能从textwrap import dedent中导入