一、基本字符串操作
所有标准的序列操作(分片、索引、乘法、成员资格、求长度、最大值、最小值)对于字符串同样适用,但是字符串是不可变的,也就是说不能对字符串进行修改。
二、字符串格式化
1、基本语法
1.1 字符串使用字符串格式化操作符 “%” 来实现格式化,在%的左侧放置一个字符串,右侧放置希望被格式化的值。
>>> format="Hello,%s,%s enough for ya?"
>>> values=('world','Hot')
>>> print format % values
Hello,world,Hot enough for ya?
其中%s称为转换说明符,它标记了需要插入转换值的位置。s表示值会被格式化为字符串——如果不是字符串,则会用str将其转换为字符串。
注意:只有元组和字典可以格式化一个以上的值,使用其他序列会被解释为一个值。
1.2 如果要格式化实数(浮点数),可以使用f说明转换说明符的类型,同时提供所需要的精度:一个句点加上希望保留的小数位数。
>>> format="Pi with three decimals:%.3f"
>>> from math import pi
>>> print format % pi
Pi with three decimals:3.142
精度应该放在类型字符前面。
1.3 模板字符串
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.'
2、完整的进行字符串格式化
2.1 基本的转换说明符包括以下几个部分。注意,这些项的顺序是固定的。
(1)%字符:标记转换说明符的开始。
(2)转换标志(可选):- 表示左对齐;+表示在转换值之前要加上正负号;""(空白字符)表示正数之前保留空格;0表示转换值若位数不够则用0填充。
(3)最小字段宽度(可选):转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽度会从值元组中读出。
(4)点(.)后跟精度值(可选):如果转换的是实数,精度值就表示出现在小数点后的位数。如果转换的是字符串,那么该数字就表示最大字段宽度。如果是*,那么精度会从元组中读出。
(5)转换类型:见下表。
2.2 简单转换
>>> 'Price of egg:$%d'%42
'Price of egg:$42'
>>> 'Hexadecimal price of eggs:%x'%42
'Hexadecimal 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:%r'%42L
'Using repr:42L'
2.3 字段宽度和精度
字段宽度是指转换后的值所保留的最小字符个数。
精度指的是结果中应该包含的小数位数,或者(对于字符串)是转换后的值所能包含的最大字符个数。
格式为(字段宽度.精度),如果只给出精度,就必须包含点号;如果只给出字段宽度,则不需要加点号:
>>> '%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'
2.4 符号、对齐和用0填充
用0填充:
>>> '%010.2f'%pi
'0000003.14'
(-)左对齐:
>>> '%-10.2f'%pi
'3.14 '
("")也就是空白,相当于空格,表示正数前加空格:
>>> print('% 5d'%10)+'\n'+('% 5d'% -10)
10
-10
以上操作符都应放在字段宽度和精度的前面,顺序严格按照2.1所示的顺序执行。
三、字符串方法
1、find方法用于在一个较长的字符串中查找子串,返回子串所在位置的最左端索引,如果没有则返回-1。
>>> 'With a moo-moo here,and amoo-moo there'.find('moo')
7
>>> title="Monty Pyhon's Flying Circus"
>>> title.find('Monty')
0
>>> title.find('Pyhon')
6
>>> title.find('Flying')
14
>>> title.find('Zirquss')
-1
该方法还可以接收可选的起始点和结束点参数:
>>> subject='$$$ Get rich now!!! $$$'
>>> subject.find('$$$')
0
>>> subject.find('$$$',1)
20
>>> subject.find('!!!')
16
>>> subject.find('!!!',0,16)
-1
2、join方法用来连接序列中的元素:
>>> seq=[1,2,3,4,5]
>>> sep='+'
>>> sep.join(seq)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
sep.join(seq)
TypeError: sequence item 0: expected string, int found
>>> seq=['1','2','3','4','5']
>>> sep='+'
>>> 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、lower方法返回字符串的小写字母版:
>>> 'Trondheim Hammer Dance'.lower()
'trondheim hammer dance'
4、replace
replace方法返回某字符串的所有匹配项均被替换之后得到字符串。类似于“查找并替换”的功能。
>>> 'This is a test'.replace('is','eez')
'Theez eez a test'
5、split方法是join的逆方法,用来将字符串分割成序列。
>>> '1+2+3+4+5'.split('+')
['1', '2', '3', '4', '5']
>>> 'Using the default'.split()
['Using', 'the', 'default']
注意:如果不提供任何分隔符,程序会把所有空格作为分隔符(空格、制表、换行等)。
6、strip方法返回去除两侧(不包括内部)空格的字符串:
>>> ' internal whitespace is kept '.strip()
'internal whitespace is kept'
也可以指定去除的字符:
>>> '*** SPAM * for * wvwryone!!! ***'.strip('*!')
' SPAM * for * wvwryone!!! '
>>> '*** SPAM * for * wvwryone!!! ***'.strip( '*')
' SPAM * for * wvwryone!!! '
上述两段代码的结果一样,目前不清楚!的具体意思
7、translate方法和replace方法一样,唯一的区别在于translate方法只处理单个字符,它的优势在于可以同时进行多个替换,有时候比replace效率高。