如何在字符串格式化的上下文中缩进多行字符串? e.g。
'''
<
%s
>
''' % (paragraph)
其中段落包含换行符。 ('foo \ nbar')
如果我使用上面的代码,我得到这样的输出:
'''
<
foo
bar
>
'''
当我真的想要这个时:
'''
<
foo
bar
>
'''
我知道我可以这样做:
'''
<
%s
>
''' % (paragraph)
但这会破坏我的可读性。
我也意识到我可以编写一些代码来缩进除第一行之外的所有代码缩进,但这不是一个可扩展的解决方案(如果我有2个缩进?或3?等等)
修改: 在您发布答案之前,请考虑您的解决方案如何使用以下内容:
'''
<
%s
<
%s
%s
<
%s
>
>
>
''' % (p1, p2, p3, p4)
答案 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_indent
和subsequent_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
>
>
>