python的字符串格式化

Posted 省心省力

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python的字符串格式化相关的知识,希望对你有一定的参考价值。

1、python到底有那几种字符串格式化模块?

python有3种格式化字符串的方法:

  • 传统的%字符串格式符
  • str.format函数
  • 字符串模版template

新的python 3.6+还提供了新的f修饰符

2、传统的%字符串格式符

python采用了类似于在C语言中使用sprintf的字符串格式化输出。String对象有一个独特的内置操作:%操作符。 这也称为字符串格式化或插值运算符。 给定格式%值(其中format是字符串),转换规范将格式的%将替换为零个或多个元素值。

‘%[[(key)][flag][width][.precision]]type’%(key list)

如果format单个参数,则key可以是单个非元组对象: ‘%s’%key。否则,值必须是具有格式字符串指定的项目数的元组,或者是单个映射对象(例如,字典)。

flag可以是#, 0, -, 空格,或是+:

Flag    意义
#    The value conversion will use the ``alternate form‘‘ (where defined below).
0    The conversion will be zero padded for numeric values.
-    The converted value is left adjusted (overrides the "0" conversion if both are given).
     (a space) A blank should be left before a positive number (or empty string) produced by a signed conversion.
+    A sign character ("+" or "-") will precede the conversion (overrides a "space" flag).

type可以是下面定义不同类型:

type 意义                    注释
d    Signed integer            decimal.    
i    Signed integer            decimal.    
o    Unsigned octal.             (1)
u    Unsigned                decimal.    
x    Unsigned hexadecimal (lowercase).  (2)
X    Unsigned hexadecimal (uppercase).  (2)
e    Floating point exponential format (lowercase).    
E    Floating point exponential format (uppercase).    
f    Floating point             decimal format.    
F    Floating point             decimal format.    
g    Same as "e" if exponent is greater than -4 or less than precision, "f" otherwise.    
G    Same as "E" if exponent is greater than -4 or less than precision, "F" otherwise.    
c    Single character (accepts integer or single character string).    
r    String (converts any python object using repr()).    (3)
s    String (converts any python object using str()).    (4)
%    No argument is converted, results in a "%" character in the result.    

 比如:

  • >>> ‘%(name)s GPA is %(#)07.3f‘%{‘name‘:‘Yue‘, ‘#‘:88.2}
    ‘Yue GPA is 088.200‘

  • >>> ‘%(name)10s GPA is %(#) 7.2f‘%{‘name‘:‘Jun‘, ‘#‘:89.1299}
    ‘          Jun GPA is 89.13‘

3. str.format函数

PEP 3101 规定了使用str.format()函数格式化字符串的标准。str.format()的语法:

‘...{replacement_field}...‘.format(*arg, **kargs)

具体解释如下:

replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
arg_name          ::=  [identifier | integer]
attribute_name    ::=  identifier
element_index     ::=  integer | index_string
index_string      ::=  <any source character except "]"> +
conversion        ::=  "r" | "s"
format_spec       ::=  <described in the next section>

例子:

>>> Bring {0} a {1}.format(me, apple)  # 和C#有点像,数字代表位置
Bring me a apple
>>> Bring {} a {}.format(me, apple) 
Bring me a apple
>>> Bring {name} a {fruit}.format(fruit=me, name=apple)
Bring apple a me

下面是format_spec的定义:

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <any character>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

有时候,还需要更进一步定制,这时需要使用string模块里的formatter类来定制格式, Formatter类有以下公共函数:

  • format(format_string*args**kwargs):它调用下面vformat函数。
  • vformat(format_stringargskwargs):根据参数和格式化串产生相应的字符串。它调用下面可以重载的函数。

此外,Formatter类还定义了其他一些可以重载的函数:

  • parse(format_string):分解格式化定义format_string;
  • get_field(field_nameargskwargs):根据parse()的输出,为某一field产生格式化对象;
  • get_value(keyargskwargs):获取某一field的值;
  • check_unused_args(used_argsargskwargs)
  • format_field(valueformat_spec)
  • convert_field(valueconversion) 

4. 字符串模版template

模板支持基于$的替换,而不是正常的基于%的替换:

  • $$用于替换$。
  • $ identifier命名匹配映射关键字“identifier”的替换占位符。 默认情况下,“identifier”必须拼写Python标识符。 $字符后面的第一个非标识符字符终止此占位符规范。
  • $ {identifier}相当于$ identifier。 当有效标识符字符跟随占位符但不是占位符的一部分时,例如“$ {noun} ification”,则需要它。
  • 字符串中$在其他任何地方出现,都将导致ValueError异常。

例子:

>>> from string import Template
>>> s1 = Template(Today is $weekday, it is $weather)
>>> s1.substitute(weekday = Tuesday, weather = sunny)
Today is Tuesday, it is sunny
>>> s1.substitute(weekday = Tuesday)
...
KeyError: weather
>>> s1.safe_substitute(weekday = Tuesday)
Today is Tuesday, it is $weather
>>> s2 = Template($fruit is $2.99 per pound)
>>> s2.substitute(fruit = apple)
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> s2 = Template($fruit is $$2.99 per pound)
>>> s2.substitute(fruit = apple)
apple is $2.99 per pound

References:

[1] https://docs.python.org/2/library/stdtypes.html#string-formatting

[2] https://docs.python.org/2/library/string.html



以上是关于python的字符串格式化的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 格式(f-string)字符串中,!r 是啥意思? [复制]

python颜色压缩的结果颜色比保存颜色深

我应该如何使用 Outlook 发送代码片段?

Python代码阅读(第25篇):将多行字符串拆分成列表

如何在 Javadoc 中使用 @ 和 符号格式化代码片段?

为 Blogger 上的博客格式化代码片段 [关闭]