Python学习笔记(五)——字符串
字符串
Python字符串--一个有序字符的集合,用于存储和表现基于文本的信息。
Python中没有单个字符的类型,只有使用一个字符的字符串。
字符串被划分为不可变序列,意味着这些字符串所包含的字符存在从左往右的位置程序,并且不可以在原处修改。
常见字符串常量和表达式:
#
字符串常量:
单引号:'Yert"s'
双引号:"Yert's"
三引号:"....................Yert................................"
转义字符:'\tp'
Raw字符串:r"C:w\test.com"
Python3.0中的Byte字符串:b'sp\x01
只在Python2.6出现的Unicode字符串:u'egg\suu'
单双引号的作用相同:
>>> 'Yert',"Yert"('Yert', 'Yert')
Python自动合并相邻的字符串常量:
>>> title="The truth " 'of' "life">>>>>> title'The truth oflife'
三重引号编写多行字符串块:
>>>>>> longfile='''......... a... a... a... a... a... '''>>>>>>>>> longfile'\n\n\na\na\na\na\na\n'>>>>>> print(longfile)aaaaa>>>
转义字符序列:
通过反斜杠转义字符嵌入引号:
>>> 'today\'s',"yesterday\"s"("today's", 'yesterday"s')
转义序列插入绝对的二进制值:
>>>>>> s = 'a\0b\0c'>>>>>> s'a\x00b\x00c'>>>>>> len(s)5>>>
Python会在内存中保持了整个字符串的长度和文本,Python没有字符会结束一个字符串。
>>>>>> s = '\001\002\003'>>>>>> s'\x01\x02\x03'>>>>>> len(s)3>>>
如果Python没有作为一个合法的转义编码识别出在"\"后的字符,它就直接在最终的字符串中保留反斜杠。
>>> x = "C:\py\code">>>>>> x'C:\\py\\code'
raw字符串抑制转义
Raw字符串:如果字母r(大写或小写)出现在字符串的第一引号的前面,它将会关闭转义机制。Python将反斜杠作为常量来保持,就像普通字符串,为了避免错误,在Windows系统中必须增加字母r。
>>> myfile=open(r'D:test\test.txt','w')>>>>>> text="I'm Yert,the word would been wroten in text.">>>>>> myfile.write(text)44>>>>>> myfile.close()
索引和分片:
索引:
字符串在Python中被定义为字符的有序集合,可以通过位置偏移值获取字符。在Python中,字符串中的字符是通过索引(通过在字符串之后的方括号中提供所需要的元素的数字偏移量)提取的。
Python的偏移量是从0开始,并比字符串的长度小1,还支持在字符串中使用负偏移的方法从序列中获取因素。从技术上讲,一个负偏移与这个字符串长度相加可以得到它的正偏移值。
>>> S='YertAlan'>>>>>> S[0]'Y'>>> S[-1]'n'>>>>>> len(S)8>>> S[len(S)-1]'n'
分片:
当使用一对以冒号分隔的偏移来索引字符串时,Python将会返回一个新的对象,其中包含了以这对偏移所标识的连续内容。
>>> S[1:3]'er'>>> S[1:]'ertAlan'>>>>>> S[::]'YertAlan'>>>>>> S[-4:-1]'Ala'>>>>>> S[:-2]'YertAl'
拓展分片:第三个限制值
分片表达式增加一个可选的第三个索引,用作步进。步进添加到每个提取的元素的索引中。完×××式的分片为string[X:Y:Z],表示"索引字符串string对象中的元素,从偏移X直到偏移为Y-1,每隔Z元素索引一次"。第三个限制没人为1,所以通常在一个切片中从左至右提取每一个元素的原因。
>>> string='ABCDEFGHIJKLMNOPQRST'>>>>>> string[1:8]'BCDEFGH'>>>>>> string[1:8:2]'BDFH'>>>>>> string[1:12]'BCDEFGHIJKL'>>> string[1:12:3]'BEHK'
负数步进:
>>> string[1:10]'BCDEFGHIJ'>>>>>> string[1:10:-1]''>>> string[10:1:-1]'KJIHGFEDC'>>>>>> string[10:1]''>>> string[10:1:-2]'KIGEC'
字符串转换工具
>>>#将以字符串形式出现的数字进行转换:>>> int('55'),str(55)(55, '55')>>> repr(55)'55'
注意:Repr函数可以将一个对象转换为其字符串形式,然而这些返回的对象作为代码的字符串,可以重新创建对象。
>>> print(str('Yert'),repr('Yert'))Yert 'Yert'
>>>#浮点数转换字符串:>>> str(3.1415),float("1.5")('3.1415', 1.5)>>>>>> text="1.234E-10">>>>>> float(text)1.234e-10
字符串代码转换:
单个字符可以通过将其传给内置的ord函数转换为其对应的ASCII码--则个函数实际返回的是这个字符在内存中对应的字符的二进制值。而chr函数将会执行相反的操作,获取ASCII码并将其转换为对应的字符:
>>> ord('s')115>>>>>> chr(115)'s'>>>#执行基于字符串的数学运算:>>> S='a'>>> S=chr(ord(S)+1)>>> S'b'>>> S=chr(ord(S)+1)>>>>>> S'c'>>> int('5')5>>>>>> ord('5') - ord('0')5
与循环语句结合,进行整数的处理:
将二进制字符串转换为整数,并将当前值乘以2,并加上下一位数字值。
>>> B = '1101'>>> I = 0>>> while B != '':... I = I * 2 + (ord(B[0])-ord('0'))... B = B[1:]...>>>>>> I13>>>
修改字符串
>>>#使用合并、分片:>>> S='Yert'>>>>>> S = 'Yert'>>> S = S + 'Alan'>>> S'YertAlan'>>> S = S[:4] + '·D·' + S[4:] #D之一族>>>>>> S'Yert·D·Alan'
使用replace函数修改(索引到字符串,将其改为指定字符串):
>>> S=S.replace('Alan','King')>>> S'Yert·D·King'
通过字符串格式化表达式来创建新字符串:
>>> "March %sst,I'm a apple,I'm have a %s" % (1,'pencil')"March 1st,I'm a apple,I'm have a pencil">>>>>> "March {0}st,I'm a apple,I'm have a {1}".format(1,'pencil')"March 1st,I'm a apple,I'm have a pencil"
使用find方法进行修改:
>>> S = '13658934230' #实现修改号码,保护隐私>>>>>> node = S.find('5893')>>>>>> node3>>> S = S[:node] + 'XXXX' + S[(node+4):]>>>>>> S'136XXXX4230'
使用合并操作和replace方法每次运行产生新的字符串对象,会消耗性能,所以在对超长文本进行多处修改时,需要将字符串转换为一个支持原处修改的对象。
>>> S = 'yert'>>>>>> L = list(S)>>>>>> L['y', 'e', 'r', 't']
内置的list函数(或一个对象构造函数调用)以任意序列中的元素创立一个新的列表,可以将字符串中的字符分解为一个列表。
Join函数可以将列表合成为一个字符串:
>>> D = ''.join(L)>>>>>> D'yert'
其他字符串方法:
>>>#通过分片的方式将数据从原始字符串中分离,称为解析。>>> S'yert'>>>>>> J = S[1:3]>>>>>> J'er'>>>#如果分隔符分开了数据组件,可以使用split方法提取组件。>>> date = 'My name is Yert'>>>>>> cols = date.split()>>>>>> cols['My', 'name', 'is', 'Yert']>>>>>> long_str = 'My name is Yert, I am a computer engineer,I am studing Python'>>>>>> cols = long_str.split(',')>>>>>> cols['My name is Yert', ' I am a computer engineer', 'I am studing Python']>>> line = 'The dog is Sam which it is yellow ! \n'>>>#清除每行末尾空白>>> line.rstrip()'The dog is Sam which it is yellow !'>>>#全部转换大写>>> line.upper()'THE DOG IS SAM WHICH IT IS YELLOW ! \n'>>>#测试内容>>> line.isalpha()False>>>>>>#检测末尾内容字符串>>> line.endswith('! \n')True>>>#检测开始内容字符串>>> line.startswith('The')True>>> line[-len('! \n'):] == '! \n'True>>>>>> line[:len('The ')] == 'The 'True
字符串格式化表达式
格式化字符串:
- 在%操作符的左侧放置一个需要进行格式化的字符串,这个字符串带有一个或多个嵌入的转换目标,都以%开头。
- 在%操作符右侧放置也(或多个,嵌入到元组中)对象,这些对象将会插入到左侧想让Python进行格式化字符串的一个(或多个)转换目标的位置上去。
>>> '%d years later,I have became a %s!' % (3,'engineer')'3 years later,I have became a engineer!'
高级字符串格式化表达式:
转换目标通用结构:
%[ (name) ] [flags] [width] [.precision] typecode
表中的字节码出现在目标字符串的尾部,在%和字符码只间:可以放置一个字典的键;罗列出左对齐(-)、正负号(+)和补零(0)的标志位;给出数字的整体长度和小数点后的位数等。Width和precision都可编码为一个*,以指定它们应该从输入值的下一项中取值。
>>>#%d对整数进行默认,%-6d进行6位的左对齐格式化,d进行6位补零的格式化>>> M = 24>>>>>> resu = "result: %d %-6d d" % (M,M,M)>>>>>> resu'result: 24 24 000024'>>>#可以在格式化字符串中用一个*来指定通过计算得出width和precision,从而迫使它们的值从%运算符右边的输出中的下一项获取,元组中的4指定为precision。>>> '%f,%.2f,%.*f' % (1/3.0,1/3.0,4,1/3.0)'0.333333,0.33,0.3333'
基于字典字符串格式化
>>>#通过字典的键来提取对应的值:>>> "%(a)d %(x)s" % {'a':1,'x':'Yert'}'1 Yert'>>>#Format方法格式化字符串:>>> date = '{0},{1} and {2}'>>>>>> date.format('Python','PHP','Go')'Python,PHP and Go'>>>>>> date = '{a},{b} and {c}'>>>>>> date.format(a='Python',b='PHP',c='Go')'Python,PHP and Go'>>>>>>>>> date = '{a},{0} and {c}'>>>>>> date.format('PHP',a='Python',c='Go')'Python,PHP and Go'
格式化字符串可以指定对象属性和字典键。
>>> import sys>>>>>> 'The machine {1[name]} runs {0.platform}'.format(sys,{'name':'Yert'})'The machine Yert runs win32'>>>>>> 'The machine {config[name]} runs {sys.platform}'.format(sys=sys,config={'name':'Yert'})'The machine Yert runs win32'