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

转载于:https://www.cnblogs.com/yshen4/p/9282015.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值