Python块格式

时间:2011-12-01 10:49:05

标签: python string formatting block quote

如何在字符串格式化的上下文中缩进多行字符串? e.g。

'''
<
     %s
>
''' % (paragraph)

其中段落包含换行符。 ('foo \ nbar')

如果我使用上面的代码,我得到这样的输出:

'''
<
    foo
bar
>
'''

当我真的想要这个时:

'''
<
    foo
    bar
>
'''

我知道我可以这样做:

'''
<
%s
>
''' % (paragraph)

但这会破坏我的可读性。

我也意识到我可以编写一些代码来缩进除第一行之外的所有代码缩进,但这不是一个可扩展的解决方案(如果我有2个缩进?或3?等等)

修改: 在您发布答案之前,请考虑您的解决方案如何使用以下内容:

'''
<
    %s
    <
        %s
        %s
        <
            %s
        >
    >
>
''' % (p1, p2, p3, p4)

4 个答案:

答案 0 :(得分:2)

这个怎么样:

'''
<
   %s
>
''' % ("\n   ".join(paragraph.split("\n")))

结果:

<
   foo
   bar
>

.join()方法中使用的字符串必须包含相同的空格(在开头加上\n),就像字符串中%s之前的任何内容一样。

答案 1 :(得分:1)

您不能指望Python解释器自动缩进paragraph。您是否希望口译员弄乱您的数据? (提示:没有。)

你可以做的是注入空白:

'''
<
    %s
>
''' % (paragraph.replace('\n','\n    ')) # assuming 4 space soft tabs

但除非你绝对不得不这样做,否则我会非常谨慎,因为你不知道你可能会处理哪些行结尾,并且通常会感到有点尴尬。

答案 2 :(得分:1)

Python的textwrap模块是您的朋友,特别是其initial_indentsubsequent_indent参数。

答案 3 :(得分:1)

好的,简单不适合你的目的。您需要使用文档对象模型和具有适当缩进的展平系统。

或者,你可以做一些相当hacky的事情来检测每次替换之前的空白量。这非常脆弱:

import re

def ind_sbt(text,indent='\t'):
    return text.replace('\n','\n%s' % (indent,))

def adjust_indents(fmtstr,*args):
    """Hacky, crude detection of identation level"""
    indented_substitutions = re.compile(r'\n(\s+)%s')
    return fmtstr % tuple([ ind_sbt(arg,indent=i) for (arg,i) in zip(args,indented_substitutions.findall(fmtstr))])

p1 = p2 = p3 = p4 = "foo\nbar"

print adjust_indents('''
<
    %s
    <
        %s
        %s
        <
            %s
        >
    >
>
''',p1,p2,p3,p4)

产量:

<
        foo
        bar
        <
                foo
                bar
                foo
                bar
                <
                        foo
                        bar
                >
        >
>