1.1字符串索引
1.1.1字符串索引
Python使用方括号来标识字符串索引:方括号内的数字指出了要获取那个字符。Python中,最小字符串索引总是0,而最大的索引总是比字符串长度小1。如果索引超出了字符串末尾,将导致“超出范围”错误。
>>> s='apple'
>>> s[0]
'a'
>>> s[1]
'p'
>>> s[2]
'p'
>>> s[3]
'l'
>>> s[4]
'e'
>>> s[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
1.1.2 负数索引
沿着从右向左的方向,用负数表示字符串中的索引:
>>> s='apple'
>>> s[-1]
'e'
>>> s[-2]
'l'
>>> s[-3]
'p'
>>> s[-4]
'p'
>>> s[-5]
'a'
字符串的最后一个字符为是[-1]。
1.1.3 使用for循环访问字符
下面程序计算给定字符串的字符编码总和:
#codesum1
def codesum1(s):
"""Returns the sums of the character codes of s."""
total=0
for c in s:
total=total+ord(c)
return total
调用示例:
>>> codesum1('hello world')
1116
常规实现:
def codesum2(s):
"""Returns the sums of the character codes of s."""
total=0
for i in range(len(s)):
total=total+ord(s[i])
return total
>>> codesum2('hello world')
1116
1.2 字符
所有字符都有对应的字符编码,可以用函数ord来获悉;
>>> ord('a')
97
>>> ord('b')
98
>>> ord('c')
99
给定字符编码,可使用函数chr来获悉对应字符
>>> chr(97)
'a'
>>> chr(98)
'b'
>>> chr(99)
'c'
>>> chr(49)
'1'
>>> chr(50)
'2'
1.2.1 转义字符
并非多有字符都有可视的标准符号。例如,换行符、回车字符和制表符都是不可见的,虽然它们带来的效果可见。这些字符属于空白字符--在印刷页面上显示为空白。
为处理空白字符以及其他不可打印的字符,Python使用一种特殊的表示法--转义序列(字符)。下面是一些常见的转义字符:
\\ 反斜杠
\' 单引号
\" 双引号
\n 换行符
\r 回车
\t 水平制表符
要在字符串中包含反斜杠、单引号和双引号,通常需要使用对应的转义字符。例如:
>>> print('\'and\" are quotes')
'and" are quotes
>>> print('\\ must be wrotten \\\\')
\ must be wrotten \\
在Python中,表示换行的标准方式是使用字符\n:
>>> print('one\ntwo\nthree')
one
two
three
转义字符是单个字符,明白这一点很重要。为让Python知道下一个字符是特殊字符,必须使用\,但在计算字符串的长度时,并不将\为额外的字符。例如;
>>> len('\\')
1
>>> len('a\nb\nc')
5
1.3 字符串切片
>>> food='apple pie'
>>> food[0:5]
'apple'
>>> food[6:9]
'pie'
1.3.1 获取切片的捷径
>>> food='apple pie'
>>> food[:5]
'apple'
>>> food[6:]
'pie'
>>> food[:]
'apple pie'
下面是一个很有用的切片示例,这个函数返回文件名中的扩展名:
#extension.py
def get_ext(fname):
"""Returns the extension of file fname
"""
dot = fname.rfind('.')
if dot == -1:
return ''
else:
return fname[dot + 1:]
函数演示:
>>> get_ext('hello.py')
'py'
>>> get_ext('hello.txt')
'txt'
>>> get_ext('hello')
''
函数工作原理:利用rfind从右向左查找'.'的索引,返回‘.’后面的部分;如果不包含 '.'则返回空字符串。
1.3.2 使用负数索引的切片
>>> food='apple pie'
>>> food[-9:-4]
'apple'
>>> food[-3:]
'pie'
>>> food[-3:-1]
'pi'
>>> food[-3:0]
''
1.4 标准字符串函数
1.4.1 测试函数
所有的测试函数都返回True或False。测试函数有时也叫布尔函数或谓词
函数名 | 什么情况下返回True |
s.endswith(t) s.startswith(t) s.isalnum() s.isalpha() s.isdecimal() s.isdigit() s.isidentifier() s.islower() s.isnumeric() s.isprintable() s.isspace() s.istitle() s.isupper() t in s | s以字符串t结尾 s以字符串t开头 s只包含数字和字母 s只包含字母 s只包含表示十进制数字的字符 s只包含数字字符 s是合法标识符 s只包含小写字母 s只包含数字 s只包含可打印字符 s只包含空白字符 s是个大小写符合标题要求的字符串 s只包含大写字母 s包含字符串t |
1.4.2 搜索函数
在字符串中查找子串的方式有多种。函数index和find之间的差别在于没有找到指定字串时的情形。例如:
>>> s,index('eee')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'index' is not defined
>>> s.find('eee')
-1
函数index引发异常ValueError。如果没找到指定子串,函数find将返回-1。
字符串搜索函数通常从左到右(从开头到结尾)搜索,但以r打头的函数从右往左搜索。例如:
>>> s='cheese'
>>> s.find('e')
2
>>> s.rfind('e')
5
>>> s.find('ee')
2
>>> s.rfind('ee')
2
一般那而言,函数index和find返回传入字符串第一次出现的起始位置索引,而rfind和rindex返回传入字符串最后一次出现时的起始位置索引。
1.4.3 改变大小写的函数
Python提供了各种修改字母大小写的函数。如下表所示。别忘了。Python绝不会修改字符串:在所有这些函数中,Python都会创建并返回一个新的字符串。我们谈论字符串是,常常让人觉得字符串被修改,但这只是为了方便措辞,并不意味着字符串真的被修改。
函数名 | 返回的字符串 |
s.capitalize() s.lower() s.upper() s.swapcase() s.title() | 将s[0]改为大写,其余为小写 让s的所有字母都小写 让s的所有字母都大写 将小写字母改为大写,将大写字母改为小写 让s的大小符合标题要求 |
1.4.4 设置格式的函数
下表列出了设置字符串格式的函数,它们让你能够美化字符串,以便向用户显示或打印到文件。
字符串函数format功能非常强大,包含用于设置字符串格式的微型语言。要使用函数format,你需要给他提供变量或值,如下:
>>> '{0} likes {1}'.format('Jack','Ice cream')
'Jack likes Ice cream'
字符串中的{0}和{1}引用format的参数:它们将被替换为相应字符串或变量的值。你还可以使用关键字参数的名称:
>>> '{who} {pet} has fleas'.format(who='my',pet='dog')
'my dog has fleas'
这些示例演示了format的基本用法,还有很多其他选项可用于指定字符串间距、将数字转换为字符串等。
函数名 | 返回的字符串 |
s.center(n,ch) s.ljust(n,ch) s.rjust(n,ch) s.format(vars)
| 包含n个字符的字符串,其中s位于中央,两边用字符填充 包含n个字符的字符串,其中s位于左边,右边用字符ch填充 包含n个字符的字符串,其中s位于右边,左边用字符ch填充 见上文 |
1.4.5 剥除函数
剥除函数用于删除字符串开头或结尾多余的字符,如下表所示。默认情况下,将剥除空白字符;如果指定了一个字符串参数,将剥除该字符串中的字符,如下;
>>> name = ' Bill Gates '
>>> name.strip()
'Bill Gates'
>>> name.lstrip()
'Bill Gates '
>>> name.rstrip()
' Bill Gates'
>>> title='_-_- Happy Days!! _-_-'
>>> title.strip('-_')
' Happy Days!! '
>>> title.strip('_ -')
'Happy Days!!'
>>> title.strip('_-')
' Happy Days!! '
函数名 | 返回的字符串 |
s.strip(ch) s.lstrip(ch) s.rstrip(ch) | 从s开头和末尾删除所有包含在字符串ch中的字符 从s开头(左端)删除所有包含在字符串ch中的字符 从s末尾(右端)删除所有包含在字符串ch中的字符 |
1.4.6 拆分函数
拆分函数将字符串拆分成多个字串,如下表,函数partition和rpartition将字符串拆分成3部分:
>>> url.partition('.')
('www', '.', 'baidu.com')
>>> url.rpartition('.')
('www.baidu', '.', 'com')
这两个函数总是返回一个这样的值:它由3个字符串组成,形式为(head,sep,tail)。这种返回值位元组。
函数名 | 返回的字符串 |
s.partition(t)
s.rpartition(t) s.split(t)
s.rsplit(t) s.splitlines() | 将s拆分为三个字符串(head、t和tail),其中head为t前面的字符串,tail为t后面的字符串 与partition相同,但s从右端开始搜索t 以t为分隔符,将s划分为一系列子串,并返回一个字串组成的列表 与split相同,但从s的右端开始搜索t 返回一个由s中各行组成的列表 |
>>> url='www.baidu.com'
>>> url.split('.')
['www', 'baidu', 'com']
>>> story='long long ago, a princess ate an apple'
>>> story.split()
['long', 'long', 'ago,', 'a', 'princess', 'ate', 'an', 'apple']
函数split总是返回一个字符串列表;
1.4.7 替换函数
Python字符串自带了两个替换函数,如下。
s.replace(old,new) 将s中的每个old替换为new
s.expendtabs(n) 将s中的每个制表符扩展为空格,制表符宽度为n.
注意到使用替换函数可以轻松的删除字符串中的字串:
>>> s='good good study day day up
>>> s.replace('day','night')
'good good study night night up'
>>> s.replace('day','')
'good good study up'