3

如何在字符串格式的上下文中缩进多行字符串?例如

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

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

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

'''
<
    foo
bar
>
'''

当我真的想要这个时:

'''
<
    foo
    bar
>
'''

我知道我可以做类似的事情:

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

但这破坏了我的目的的可读性。

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

编辑:在您发布答案之前,请考虑您的解决方案如何与以下内容一起使用:

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

4 回答 4

2

这个怎么样:

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

结果:

<
   foo
   bar
>

方法中使用的字符串.join()必须包含与字符串中前面的任何内容相同的空格(加上\n开头的 a)%s

于 2011-12-01T10:59:42.250 回答
1

你不能指望 Python 解释器自动缩进你的paragraph. 你想让解释器弄乱你的数据吗?(提示:不。)

你可以做的是注入空格:

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

但是除非你绝对必须这样做,否则我会非常避免这样做,因为你不知道你可能正在处理哪个行尾,并且通常感觉有点尴尬。

于 2011-12-01T10:55:48.140 回答
1

Python 的textwrap模块是你的朋友,尤其是它的initial_indentsubsequent_indent参数。

于 2011-12-01T11:15:39.943 回答
1

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

或者,您可以在每次替换之前做一些相当笨拙的事情来检测空格的数量。这是非常脆弱的:

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
                >
        >
>
于 2011-12-01T11:27:08.153 回答