第4章字符串与正则表达式最早的字符串编码是美因标准信息交换码ASCII,仅对10个数字、26个大写字英文字母、26个小写字英文字母及一些其它符号进行了编码。ASCII采用8位即1个字节,因此最多只能对256个字符进行编码。随着信息技术的发展,各国的文字都需要进行编码,常见的编码有UTF-8,GB2312,GBK,CP936。采用不同的编码意味着把同一字符存入文件时,写入的内容可能不同。UTF-8编码是国际通用的编码,以8位,即1字节表示英语(兼容ASCII),以24位即3字节表示中文及其它语言,UTF-8对全世界所有国家需要用到的字符进行了编码。GB2312是中国制定的中文编码,使用1个字节表示英语,2个字节表示中文;GBK是GB2312的扩充;CP936是微软在GBK基础上完成的编码;GB2312、GBK和CP936都是使用2个字节表示中文,UTF-8使用3个字节表示中文;Unicode是编码转换的基础。在Windows平台上,input()函数从键盘输入的字符串默认为GBK编码,而Python程序的字符串编码使用#coding指定,如#coding=utf-8#coding:GBK#-*-coding:utf-8-*-Python2.7.8环境:s1='中国's1'\xd6\xd0\xb9\xfa'len(s1)4s2=s1.decode('GBK')s2u'\u4e2d\u56fd'len(s2)2s3=s2.encode('UTF-8')s3'\xe4\xb8\xad\xe5\x9b\xbd'len(s3)6prints1,s2,s3中国中国中国Python3.4.2环境:s='中国山东烟台'len(s)6s='SDIBT'len(s)5s='中国山东烟台SDIBT'len(s)114.1字符串在Python中,字符串也属于序列类型,除了支持序列通用方法(包括分片操作)以外,还支持特有的字符串操作方法。字符串属于不可变序列类型4.1字符串Python字符串驻留机制:对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本。长字符串不遵守驻留机制。判断一个变量s是否为字符串,应使用isinstance(s,basestring)。在Python3之前,字符串有str和unicode两种,其基类都是basestring。在Python3之后合二为一了。在Python3中,程序源文件默认为UTF-8编码,全面支持中文,字符串对象不再有encode和decode方法。4.1.1字符串格式化4.1.1字符串格式化常用格式字符4.1.1字符串格式化x=1235so=%o%xso2323sh=%x%xsh4d3se=%e%xse1.235000e+03chr(ord(3)+1)4%s%6565%s%6533365333%d%555Traceback(mostrecentcalllast):Filepyshell#19,line1,inmodule%d%555TypeError:%dformat:anumberisrequired,notstr4.1.1字符串格式化使用format方法进行格式化printThenumber{0:,}inhexis:{0:#x},thenumber{1}inoctis{1:#o}.format(5555,55)printThenumber{1:,}inhexis:{1:#x},thenumber{0}inoctis{0:#o}.format(5555,55)printmynameis{name},myageis{age},andmyQQis{qq}.format(name=DongFuguo,age=37,tel=306467355)position=(5,8,13)printX:{0[0]};Y:{0[1]};Z:{0[2]}.format(position)weather=[(Monday,rain),(Tuesday,sunny),(Wednesday,sunny),(Thursday,rain),(Friday,Cloudy)]formatter=Weatherof'{0[0]}'is'{0[1]}'.formatforiteminmap(formatter,weather):printitem4.1.2字符串常用方法find()、rfind()、index()、rindex()、count()find()和rfind方法分别用来查找一个字符串在另一个字符串指定范围(默认是整个字符串)中首次和最后一次出现的位置,如果不存在则返回-1;index()和rindex()方法用来返回一个字符串在另一个字符串指定范围中首次和最后一次出现的位置,如果不存在则抛出异常;count()方法用来返回一个字符串在另一个字符串中出现的次数。4.1.2字符串常用方法s=apple,peach,banana,peach,pears.find(peach)6s.find(peach,7)19s.find(peach,7,20)-1s.rfind('p')25s.index('p')1s.index('pe')6s.index('pear')25s.index('ppp')Traceback(mostrecentcalllast):Filepyshell#11,line1,inmodules.index('ppp')ValueError:substringnotfounds.count('p')5s.count('pp')1s.count('ppp')04.1.2字符串常用方法split()、rsplit()、partition()、rpartition()split()和rsplit()方法分别用来以指定字符为分隔符,将字符串左端和右端开始将其分割成多个字符串,并返回包含分割结果的列表;partition()和rpartition()用来以指定字符串为分隔符将原字符串分割为3部分,即分隔符前的字符串、分隔符字符串、分隔符后的字符串,如果指定的分隔符不在原字符串中,则返回原字符串和两个空字符串。4.1.2字符串常用方法s=apple,peach,banana,pearli=s.split(,)li[apple,peach,banana,pear]s.partition(',')('apple',',','peach,banana,pear')s.rpartition(',')('apple,peach,banana',',','pear')s.rpartition('banana')('apple,peach,','banana',',pear')s=2014-10-31t=s.split(-)printt['2014','10','31']printmap(int,t)[2014,10,31]4.1.2字符串常用方法对于split()和rsplit()方法,如果不指定分隔符,则字符串中的任何空白符号(包括空格、换行符、制表符等等)都将被认为是分隔符,返回包含最终分割结果的列表。s='helloworld\n\nMynameisDong's.split()['hello','world','My','name','is','Dong']s='\n\nhelloworld\n\n\nMynameisDong's.split()['hello','world','My','name','is','Dong']s='\n\nhello\t\tworld\n\n\nMyname\tisDong's.split()['hello','world','My','name','is','Dong']4.1.2字符串常用方法split()和rsplit()方法还允许指定最大分割次数,例如:s='\n\nhello\t\tworld\n\n\nMynameisDong's.split(None,1)['hello','world\n\n\nMynameisDong']s.rsplit(None,1)['\n\nhello\t\tworld\n\n\nMynameis','Dong']s.split(None,2)['hello','world','MynameisDong']s.rsplit(None,2)['\n\nhello\t\tworld\n\n\nMyname','is','Dong']s.split(None,5)['hello','world','My','name','is','Dong']s.split(None,6)['hello','world','My','name','is','Dong']4.1.2字符串常用方法字符串联接join()例子:li=[apple,peach,banana,pear]sep=,s=sep.join(li)sapple,peach,banana,pear不推荐使用+连接字符串,优先使用join()方法CompareJoinAndPlusForStringConnection.py4.1.2字符串常用方法lower()、upper()、capitalize()、title()、swapcase()这几个方法分别用来将字符串转换为小写、大写字符串、将字符串首字母变为大写、将每个单词的首字母变为大写以及大小写互换。s=WhatisYourName?s2=s.lower()s2whatisyourname?s.upper()WHATISYOURNAME?s2.capitalize()Whatisyour,name?s.title()'WhatIsYourName?'s.swapcase()'wHATISyOURnAME?'4.1.2字符串常用方法查找替换replace()s=中国,中国prints中国,中国s2=s.replace(中国,中华人民共和国)prints2中华人民共和国,中华人民共和国4.1.2字符串常用方法生成映射表函数maketrans和按映射表关系转换字符串函数translateimportstringtable=string.maketrans(abcdef123,uvwxyz@#$)s=Pythonisagreateprogramminglanguage.Ilikeit!s.translate(table)Pythonisugryutyprogrumminglunguugy.Ilikyit!s.translate(table,gtm)#第二个参数表示要删除的字符Pyhonisuryuyproruinlunuuy.Ilikyi!4.1.2字符串常用方法strip()、rstrip()、lstrip()这几个方法分别用来删除两端、右端或左端的空格或连续的指定字符。s=abcs2=s.strip()s2abcaaaassddf.strip(a)ssddfaaaassddf.strip(af)ssddaaaassddfaaa.rstrip(a)'aaaassddf'aaaassddfaaa.lstrip(a)'ssddfaaa'4.1.2字符串常用方法内置函数eval()eval(3+4)7a=3b=5eval('a+b'