3.2字符串格式化使用字符串格式化操作符即百分号%来实现
>>>format = "hello,%s.%s enough for ya?"
>>>values = (‘world‘,‘Hot‘)
>>>print format % values
hello,world.Hot enough for ya?
>>>
格式化字符串的%s部分称为转换说明符,它们标记了需要插入转换值的位置.s表示值会被格式化为字符串----如果不是字符串,则会用str将其转换为字符串.
如果要格式化字符串字符串里面包括百分号,那么必须使用%%
如果格式化实数,可以使用f说明符类型,同时提供所需要的精度
>>> format = "pi with three decimals:%.3f"
>>> from math import pi
>>> print format % pi
pi with three decimals:3.142
>>>
string模块提供另外一种格式化值得方法:模板字符串.它的工作方式类似于很多unix shell里的变量替换.substitute这个模板方法会用传递进来的关键字参数foo替换字符串中的$foo
>>> from string import Template
>>> s = Template(‘$x,glorious $x!‘)
>>> s.substitute(x=‘slurm‘)
‘slurm,glorious slurm!‘
>>>
如果替换字段是单词的一部分,那么参数名就必须用括号起来,从而准确指明结尾:
>>> s = Template("It‘s ${x}tastic!")
>>> s.substitute(x=‘slurm‘)
"It‘s slurmtastic!"
>>>
可以使用$$插入美元符号:
>>> s = Template("Make $$ selling $x!")
>>> s.substitute(x=‘slurm‘)
‘Make $ selling slurm!‘
>>>
除了关键字参数之外,还可以使用字典变量提供值/名称对:
>>> s = Template(‘A $thing must never $action.‘)
>>> d = {}
>>> d[‘thing‘] = ‘gentleman‘
>>> d[‘action‘] = ‘show his socks‘
>>> s.substitute(d)
‘A gentleman must never show his socks.‘
>>>
3.3字符串格式化:完整版
格式化操作符的右操作数可以是任何东西,如果是元组或映射类型,那么字符串格式化将会有所不同.
如果需要转换的元组作为转换表达式的一部分存在,那么必须将它用圆括号括起来,以避免出错.
>>> ‘%s plus %s equals %s‘ % (1,1,2)
‘1 plus 1 equals 2‘
>>>
1.%字符:标记转换说明符的开始
2.转换标志:-表示左对齐;+表示在转换值之前要加上正负号;""表示正数之前保留空格;0表示转换值若位数不够则用0填充
3.最小字段宽度:转换后的字符串至少应该具有该值指定的宽度.如果是*.则宽度会从值元组中读出.
4.点(.)后跟精度值:如果转换的是实数,精度值就表示出现在小数点后的位数.如果转换的是字符串,那么该数字就表示最大字段宽度.如果是*,那么精度将会从元组中读出
5.转换类型 见书 3-1 表
3-1-1简单转换
>>> ‘Price of eggs:$%d‘ % 42
‘Price of eggs:$42‘
>>> ‘Hexadeciaml price of eggs: %x‘ % 42
‘Hexadeciaml price of eggs: 2a‘
>>> from math import pi
>>> ‘Pi:%f...‘ % pi
‘Pi:3.141593...‘
>>> ‘Very inexact estimate of pi: %i‘ %pi
‘Very inexact estimate of pi: 3‘
>>> ‘Using str: %s‘ % 42L
‘Using str: 42‘
>>> ‘Using repr: %s‘ % 42L
‘Using repr: 42‘
>>>
3.3.2字段宽度和精度
转换说明符可以包括字段宽度和精度.字段宽度是转换后的值所保留的最小字符个数,精度则是结果中应该包含的小数位数,或者是转换后的值所能包含的最大字符个数
>>> ‘%10f‘ % pi 字段宽10
‘ 3.141593‘
>>> ‘%10.2f‘ % pi 字段宽10 精度2
‘ 3.14‘
>>> ‘%.2f‘ % pi 精度2
‘3.14‘
>>> ‘%.5s‘ % ‘Guido van Rossum‘
‘Guido‘
可以使用* 作为字段宽度或精度,此时数值会从元组参数中读出:
>>> ‘%.*s‘ % (5, ‘Guido van Rossum‘)
‘Guido‘
>>> ‘%*.*s‘ % (10,5, ‘Guido van Rossum‘)
‘ Guido‘
>>>
3.3.3符号,对其和0填充
>>> ‘%010.2f‘ % pi
‘0000003.14‘
>>>
3-1字符串格式化示例
#!/usr/bin/env python
width = input(‘Please enter width:‘)
price_width = 10
item_width = width - price_width
header_format = ‘%-*s%*s‘
format = ‘%-*s%*.2f‘
print ‘=‘ * width
print header_format % (item_width,‘Item‘,price_width,‘Price‘)
print ‘-‘ * width
print format % (item_width,‘Apples‘,price_width,0.4)
print ‘=‘ * width
3.4字符串方法
尽管字符串方法完全来源于string模块,但是这个模块还包括一些不能作为字符串方法使用的常量和函数.maketrans函数就是其中之一,后面会将它和translate方法一起介绍,下面是一些有用的字符串常量
string.digits:包括数字0~9的字符串
string.letters:包含所有字母的字符串
string.lowercase:包含所有小写字母的字符串
string.printable:包含所有可打印字符的字符串
string.punctuation:包含所有标点的字符串
string.uppercase:包含所有大写字母的字符串
3.4.1 find
find方法可以在一个较长的字符串中查找子字符串。它返回子串所在位置的最左端索引。如果没有找到则返回-1
>>> ‘With a moo-moo here,and a moo-moo there‘.find(‘moo‘)
7
>>> title = "Monty Python‘s Flying Circus"
>>> title.find(‘Monty‘)
0
>>> title.find(‘Python‘)
6
>>> title.find(‘Flying‘)
15
>>> title.find(‘Zirquss‘)
-1
>>>
可选的起始点和结束点参数
>>> subject = ‘$$$ Get rich now!!! $$$‘
>>> subject.find(‘$$$‘)
0
>>> subject.find(‘$$$‘,1)
20
>>> subject.find(‘!!!‘)
16
>>> subject.find(‘!!!‘,0,16)
-1
>>>
3.4.2 join
join方法是非常重要的字符串方法,它是split方法的逆方法,用来在队列中添加元素。
>>> seq = [‘1‘,‘2‘,‘3‘,‘4‘,‘5‘]
>>> sep.join(seq)
‘1+2+3+4+5‘
>>>
>>> dirs = ‘‘,‘usr‘,‘bin‘,‘env‘
>>> ‘/‘.join(dirs)
‘/usr/bin/env‘
>>> print ‘C:‘ + ‘\\‘.join(dirs)
C:\usr\bin\env
>>>
需要添加的队列元素都必须是字符串。
3.4.3 lower
lower方法返回字符串的小写字母版
>>> ‘Trondheim Hammer Dance‘.lower()
‘trondheim hammer dance‘
>>>
>>> name = ‘Gumby‘
>>> names = [‘gumby‘,‘smith‘,‘jones‘]
>>> if name.lower() in names: print ‘Found it‘
...
Found it
>>>
另一个string模块的capwords函数
>>> string.capwords("that‘s all,folks")
"That‘s All,folks"
>>>
3.4.4 replace
replace方法返回某字符串的所有匹配项均被替换之后得到字符串
>>> ‘This is a test‘.replace(‘is‘,‘eez‘)
‘Theez eez a test‘
>>>
3.4.5 split
这是一个非常重要的字符串方法,它是join的逆方法,用来将字符串分割成序列
>>> ‘1+2+3+4+5‘.split(‘+‘)
[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘]
>>> ‘/usr/bin/env‘.split(‘/‘)
[‘‘, ‘usr‘, ‘bin‘, ‘env‘]
>>> ‘Using the default‘.split()
[‘Using‘, ‘the‘, ‘default‘]
>>>
3.4.6 strip
返回除两侧空格的字符串:
>>> ‘ inernal whitespace is kept ‘.strip()
‘inernal whitespace is kept‘
>>>
它和lower方法一起使用的话就可以很方便的对比输入的和存储的值.让我们回到lower部分中的用户名的例子,假设用户在输入名字时无意中在名字后面加上了空格:
>>> names = [‘gumby‘,‘smith‘,‘jones‘]
>>> name = ‘gumby ‘
>>> if name in names : print ‘Found it‘
...
>>> if name.strip() in names: print ‘Found it‘
...
Found it
>>>
也可以指定需要去除的字符,将它们列为参数即可.
>>> ‘***SPAM*for*everyone!!!***‘.strip(‘*!‘)
‘SPAM*for*everyone‘
>>>
3.4.7 translate
translate方法和replace方法一样,可以替换字符串中的某些部分,但是和前者不同的是,translate方法只处理单个字符.它的优势在于可以同时进行多个替换,有些时候比replace效率高的多.
在使用translate转换之前,需要先完成一张转换表.转换表中是以字符替换某字符的对应关系.因为这个表有多达256个项目,我们还是不要自己写了,使用string模块里面的maketrans函数就行.
maketrans函数接受两个参数:两个等长的字符串,表示第一个字符串中的每个字符都用第二个字符串中相同位置的字符替换.
>>> from string import maketrans
>>> table = maketrans(‘cs‘,‘kz‘)
>>> len(table)
256
>>> table[97:123]
‘abkdefghijklmnopqrztuvwxyz‘ 字母c和s 分别替换成kz
>>> maketrans(‘‘,‘‘)[97:123]
‘abcdefghijklmnopqrstuvwxyz‘
>>>
创建这个表以后,可以将它用作translate方法的参数,进行字符串的转换如下:
>>> ‘this is an incredible test‘.translate(table)
‘thiz iz an inkredible tezt‘
translate的第二个参数是可选的,这个参数是用来指定需要删除的字符.
>>> ‘this is an incredible test‘.translate(table,‘ ‘)
‘thizizaninkredibletezt‘
非英语字符串的问题
有些时候类似于lower这样的字符串方法并不能如我们所愿地进行工作.