python - python中的多行字符串格式

标签 python multiline

首先,我正在努力获得如下所需的输出:

*********************************************************************
                                 hello
********************************************************************* 

为了实现这一点,我已将所需的输出分配给具有多行字符串的变量,并使用格式 打印相同的内容。

$ cat varibale.py 
decorator = """ **********************************************************************
                               {}
            ********************************************************************** """
print(decorator.format("hello"))

输出:

**********************************************************************
                               hello
            **********************************************************************

上述方法的问题是第三行输出中的额外空格,这看起来很奇怪。

我可以通过以下方式实现这一目标:

$ cat varibale.py 
decorator = """ **********************************************************************
                             {}
********************************************************************* 
"""
print(decorator.format("hello"))

输出:

 **********************************************************************
                             hello
********************************************************************* 

但是这样我的代码看起来不太好,因为它没有遵循缩进。

请建议实现所需输出的正确方法。

最佳答案

使多行文字字符串看起来不错的一种方法是使用反斜杠来转义换行符,如下所示:

s = '''\
*********************************************************************
                                 hello
*********************************************************************
'''
print(s)

输出

*********************************************************************
                                 hello
*********************************************************************

但是,PEP-008 不鼓励这样使用反斜杠。它太脆弱了:如果反斜杠和换行符之间有一个空格,那么换行符将不会被转义,反斜杠将被打印出来。

一种更通用的方法是使用一个函数来计算使文本居中所需的填充量,并通过嵌套格式说明符应用它。例如:

def banner(s, width=69):
    stars = '*' * width
    pad = (width + len(s)) // 2
    return '{0}\n{1:>{2}}\n{0}'.format(stars, s, pad)

print(banner('hello'))
print(banner('Hello, world', width=16))

输出

*********************************************************************
                                hello
*********************************************************************
****************
  Hello, world
****************

工作原理

那个格式字符串有点密集,所以我想我应该试着解释一下。 ;) 有关此主题的完整信息,请参阅 Format String Syntax在文档中。下面的解释借鉴并解释了这些文档。

'{0}\n{1:>{2}}\n{0}'.format(stars, s, pad)

{} 中包含的内容在格式字符串中称为“替换字段”。替换字段中的第一项是可选字段名称。这让我们可以识别 .format 的哪个参数与此替换字段一起使用。字段名称有几种可能的变体,此格式字符串使用数字名称,因此它标识 .format args 按他们的位置。即0对应stars , 1对应s和 2 对应于 pad .

如果没有给出字段名称,它们将自动由数字 0、1、2 等填充(除非您使用的是 Python 2.6,其中字段名称是强制性的)。这在大多数时候都非常有用,因此大多数格式字符串都不会费心使用字段名称。

在字段名称之后,我们可以给出一个“格式说明符”或“格式规范”来描述值是如何呈现的。一个冒号 :将字段名称与格式规范分开。如果您不提供格式规范,那么您会得到一个默认格式,大多数情况下这就足够了。但在这里我们确实需要更多控制,因此我们需要提供格式规范。

在表单规范中 > sign 强制字段在可用空间内右对齐。在对齐符号之后,我们可以提供一个数字来指定最小字段宽度;如有必要,该字段将自动变大。

例如,'{0:>6}'.format('test')表示将参数 0('test')放在至少 6 个字符宽的空间中,并向右对齐。结果为字符串 ' test' .

但是格式规范实际上可以包含一个全新的替换字段!这允许我们提供一个变量来控制字段宽度。所以在我的格式字符串中 {1:>{2}}表示将 arg 1 放在这里 ( s ),在宽度由 arg 2 ( pad ) 给出的字段中右对齐。只允许一层替换字段嵌套,但很难想象您实际上想要更深嵌套的情况。

所以把它们放在一起:'{0}\n{1:>{2}}\n{0}'告诉.format使用默认格式规范构建一个以 arg 0 ( stars ) 开头的字符串,后跟一个换行符,然后是 arg 1 ( s ) 在宽度为 pad 的字段中右对齐, 接着是另一个换行符,最后又是 arg 0 ( stars )。

我希望这足够有意义。 :)


在 Python 3.6+ 中,我们可以使用 f 字符串:

def banner(s, width=69):
    stars = '*' * width
    pad = (width + len(s)) // 2
    return f'{stars}\n{s:>{pad}}\n{stars}'

关于python - python中的多行字符串格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47711886/

相关文章:

python - R httr错误403

.net - 如何使用正则表达式进行多行搜索?

c# - 匹配多行的正则表达式选项以及忽略大小写

Flutter Web TextForm 字段

python - 如何解决python硬编码字典编码问题

python - 如何在 Python 中测试 "immutability-at-any-depth"?

python - Tensorflow:在 setup.py 中自动安装

python - 如何使用Sensu监控Python脚本?

正则表达式(多行)- 仅当所有行不包含 $ 时才匹配

php - preg_match 和新行符号