本章讲话介绍如何使用字符串格式化其他的值,并简单了解一下利用字符串的分割、联接、搜索等方法能做些什么。
基本字符串操作
所有标准的序列操作(索引、分片、乘法。判断成员资格、求长度、取最大最小值)对字符串同样适用,但,字符串都是不可变的,因此字符串的分片赋值是不合法的。
字符串格式化:精简版
字符串格式化 使用 字符串格式化操作符,即百分号 % 来实现。
在%的左侧放置一个字符串(格式化字符串),而右侧放置希望格式化的值。
>>> format = 'My %s %s is football' >>> values = ('favor','sport') >>> print format %values My favor sport is football
格式化字符串的%s部分称为转换说明符(conversion specifier),它们标记了需要插入转换值的位置。s表示会被格式化为字符串--如果不是字符串,则会用str将其转换为字符串。
格式化实数,可以用f说明符,同时提供所需要的精度:一个句点再加上希望保留的小数位数。例子如下:
>>> format = 'Pi is with three decimals: %.3f' >>> from math import pi >>> print format % pi Pi is with three decimals: 3.142
字符串格式化:完整版
基本的转换说明符包括以下部分:
- %字符:标记转换说明符的开始;
- 转换标志(可选):- 表示左对齐; +表示在转换值之前要加上正负号;" "(空白字符)表示正数之前保留空格;0 表示转换值若位数不够则用0填充;
- 最小字段宽度(可选):转换后的字符串至少应该具有该值的指定的宽度。如果是*,则宽度会从值元组中读出;
- 点(.)后跟精度值(可选):转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽度会从值元组中读出;
- 转换类型表:
- 简单转换
>>> 'price of the eggs: %d' %9.5 'price of the eggs: 9' >>> 'test tr :%s' %42L 'test tr :42' >>> 'test tr: %r' %42L 'test tr: 42L'
- 字段宽度和精度
>>> from math import pi >>> '%10f' %pi #字段宽度10 ' 3.141593' >>> '%10.2f' %pi #字段宽度10,精度2 ' 3.14' >>> '%.2f' %pi #精度2 '3.14' >>> '%.5s' %'python is funny' 'pytho'
可以使用 * 作为字段宽度或者精度
>>> '%.*s' %(3,'testing') 'tes'
- 符号、对齐和0填充
>>> '%010.2f' %pi '0000003.14'
在字段宽度和精度值之前还可以放置一个“标表”,该标表可以是零、加号、减号 或者是空格。零表示数字将会用0进行填充。
减号(-)用来左对齐数值
>>> '%-10.2f' %pi '3.14 '
+,表示不管是正数还是负数都标出符号
>>> print ('%+5d' %10)+ '\n' + ('%+5d' %-10) +10 -10
代码清单中的代码将使用星号字段宽度说明符来格式化一张包含水果价格的表格,表格的总宽度由用户输入。因为是用户提供信息,所以就不能在转换说明符中将字段宽度硬编码。使用星号运算符就可以从转换元组中读出字段宽度。
#user provide the list's width width = input('Please enter the 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.5) print format %(item_width,'apples',price_width,0.6) print format %(item_width,'apples',price_width,0.7) print '='*width
结果如下:
Please enter the width:50 ================================================== item price -------------------------------------------------- apples 0.50 apples 0.60 apples 0.70 ================================================== >>>
字符串方法
- find
find方法可以在一个较长的字符串中查找子字符串。它返回子串所在位置的最左端索引,如果没有找到则返回-1.示例如下:>>> 'my test python program'.find('python') 8 >>> title = 'python basic book' >>> title.find('python') 0 >>> title.find('books') -1
- split
它是join的逆方法,用来将字符串分割成序列。>>> '1+2+3+4+5'.split('+') ['] >>> '/usr/bin/local'.split('/') ['', 'usr', 'bin', 'local'] >>> 'Using the default'.split() ['Using', 'the', 'default']
如果不提供任何分隔符,程序会把所有空格作为分隔符(空格,制表,换行等)
- join
join是split方法的逆方法,用来在队列中添加元素:>>> seq = ['a','b','c'] >>> sep = '+' >>> sep.join(seq) 'a+b+c' >>> dirs = '','usr','bin','local' >>> '/'.join(dirs) '/usr/bin/local' >>> print 'C:'+ '\\'.join(dirs) C:\usr\bin\local#转义符示例 >>> '\\' '\\' >>> print 's'+'\n'+'s' s s >>> print 's'+'\t'+'s' s s >>> print 's'+'\\'+'s' s\s
- lower
>>> 'My Lower Program!'.lower() 'my lower program!' >>> names = ['apple','banana','pear'] >>> name = 'Apple' >>> if name.lower() in names: print name Apple
- replace
replace方法返回某字符串的所有匹配项均被替换后得到的字符串。"test str is 'str'".replace('str','python') "test python is 'python'"
- strip
strip方法返回去除两侧(不包括内部)空格的字符串:>>> ' test '.strip() 'test'
- translate
translate方法和replace方法一样,可以替换字符串中的某些部分,但是和前者不同的是,translate方法只处理单个字符。它的又是在于可以同时进行多个替换。