常见字符串常量和表达式
s = '' #空字符串 s = "spam's" #双引号和单引号 s = 's p ax00m' #转义序列 s = """...""" #三重引号字符串块 s = r' empspam' #Raw字符串 s = b'spam' #python3.0中的字节字符串 s = u'spam' #仅在python2.6中使用的unicode字符串 s1 + s2 #合并 s * 3 #重复 s[i] #索引 s [i:j] #分片 len(s) #求长度 "a %s parrot" % kind #字符串格式化表达式 "a {0} parrot".format(kind) #python2.6和python3.0的字符串格式方法 s.find('pa') #字符串方法:搜索 s.rstrip() #移除空格 s.replace('pa', 'xx') #替换 s.split(',') #用占位符分割 s.isdigit() #检查是否只由数字组成 s.lower() #转为小写 s.endswith('spam') #是否以制定后缀结尾 'spam'.join(strlist) #插入分割符 s.encode('latin-1') #unicode编码 for x in s: print(x) #迭代,成员关系 'spam' in s [c * 2 for c in s] map(ord, s)
字符串常量
单双引号字符串是一样的,而且python会自动在任意表达式中合并相邻的字符串常量。
title = "Meaning " 'of' " Life" #'Meaning of Life'
用转义序列代表特殊字节
ewline #忽视(连续) \ #反斜杠 ' #单引号 " #双引号 a #响铃 #倒退 f #换页 #换行 #返回 #水平制表符 v #垂直制表符 N #unicode数据库ID uhhhh #unicode 16位的十六进制值 Uhhhhhhhh #unicode 32位的十六进制值 xhh #十六进制值 xx #八进制值 #Null other #不转义
一些转义字符允许一个字符串中嵌入绝对的二进制值。
s = 'a b c' s #'ax00bx00c' len(s) #5
注意,python以十六进制现实非打印的字符。
如果python找不到合法的转义编码,就会保留反斜杠。
raw字符串抑制转义
如果使用以下参数去打开文件就会出错:
myfile = open('C: ew ext.dat', 'w')
会被识别为一个换行字符, 会被识别为一个制表符。如果在字符串第一个引号前面放一个字母r(大写或小写),它就会关闭转义机制。
myfile = open(r'C: ew ext.dat', 'w')
还有一种办法,用两个反斜杠来代表一个反斜杠。
myfile = open('C:\new\text.dat', 'w')
三重引号编写多行字符串块
如果希望一些行的代码不工作,之后再运行,可以简单在这几行前后加入三重引号。
x = 1 """ import os print(os.getcwd()) """ y = 2
实际应用中的字符串
基本操作
字符串可以用+来合并,*来重复。
'abc' + 'def' #'abcdef' 'NI!' * 5 #'NI!NI!NI!NI!NI!'
可以用for语句在字符串中循环迭代,in操作符可以对字符串进行搜索。
my = 'dsfdgdfg' for c in my: print(c, end = ' ') #d s f d g d f g 'd' in my #True 'f' in my #True
索引和分片
python可以通过索引来获取字符串中的字符,python的偏移量从0开始,并且还支持负偏移量,一个负偏移加上字符串的长度就等于正偏移,可以把负偏移看做从结束处反向计数。
s = 'spam' s[0], s[-2] #('s', 'a') s[1:3], s[1:], s[:-1] #('pa', 'pam', 'spa')
当使用分片时,左边的偏移作为下边界(下边界包含在内),右边的偏移作为上边界(不包含上边界在内)。python将获取从下边界开始直到不包含上边界的所有元素。如果省略,上下边界默认分别是0和对象的长度。
索引s[i]获取特定偏移的元素:
- 第一个元素偏移为0
- 负偏移意味着从最后或右边反向计数
- s[0]获取第一个元素,s[-2]获取倒数第二个元素,就和s[len(s)-2]一样
分片s[i:j]提取对应部分作为一个序列:
- 上边界并不包含在内
- 分片的默认边界为0和序列的长度
- s[1:3]获取了从偏移为1的元素到不包含偏移为3的元素
- s[:]获取了偏移0到末尾之间的元素,有效实现顶层s拷贝
s[i:j]实现了一个完全的顶层的序列对象的拷贝,一个有相同值,但是不同内存片区的对象。但对于字符串这样不可变对象并不是很有用,但对于可以原地修改的对象却很实用,例如列表。
扩展分片:第三个限制值
分片的第三个索引,是步进。完整的分片为x[i:j:k],这表示“索引x对象中的元素,从偏移为i知道偏移为j-1,没隔k个元素索引一次”。k默认是1,如果定义了一个值,就会跳过某些元素或者反向排列顺序。
s = 'abcdefghijklmnop' s[1:10:2] #'bdfhj' s[::2] #'acegikmo'
如果使用负数作为步进,步进-1表示从右往左,实际效果就是将序列反向。
s = 'hello' s[::-1] 'olleh'
字符串转换工具
int('42'), str(42) #(42, '42') repr(42) #'42'
int()将字符串转换成数字,而str()将数字转换成字符串。repr()也可以转换对象为字符串。
repr()与str()的区别是,repr()返回的对象可以作为代码字符串,可以重新创建对象,也就是说obj = eval(repr(obj))是成立的。
字符串代码转换
单个字符可以传给ord()转换为对应的ASCII码。
ord('s') #115 chr(115) #'s'
下面的程序可以转换二进制数为十进制数:
b = '1101' i = 0 while b != '': i = i * 2 + (ord(b[0]) - ord('0')) b =b[1:] i #13
修改字符串
字符串是不可变序列,所以想要原地修改字符串会报错,因此需要利用合并,分片这样的工具来处理然后赋值给一个新的字符串。也可以使用字符串格式化。
注意:
python3.0和2.6中引入了一种新字符串类型bytearray,它可以修改。bytearray并不是真正的字符串,它是较小的,8位整数序列。
字符串方法