3.1 基本字符串操作
【代码】
#所有标准的序列操作(索引、分片、乘法、判断成员资格、
#
求长度、取最小值和最大值)对字符串同样适用,但字符串是不可改变的website = 'http://www.python.org'
website[-3:] = 'com'
【结果】
Traceback (most recent call last):
File"D:/python_file/20180113/test.py", line 4, in
website[-3:] = 'com'
TypeError: 'str' object does not support item assignment
3.2 字符串格式化(精简版)
【代码】
#在%的左侧放置一个字符串(格式化字符串),而右侧放置希望格式化的值。一般情况下适用元组format = "Hello. %s. %s enough for ya?" #%s部分称为转换说明符,标记了需要插入转换值的位置,# s表示值会被格式化为字符串--若不是字符串,使用str将其转换为字符串values = ('world','Hot')
print(format % values)
#注:如果使用列表或其他元素代替元组,那么序列会被解释为一个值。只有元组和字典可以格式化一个以上的值
#
若在格式化字符串中包括百分号,那么必须使用%%,这样,Python就不会将百分号误认为是转换说明符了
#
格式化实数:可以使用f说明符类型,同时提供精度(句点加上希望保留小数的位数)format = 'P1 with three decimals: %.3f'
from math import pi
print(format % pi)
【结果】
Hello. world. Hot enough for ya?
P1 with three decimals: 3.142
【代码】
#stirng模块提供另外一种格式化值的方法:模板字符串。其中,substitute这个模板方法会用传递进来的关键字参数foo替换字符串中的¥foofrom string import Template
s = Template(
'$x. glorious $x!')
print(s)
print(s.substitute(x='slum')) #模板调用模板方法并传入参数
#
如果替换字段是单词的一部分,那么参数名必须用括号括起来s = Template("It's ${x}tastic!")
print(s.substitute(x = 'slum'))
#可以使用$$插入美元符号s = Template('Make $$ selling $x')
print(s.substitute(x = 'slum'))
#除了关键字参数之外,还可以使用字典变量提供值/名称对s = Template('A $thing must never $action')
d = {}
d[
'thing'] = 'gentleman'
d['action'] = 'show his socks'
print(s.substitute(d))
【结果】
slum. glorious slum!
It's slumtastic!
Make $ selling slum
A gentleman must never show his socks
3.3 字符串格式化(完整版)
【代码】
#如果右操作数是元组的话,则其中的每一个元素都会被单独格式化,每个值都需要一个对应的转换说明符print('%s
plus %s equals %s' % (1,1,2))
print('%s
plus %s equals %s' % 1,1,2) #Lacks parentheses!
【结果】
1 plus 1 equals 2
Traceback (most recent call last):
File"D:/python_file/20180113/test.py", line 3, in
print('%s plus %s equals %s' %1,1,2) #Lacks parentheses!
TypeError: not enough arguments for format string
字符串格式化转换类型
d,i带符号的十进制数
o不带符号的八进制
u不带符号的十进制
x不带符号十六进制(小写)
X不带符号十六进制(大写)
f,F十进制浮点数
C单字符
r字符串(使用repr转换任意Python对象)
s字符串(使用str转换任意Python对象)
3.3.1 简单转换
【代码】
#简单转换只需要写出转换类型print('Price
of eggs:$%d' % 42)
print('Hexadecimal
price of eggs: %x' % 42)
from math import pi
print('Pi:%f...'% pi)
print('Very
inexact estimate of pi: %i' % pi)
print('Using
str: %s' % 42)
print('Using
repr: %r' % 42)
【结果】
Price of eggs:$42
Hexadecimal price of eggs: 2a
Pi:3.141593...
Very inexact estimate of pi: 3
Using str: 42
Using repr: 42
3.3.2 字段宽度和精度
【代码】
#转换说明符可以包括字段宽度和精度。宽度是转换后的值所保留的最下字符个数,精度(对于数字转换来说)则是结果中应该包含的小数位数,或者(对于字符串转换来说)是转换后的值所包含的最大字符个数from math import pi
print('%10f' % pi) #字段宽10print('%10.2f'% pi) #字段宽10,精度2print('%.2f'% pi) #精度2print('%.5s'% 'Guido van Rossum')
【结果】
3.141593
3.14
3.14
Guido
3.3.3 符号、对齐和0填充
【代码】
#在字段宽度之前还可以放置一个“标表”,该标表可以是零、加好、减号或空格。零表示数字将会使用0进行填充from math import pi
print('%010.2f'% pi)
#减号(-)用来左对齐数值print('%-10.2f'% pi)
print('% 5d' % 10) #" "表示前面填充空格print('%
5d' % -10)
print('%+5d' % 10) # +表示不管是整数还是负数都标出符号(同样在对齐是很有用)print('%+5d'% -10)
【结果】
0000003.14
3.14
10
-10
+10
-10
【代码】
#字符串格式化示例,使用给定的宽度打印格式化后的价格列表width = int(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(format % (item_width,'Pears',price_width,0.5))
print(format % (item_width,'Cantaloupes',price_width,1.92))
print(format % (item_width,'Dried Aprictos (16 oz.)',price_width,8))
print(format % (item_width,'Prunes (4 1bs.)',price_width,12))
print('=' * width)
form =
'%-*s% *s' # *代表宽度有输入时确定(对应width),-代表左对齐print(form % (10,'Appale',10,'Banana'))
form2 =
'%*s' #%*s代表宽度由输入时确定,且右对齐print(form2 % (20,'Juice'))
【结果】
please enter width:35
===================================
Item Price
-----------------------------------
Apples 0.40
Pears 0.50
Cantaloupes 1.92
Dried Aprictos (16 oz.) 8.00
Prunes (4 1bs.) 12.00
===================================
Appale Banana
Juice
3.4 字符串方法
前面有很多列表的方法,字符串的方法还要丰富些,这是因为字符串从string模块中“继承”了很多方法,早期Python版本中,这些方法以函数的形式出现。字符串方法是在太多,这里只研究常用的。
string模块中还包括一些不能作为字符串方法使用的常量,maketrans函数就是其中之一,它和translate方法可以进行比较。
有用的字符串常量:
string.digits: 包含数字0~9的字符串
string.letters: 包含所有字母(大写或小写)的字符串。
string.lowercase: 包含所有小写字母的字符串
string.printable: 包含所有可打印的字符串
stirng.punctuation: 包含所有标点的字符串
string.uppercase: 包含所有大写字母的字符串
#注:在python3.0中,string.letters和相关内容都会被移除。如果需要则应该使用string.ascii_letters常量代替
3.4.1 find
【代码】
str = 'with a moo-moo here,and a moo-moo there'
title = "Monty Python's Flying Circus"
print(str.find('moo'))
print(title.find('Monty'))
print(title.find('Python'))
print(title.find('Flying'))
print(title.find('Zirquss'))
#字符串的find方法并不返回布尔值subject = '$$$ Get righ now!!! $$$'
print(subject.find('$$$',1)) #只提供起始点print(subject.find('!!!'))
print(subject.find('!!!',0,19)) #提供起始点和结束点(其中,结束点下标所在元素一定在所查找对象的最后一个元素对应下标的右边)
【结果】
7
0
6
15
-1
20
16
16
3.4.2 join
【代码】
#join方法是非常重要的方法,它是split方法的逆方法,用来在队列中添加元素seq = [1,2,3,4,5]
sep =
'+'
#sep.join(seq) #连接数字列表(因为字符串类型连接整型,类型不一致,因此报错)seq = ['1','2','3','4','5']
print(sep.join(seq)) # 即1+2+3+4+5 ,该操作即不改变sep的值,也不改变seq的值,而是在它们的基础上形成新的值dirs = '','usr','bin','env'
print(dirs)
print('/'.join(dirs)) #可以看出,join方法及可以对列表进行操作,也可以对元组进行操作print('C:'+'\\'.join(dirs))
#可以看到,需要添加的队列元素都必须是字符串。
【结果】
1+2+3+4+5
('', 'usr', 'bin', 'env')
/usr/bin/env
C:\usr\bin\env
3.4.3 lower
【代码】
#lower方法返回字符串的小写字母版print('Trondheim
Hamer Dance'.lower())
#方法对应某个对象
#
函数对应某个模块
【结果】
trondheim hamer dance
3.4.4 replace
【代码】
#replace方法返回某字符串的所有匹配项均被替换之后的字符串print('This
is a test'.replace('is','eez'))
#相当于文字处理程序中的“查找和替换”功能
【结果】
Theez eez a test
3.4.5 split
【代码】
#这是一个灰常重要的字符串方法,它是join的逆方法,用来将字符串分割成序列str = '1+2+3+4+5'
str2 = '/usr/bin/env'
str3 = 'Using the default'
print(str.split('+'))
print(str2.split('/'))
print(str3.split()) #不提供任何分隔符,则把空格作为分隔符
【结果】
['1', '2', '3', '4', '5']
['', 'usr', 'bin', 'env']
['Using', 'the', 'default']
3.4.6 strip
【代码】
#strip方法返回去除两侧(不包括内部)空格的字符串str = ' internal whitespace is kept '
print(str.split())
names = [
'gumby','smith','jones']
name =
'gumby ' #如果名字后面多输入了一个空格if name in names:
print('Found1 it!')
if name.strip() innames:
print('Found2 it!')
#也可以指定需要去除的字符,将他们列为参数str = '*** SPAM * for * everyone!!! ***'
print(str.strip('
*!')) #这种方法只会去除两侧的字符(还有:lstrip,rstrip)。
【结果】
['internal', 'whitespace', 'is', 'kept']
Found2 it!
SPAM * for * everyone
3.4.7 translate
【代码】
#transplate方法和replace方法一样,可以替换字符串中的某些部分,但是它只处理单个字符。优势在于可以同时进行多个替换且效率高
#
在使用translate之前,需要先完成一张转换表。转换表中是以某字符替换某字符串的对应关系。因为这个表有多达256个项目,我们还是不要自己写了,直接使用string模块里面的maketrans函数就行
#maketrans
函数接受两个参数:两个等长的字符串,表示第一个字符串中的每个字符都用第二个字符串中相同位置的字符替换。
#BUT: Python3.4
已经没有string.maketrans()了,取而代之的是内建函数: bytearray.maketrans()、bytes.maketrans()、str.maketrans()。Python maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。 注:两个字符串的长度必须相同,为一一对应的关系。table = str.maketrans('cs','kz') #'cs'被替换为'kz'st = 'this is an incredible test'
print(st.translate(table))
【结果】
thiz iz an inkredible tezt
�dZk�x�