Python的字符串是一个有序的字符集合,没有字符这种类型,字符就是一个长度为一的字符串。
1.字符串类型
1)普通字符串
由于python中单引号和双引号没有什么实质上的区别,所以声明一个字符串的时候使用单引号和双引号都是一样的,之所以这两种形式都能够使用是为了不用转义字符就可以实现一个字符串中包含其他种类的引号。
>>> s=""
>>> s
''
>>> s="hello world!"
>>> s
'hello world!'
>>> s='say "hello"'
>>> s
'say "hello"'
2)转义字符串就是用\来表示一些特殊的字符。
>>> s = "hello\nworld"
>>> print s
hello
world
转义的字符如下表:
-
\n
换行
\\
反斜杠
\'
单引号
\"
双引号
\a
响铃
\b
退格,前移一个字符
\f
换页,将当前位置移到下页开头
\r
返回,将当前位置移到本行开头
\t
水平制表符
\v
垂直制表符
\uhhhh
Unicode16位的十六进制值
\uhhhhhhhh
Unicode32位的十六进制值
\xhh
十六进制值
\ooo
八进制值
3)raw字符串就是抑制转义,即字符串中的\就是普通的反斜杠,没有特殊作用,在windows下表示目录的时候比较有用,注意raw字符串不能以\结尾。
>>> s=r"c:\python"
>>> print s
c:\python
4)Unicode就是在字符串的前面加u来表示这个字符串是Unicode编码。
2.基本操作
len()函数返回一个字符串(或任意有长度的对象)的长度。
>>> s="hello"
>>> len(s)
5
字符串连接使用+。
>>> "abc"+"def"
'abcdef'
字符串重复可使用操作符*。
>>> "haha"*2
'hahahaha'
3. 索引和分片
Python中的字符串是有序的字符集合,所以可以通过位置(索引)获取对应的元素。和c语言中一样,python的索引也是从0开始的,而且支持使用负索引的方法来获取元素,一个负的索引可以看做是从字符串结尾处反向计数,-1就表示字符串的最后一个字符。当然也可以理解为负索引与字符串长度相加得到的正索引,即s[-n]等于s[-n+len(s)]。
>>> s = "hello"
>>> s[0]
'1'
>>> s = "hello"
>>> s[0]
'h'
>>> s[-1]
'o'
>>> s[0:3]
'hel'
>>> s[1:]
'ello'
>>> s[:-1]
'hell'
上述后三个例子展示的是字符串的分片,当使用一对用冒号分隔的索引的字符串的时候,python
将获取从下边界直到但不包括上边界的所有元素,并返回一个新的字符串对象,如果省略,上下边界的默认值分别为0
和字符串的长度。
其实分片的完整格式为s[start:end:side],意思就是从start开始到end-1,每隔side个元素取一个元素,返回值为所有取到的元素组成的字符串,side默认值为1。
side可以取负值,例如s[::-1]会返回”olleh”,实际效果就是对字符串进行了反转。这里需要注意的是,如果side为负值,两个边界也要进行反转,s[4:1:-1]就是从4开始反向取到2得到的字符串,如果在sride为负的情况下还是第一个边界大于第二个边界那样的使用的话将返回一个空的字符串。
>>> s[::2]
'hlo'
>>> s[::-1]
'olleh'
>>> s[4:1:-1]
'oll'
>>> s[0:4:-1]
''
字符串和数字的转换上节已经说过了,这里就不再重复介绍了,主要使用的就是内置函数:int()
、float()
、str()
。
python中的字符串是不可变的序列,就是不能直接修改字符串,即便使用字符串的replace方法,也无法修改原来字符串。如果非要修改则需新生成一个合乎要求的字符串然后赋给原来的字符串变量,只能是重新赋值。
>>> s[0]="a"
Traceback (most recent call last):
File "<stdin>", line1, in <module>
TypeError: 'str' object does notsupport item assignment
>>> s.replace("h","a")
'aello'
>>> s
'hello'
>>> s = s.replace("h","a")
>>> s
'aello'
4. 字符串方法
1) 大小写
S.upper() 全部大写
S.lower() 全部小写
S.swapcase() 大小写互换
S.capitalize() 首字母大写,其余都小写
S.title() 每个单词的首字母大写,其余不变
2) 对齐
S.ljust(width[, fill]) 获取固定长度width,左对齐,多余位用fill填充,默认空格
S.rjust(width[, fill]) 右对齐
S.center(width[, fill]) 居中
S.zfill(width) 右对齐,左边不足的位置用0补齐,相当于S.rjust(width,"0")
如果width<=len(S),返回于原字符串相同的字符串。
3) 查找替换
S.find(sub[, start[, end]]) 返回在范围start到end(不含end)中第一个sub的索引。
S.rfind(sub[, start[, end]]) 从右边开始查找,也就是返回在范围start到end(不含end)中最后一个sub的索引。
S.index(sub[, start[, end]])功能与find()相同,不同之处在于find()未找到的时候会返回-1,而index()会抛出异常。
S.rindex(sub[, start[, end]])功能与rfind()相同,不同之处在于find()未找到的时候会返回-1,而index()会抛出异常。
S.count(sub[, start[, end]]) 返回在范围start到end(不含end)中sub的个数。
start默认为0,end默认为len(S)。
S.replace(old, new[, count])将字符串中的old替换为new,count为替换的次数,未指定的话就是替换所有。
S.translate(table [,deletechars]) 删除S中deletechars包含的字符,然后将剩下的字符用table定义的关系进行映射。table是string.maketrans()生成的。
4) 去空白或指定字符
S.strip([chars]) 去除字符串S两边的chars,若chars未指定,则去除两边的空白,包括空格、\n、\f、\r、\t和\v。
S.lstrip([chars]) 去除左边的chars,未指定同上。
S.rstrip([chars]) 去除右边的chars,未指定同上。
5) 分割和组合
S.split([sep [,maxsplit]]) 以sep为分隔符切割字符串S,不指定sep默认为默认为空白,maxsplit为最大分割次数,未指定则全部分割,返回列表。
S.rsplit([sep [,maxsplit]]) 只是和split反向相反,split从头到尾,rsplit从尾到头。
S.splitlines([keepends]) 按行分割字符串,若keepends指定并且为True,则保留换行符,反之不保留。
S.partiton(sep)以sep作为分隔符将S分割为两个start和end部分,并返回(start,sep, end)这样格式的元组,若sep没有找到,则返回S和两个空串组成的元组(S, '', '')。
S.rpartition(sep)从右边开始,以sep作为分隔符将S分割为两个start和end部分,并返回(start,sep, end),若sep没有找到,则返回两个空串和S组成的元组('', '', S)。
S.join(iterable) 将迭代器iterable的字符串连接在一起,并用分隔符S隔开,一般来说在连接列表的时候都使用空字符串或者空格作为分隔符,返回字符串。
6) 判断
S.startswith(prefix[, start[, end]])判断字符串start到end(不含end)是否是以prefix开头,默认start为0,end为len(S),返回布尔值。
S.endswith(suffix[, start[, end]]) 判断字符串start到end(不含end)是否是以suffix结尾,默认start为0,end为len(S),返回布尔值。
S.isalnum() 是否全为字母或数字,返回布尔值。
S.isalpha() 是否全为字母,返回布尔值。
S.isdigit() 是否全为数字0-9,返回布尔值。
S.islower() 是否全是小写
S.isupper() 是否全是大写
S.isspace() 是否全是空白
S.istitle() 是否符合title的格式——每个单词的首字母大写。
上述这些函数中,若S为空串,则均返回False。
7) 编码
S.decode([encoding[,errors]]) 将字符串S解码为unicode,encoding为S原来的编码方式。
S.encode([encoding[,errors]]) 将unicodeS编码为python中的字符串,参数指定对应的编码方式。
errors指定出错时对应的操作,默认的strict会在编码/解码失败的时候抛出异常,ignore则忽略。
关于编码方式还是有很多的知识的,后续再做研究。
8) 其他
S.format(*args, **kwargs)
format也是用来格式化字符串的,argv指定的变量可以在S中用{index}来替换,而kwargs则是对应的变量。如果后面的数据为字典,可以使用{<index|var>[key]}来替换其对应的值。当然还可以指定对应的宽度、精度以及对其格式,{index:[fill][<|>|^][width][.precision][typecode]}。
fill设置填充位,默认为空格;<左对齐,>右对齐,^居中;宽度和类型见后面格式化表达式部分。注意这里的精度专指说浮点型数据,整型是不能使用精度的,字符串设置了也没啥作用。
>>> "{0},{2},{1},{s}".format(1,2,3,s="four")
'1,3,2,four'
>>> "{0:$<3},{2:^5.2f},{1},{s:>10.6s}".format(1,2,3,s="four")
'1$$,3.00 ,2, four'
>>> "{0:<3},{2:^5d},{1},{s:>10s}".format(1,2,3,s="four")
'1 , 3 ,2, four'
>>> "{0:<03},{2:^05.2d},{1},{s:>10s}".format(1,2,3,s="four")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Precision not allowed in integer format specifier
>>> "{0:<03},{2:^5.2f},{1},{s:>10.6s}".format(1,2,3,s="four")
'100,3.00 ,2, four'
S.expandtabs([tabsize]) 将字符串中的制表符替换为tabsize个空格,默认为8。
9) 3.0新增
S.isdecimal() 是否全是十进制数字(多语言数字)
S.isidentifier() 是否全是合法标识符
S.isnumeric() 是否只包含数字字符
S.isprintable() 是否全是可打印字符
5. 格式化表达式
字符串格式化的标准格式为"string" % (var),string中包含变量var要格式化的类型和位置,var如果只有一个变量的话可以不要括号。
>>> var = "python"
>>> "hi %s" % var
'hi python'
格式化的目标类型的标准格式为:%[(name)][flag][width][.precision]typecode。
%:转换开始的标志。
name:放置一个字典的键,格式化其对应的值。
>>> D={"a":"123","b":"456"}
>>> "number is %(a)s" % D
'number is 123'
flag:+右对齐,默认;-左对齐;0用0填充精度之外的空白位,只对右对齐有用。注意+的时候会同时输出+号的,所以就多了一位。
width:宽度
>>> a=12
>>> "%10.5d" %a
' 00012'
>>> "%+10.5d" %a
' +00012'
>>> "%-10.5d" %a
'00012 '
>>> "%010.5d" %a
'0000000012'
>>> "%+010.5d" %a
'+000000012'
>>> "%-010.5d" %a
'00012 '
precision :设置精度,注意前面有个点,这里的精度和上面的format有比较大的差异,看下面的列子:
>>> a=12
>>> "%10.5d" %a
' 00012'
>>> "%10.3d" %a
' 012'
>>> "%10.1d" %a
' 12'
>>> "%10.5f" %a
' 12.00000'
>>> "%10.1f" %a
' 12.0'
>>> "%10.5s" %a
' 12'
>>> "%10.3s" %a
' 12'
>>> "%10.1s" %a
' 1'
整型%d的时候精度小于a的长度(这里就是a的位数)时,格式化结果不变,大于的时候多出来的位数用0填充;而%f的时候就是设置小数点后的位数;%s的时候精度大于a的长度时,格式化结果不变,而小于a的长度时,只会保留精度设置的位数。
typecode :转换类型详情见下表。
-
%s
字符串
%r
Repr输出的字符串
%d
十进制整数
%i
整数
%u
无符号整数
%o
八进制
%x
十六进制
%X
十六进制(大写)
%e
指数
%E
指数(大写)
%f
十进制浮点数
%F
十进制浮点数
%g
浮点e或f
%G
浮点E或f