Python块格式化
我该如何在字符串格式化的情况下对多行字符串进行缩进呢?比如:
'''
<
%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
>
>
>