此问题在此处已有答案:
Does Python have a built-in function for unindenting a multiline string?(4个答案)
23天前关闭
摘要
我需要检测传递给脚本的多行字符串中第一行的缩进级别。存储它。从其他行中删除此缩进级别。将删除缩进级别的多行字符串传递给另一个程序(我已经想到了如何做)将缩进添加回多行字符串中的所有行并将其打印到标准输出(我也知道如何做)。
具体来说,我对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的回溯替换这些行,当然这是不好的。但是如果我选择整个函数,它会完美地完成这项工作。
你可以用
echo ' fooo = 1' | yapf
型
这将导致IndentationError
,而echo 'fooo = 1' | yapf
将工作
所以我认为一个非常好的解决方法是删除缩进存储第一行的numberlevel,以某种方式将没有缩进的string传递给yapf,然后将numberlevel添加到结果中。这样做的问题是我希望这是一个或接近于一个行,这样它就可以直接存储在我的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";
型
我会很高兴任何帮助。也许有更简单的方法来做到这一点,我不知道。
1条答案
按热度按时间juud5qan1#
由于你似乎已经熟悉Python,我建议使用它的
textwrap
模块,它包含dedent
和(在3.3版和更高版本中)indent
函数,可以为你完成大部分工作:字符串