字符串

常见字符串常量和表达式

s = '' #空字符串
s = "spam's" #双引号和单引号
s = 's\np\ta\x00m' #转义序列
s = """...""" #三重引号字符串块
s = r'\temp\spam' #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'

用转义序列代表特殊字节

\newline #忽视(连续)
\\ #反斜杠
\' #单引号
\" #双引号
\a #响铃
\b #倒退
\f #换页
\n #换行
\r #返回
\t #水平制表符
\v #垂直制表符
\N #unicode数据库ID
\uhhhh #unicode 16位的十六进制值
\Uhhhhhhhh #unicode 32位的十六进制值
\xhh #十六进制值
\0xx #八进制值
\0 #Null
\other #不转义

一些转义字符允许一个字符串中嵌入绝对的二进制值。

s = 'a\0b\0c'
s
#'a\x00b\x00c'
len(s)
#5

注意,python以十六进制现实非打印的字符。

如果python找不到合法的转义编码,就会保留反斜杠。

raw字符串抑制转义

如果使用以下参数去打开文件就会出错:

myfile = open('C:\new\text.dat', 'w')

\n会被识别为一个换行字符,\t会被识别为一个制表符。如果在字符串第一个引号前面放一个字母r(大写或小写),它就会关闭转义机制。

myfile = open(r'C:\new\text.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位整数序列。

字符串方法

 

posted @ 2017-08-10 01:23  hahazexia  阅读(283)  评论(0编辑  收藏  举报