Python块格式化

3 投票
4 回答
4146 浏览
提问于 2025-04-17 07:27

我该如何在字符串格式化的情况下对多行字符串进行缩进呢?比如:

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

这里的段落包含换行符。('foo\nbar')

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

'''
<
    foo
bar
>
'''

但我其实想要的是这个:

'''
<
    foo
    bar
>
'''

我知道我可以这样做:

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

但这样会影响我想要的可读性。

我也意识到我可以写一些代码,让除了第一行之外的每一行都缩进一个空格,但这并不是一个灵活的解决方案(如果我需要缩进两个空格呢?或者三个空格呢?等等)。

编辑:在你发布答案之前,考虑一下你的解决方案在处理这样的情况时是如何工作的:

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

4 个回答

1

你不能指望Python解释器会自动给你的段落加上缩进。你希望解释器随便改动你的数据吗?(提示:当然不想。)

你可以自己添加空格:

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

不过,我建议你尽量不要这样做,除非真的没办法,因为你不知道会遇到什么样的行结束符,而且这样做通常感觉挺尴尬的。

2

这样怎么样:

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

结果:

<
   foo
   bar
>

在使用 .join() 方法时,字符串里需要有和 %s 前面的内容一样的空格(还要在开头加一个 \n)。

1

好的,简单的方法可能不适合你的需求。你要么需要使用文档对象模型(DOM)和一个合适的缩进系统来处理。

要么,你可以用一种比较“黑科技”的方法来检测每次替换前面的空白字符。这种方法比较脆弱:

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
                >
        >
>

撰写回答