第三章:使用字符串
本章将会介绍如何使用字符串格式化其他的值(如打印特殊格式的字符串),并简单了解一下利用字符串的分割、连接、搜索等方法能做些什么。
基本字符串操作
所有标准的序列操作(索引、分片、乘法、判断成员资格、求长度、取最大最小值)对字符串同样适用。
记住:字符串是不可变的!
字符串格式化:精简版
字符串格式化使用字符串格式化操作符(这个名字还是很恰当地)即百分号%来实现。
注:%也可以用来作模运算(求余)操作符。
在%左侧放置一个字符串(格式化字符串),而右侧放置希望被格式化的值。可以使用一个值,也可以使用多个值的元祖或者字典。
>>>fromat = "hello, %s.%s enough?"
>>>values = ('michael','dut')
>>>print format % values
hello, michael.dut enough?
格式化字符串的%s部分称为转换说明符。
如果要格式化实数(浮点数),可以用f说明转换说明符的类型。因为格式化转换说明符总是以表示类型的字符结束。同时提供所需要的进度:一个句点加上希望保留的小数位数。
>>>format = "pi with three decimals: %.3f"
>>>form math import pi
>>>print format % pi
pi with three decimals: 3.142
字符串格式化:完整版
格式化操作符的右操作数可以是任意类型,在此,先了解一下元祖。
如果右操作数是元祖的话,则其中的每一个元素都会被单独格式化,每个值都需要一个对应的转换说明符。
一个都不能少!
如果需要转换的元祖作为转换表达式的一部分存在,元祖必须用圆括号括起来,否则会出错!
基本的转换说明符包括以下部分。注意,这些项的顺序是至关重要的!
%字符:标记转换说明符的开始
转换标志(可选):
-
表示左对齐,+
表示在转换值之前要加上正负号;“”(空白字符)表示正数之前保留空格;0
表示转换值至若位数不够则用0填充。最小字段宽度(可选):转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽度会从值元祖中读出。
点(.)后跟精度值(可选):如果转换的是实数,精度值表示保留几位小数。如果转换的是字符串,那么该数字就表示
最大字段宽度
。如果是*,那么进度将会从元祖中读出。转换类型:查看表
字符串格式转换类型
格式 | 描述 |
---|---|
%c | 字符及其ASCII码 |
%s | 字符串(使用str转换任意Python对象) |
%r | 字符串(使用repr转换任意Python对象) |
%d(%i) | 有符号整数(十进制) |
%u | 无符号整数(十进制) |
%o | 无符号整数(八进制) |
%x | 无符号整数(十六进制) |
%X | 无符号整数(十六进制大写字符) |
%e | 浮点数字(科学计数法) |
%E | 浮点数字(科学计数法,用E代替e) |
%f(%F) | 浮点数字(用小数点符号) |
%g | 浮点数字(根据值的大小采用%e或%f) |
%G | 浮点数字(类似于%g) |
%p | 指针(用十六进制打印值的内存地址) |
%n | 存储输出字符的数量放进参数列表的下一个变量中 |
简单的转换
>>>'using str:%s'% 42L
'using str: 42'
>>>'using repr:%r'% 42L
'using repr: 42L'
字段宽度和精度
这两个参数都是整数(首先是字段宽度,然后是精度),通过点好(.)分隔。虽然两个都是可选的参数,但是如果只给出精度,就必须包含点好:
>>>'%10.2f'%pi
' 3.14' #6个空格
可以使用*(星号)作为字段宽度或者精度(或者两者都用),此时数值会从元祖参数中读出:
>>>'%.*s'%(5,'michael xiang')
'micha'
符号、对齐和用0填充
在字段宽度和精度之前还可以放置一个“标志”,该标志可以是:
0
0
表示将会用0
填充+
加号表示,不管是正数还是负数,都要标识出正负号-
减号表示用来左对齐数值空格 空格:表示正数前加上空格,这对需要对齐正负数时会很有用
0
表示将会用0
填充
>>>'%010.2f'%pi #0填充,并不表示八进制,字段宽度10,精度2
'0000003.14'
>>>'%-10.2f'*%pi
'3.14 ' #看到没,右侧多了空格,数值左对齐了
>>>print ('% 5d' % 10) + '\n' + ('% 5d' % -10)
10
-10
>>>print ('%+5d' % 10) + '\n' + ('s%+5d' % -10)
+10
-10
字符串方法
字符串的方法比列表方法还要丰富的多,因为字符串从string
模块中“继承”了很多方法。因为字符串的方法太多,这里只介绍一些特别有用的方法。
附上:官方模块参考文档——Python Module Index
find
find
方法可以在一个较长的字符串中查找子串,返回子串所在位置的最左端索引。如果没有找到,返回-1。
>>>'hello michael, i am michael'.find('michael')
6 #可见,空格也包含在内了
这个方法还可以接收可选的起始点和结束点参数:
>>>'hello michael,your name is michael'.find('michael',7,27)
-1
注:不包含第二个索引,这在python中是惯例
join
join
方法是非常重要的字符串方法,它是split
方法的逆方法,用来连接序列中的元素:
>>>seq=[1,2,3,4,5]
>>>sep='+'
>>>sep.join(seq) #连接数字列表,不是字符串,你看下面就出错啦!
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-966645d088a4> in <module>()
1 seq=[1,2,3,4,5]
2 sep='+'
----> 3 sep.join(seq)
TypeError: sequence item 0: expected string, int found
>>>seq=['1','2','3','4']
>>>sep.join(seq) #连接字符串列表
‘1+2+3+4’
需要被连接的序列元素都必须是字符串。
lower
lower
方法返回字符串的小写字母版
和lower
方法相关的是title
方法,它会将字符串转换为标题——也就是所有档次的首字母大写,其他小写。但是它使用的单词划分方法可能会得到并不自然的结果。
replace
replace
方法返回某字符串的所有匹配项均被替换之后得到字符串。
>>>'michael hello michael'.replace('mi','hh')
'hhchael hello hhchael'
有点类似word里的“查找替换”功能吧!是不是很有用啊!
split
这是一个非常重要的字符串方法,它是join
方法的逆方法,用来将字符串分隔成序列:
>>>'1+2+3+4'.split('+')
['1','2','3','4']
>>>'using the default'.split()
['using','the','default']
注意:如果不提供任何分隔符,程序将会把所有空格作为分隔符(空格、制表、换行等)。
strip
strip
方法返回去除两侧(不包括内部)空格的字符串:
>>>' internal whitespace is kept '.strip()
'internal whitespace is kept'
translate
translate
方法和replace
方法一样,可以替换字符串中的某些部分,但是和前者不同的是,translate
方法只处理单个字符。它的优势在于可以同时进行多个替换,有些时候比repalce
效率搞得多!
在使用translate
转换之前,需要先完成一张转换表。使用string
模块里面的maketrans函数就行。
>>>from string import maketrans
>>>table = maketrans('cs','kz') #c->k,s->z,创建这个表之后,可以将它用做`translate`方法的参数
>>>'this is an incredible test'.translate(table)
'thiz iz an inkredible tezt'
>>>'this is an incredible test'.translate(table,' ') #`translate`的第二个参数是可选的,这个参数是用来指定需要删除的字符。
'thizizaninkredibletezt'
可见,translate
和maketrans
方法一起更配噢~
本章小结
这章内容相对比较少,字符串的方法确实很多,到时候,可以去查找,没必要记那么多,常见的弄熟悉就差不多了吧。
其实,这章最大的收获应该是字符串格式化时的一个例子:
>>>'%10f'%pi #输出结果是' 3.141593'这里没有得到结果'3.14159265'让我产生了疑惑。
后来各处查询资料,才知道,默认小数保留位数为6。因此,才是得到那样的结果。format
可以翻译为格式化吧。
自己学会查找资料真的很重要!官方文档其实写的很棒的!不要惧怕英文!
官方模块参考文档——Python Module Index