3

文字列フォーマットのコンテキストで複数行の文字列をインデントするにはどうすればよいですか? 例えば

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

段落には改行が含まれています。('foo\nバー')

上記のコードを使用すると、次のような出力が得られます。

'''
<
    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 のtextwrapモジュール、特にそのinitial_indentandsubsequent_indentパラメータはあなたの友人です。

于 2011-12-01T11:15:39.943 に答える
1

Python インタープリターが自動的にインデントすることは期待できませんparagraph。インタプリタにデータをいじってもらいたいですか? (ヒント:いいえ)

あなたができることは、空白を挿入することです:

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

しかし、絶対に必要な場合を除き、それは控えたいと思います。なぜなら、どの行末を扱っているのかわからず、一般的にはぎこちなく感じるからです。

于 2011-12-01T10:55:48.140 に答える
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 に答える