目录
第四章 字符串
一、字符串格式问题及转义字符:
二、字符串的常见操作:
(一)字符串的接拼:
(二)字符串索引:
(三)字符串分片:
(四)字符串的不可变性:
(五)字符串大小写转换方法:
(六)字符串分割、组合、移除:
(七)字符串查找与替换:
(八)字符串对齐:
(九)字符串格式化输出:
(1)%占位格式化字符串:
(2)format() 方法格式化字符串:
第四章 字符串
一、字符串格式问题及转义字符:
由第一章基础总结,我们知道,字符串是一种用来表示文本的数据类型,它是由符号或者数值组成的一个连续序列。对字符串有了一定的了解。首先我们来看看一些平时容易犯的错误例子:
# 前后不统一: name1 = '小明" name2 = "小明' # 使用了中文引号: name1 = ‘小明’ name2 = “小明” #多行输出有误: poetry = '日暮苍山远,天寒白屋贫。 柴门闻犬吠,风雪夜归人。' print(poetry) # 报错:SyntaxError: bad token on line 1
由上段代码可以总结出,我们平时容易犯的错误,如引号前后不统一、使用了中文引号、多行输出有误等。其中,多行输出,我们可以通过使用三引号''' ''' 来输出。不过,除了使用多行字符串来实现多行文本输出外,使用 n 也能达到一样的效果。n 被称为 换行符,用于文本间的换行。
常用的转义字符如下:(r:让转义字符失效。如:print(r'你n好') #输出:你好)
二、字符串的常见操作:
(一)字符串的接拼:
通过 + 可以将两个字符串拼接,得到一个新的字符串。如下:
first_name = '史蒂夫' last_name = '乔布斯' # 使用 + 拼接字符串 full_name = first_name + '·' + last_name print(full_name) # 输出:史蒂夫·乔布斯
当我们把同一个字符串重复很多次的时候,我们可以使用多个 + 拼接,像下面这样:
str1 = '海草' str2 = str1 + str1 + str1 print(str2) # 输出:海草海草海草
上面那样的写法太麻烦了,你有没有想到更快捷的方法?对了,用 *,数学中的乘法是相同的数加起来的快捷方式,Python 中字符串的拼接操作也是如此。
str1 = '海草' str2 = str1 * 3 # 相当于 str1 + str1 + str1 print(str2) # 输出:海草海草海草
除此之外,Python中还有一些常用的字符串运算符,如下:
| 操作符 | 描述 | 实例 |
|---|---|---|
| + | 字符串连接 | 如上面代码 |
| * | 重复输出字符串 | 如上面代码 |
| [ ] | 通过索引获取字符串中的字符 | a[2] |
| [ : ] | 截取字符串中的一部分 | a[1:4] |
| in | 成员运算符,如果字符串中包含给定的字符,则返回True | 'H' in 'Hello' |
| not in | 成员运算符,如果字符串中不包含给定的字符,则返回True | 'M' in 'Hello' |
| r/R | 原始字符串,在转义字符中,可以使转义字符失效 | print(r'你n好') |
| % | 格式字符串 | 后面详解 |
(二)字符串索引:
通过索引或反向索引的方式访问字符串中的字符。正向索引是从 0 开始计数,而反向索引则是从 -1 开始计数。如下:
str = 'Hello World' print(str[6]) # 输出:W print(str[-5]) # 输出:W
上段代码具体原理如下:
(三)字符串分片:
string = 'Hello World'
# 从索引 0 开始,到索引 3 为止,不包括索引 3
print(string[0:3])
# 输出:Hel
# 如果第一个索引是 0,可以省略
print(string[:3])
# 输出:Hel
print(string[3:11])
# 输出:lo World
# 如果分片到末尾,后面也可以省略
print(string[3:])
# 输出:lo World
# 如果都省略,则是复制一个一样的字符串
print(string[:])
# 输出:Hello World
上面的这些例子中有两个注意点:
- 分片是半闭半开区间,即包含前面索引位置的元素,不包含后面索引位置的元素。比如:string[m:n] 获取的是字符串 string 中索引为 m 到 n-1 之间的元素(包括 m 和 n-1);
- 分片中前后索引的值是可以省略的,前索引省略默认为 0,后索引省略默认为序列长度。
关于分片和索引的一个注意点:
string = 'Hello World' print(string[0:100000])
你猜猜运行结果是什么?是不是会报错?因为后面索引超出了字符串本身的长度。其实不然,分片超出范围是不会报错的。上段代码结果是:Hello World。(你可以把字符串想象成一根绳子,分片就是用刀将绳子切分开来。在字符串长度内分片相当于在绳子上切割,而超出范围相当于一刀砍到了空气,对于绳子来说没有影响。)
这一点和索引取值是不同的,如果索引取值超出范围将会报错。比如将上面的第二行代码改成 print(string[100000]) 将会得到 IndexError: string index out of range(索引错误:字符串索引超出范围)的报错。如下:
string = 'Hello World' print(string[100000]) # 输出:IndexError: string index out of range
(四)字符串的不可变性:
字符串一旦创建后是不可改变的,这个属性和元组类似,通过索引来改变字符串中元素就会报错,那么我们怎样才能修改字符串的内容呢?答案是使用字符串分片和拼接去生成一个新的字符串,看个例子:
name = '鹿班七号' name[0] = '鲁' print(name) # 报错:TypeError: 'str' does not support item assignment on line 2 new_name = '鲁' + name[1:] print(new_name) # 输出:鲁班七号
(五)字符串大小写转换方法:
举例说明:
'abcd'.upper() # 'ABCD' 'ABCD'.lower() # 'abcd' 'ABCD'.capitalize() # 'Abcd' '1aBcD'.capitalize() # '1abcd' 'this is an example string'.title() # This Is An Example String '5g is coming'.title() # 5G Is Coming 'abcd'.swapcase() # 'ABCD'
(六)字符串分割、组合、移除:
举例说明:
str = '$带-你-打-开-编-程-世-界-的-大-门$'
print('~'.join(str.split('-')).strip('$'))
# 上面代码相当于
# str = str.split('-')
# str = '~'.join(str)
# str = str.strip('$')
# 输出:带~你~打~开~编~程~世~界~的~大~门
除了上表中,strip()方法(移除字符串头尾指定字符)可以移除字符串中的指定字符外,Python中的 lstrip()方法(移除字符串头部指定字符) 和 rstrip() 方法(移除字符串尾部指定字符)也可以删除字符串中的指定字符。
(七)字符串查找与替换:
举例说明:
str = 'feel the change'
# 输出 str 中 e 的个数 #输出:
print(str.count('e')) #4
# 输出 str 中 change 的索引值
print(str.find('change')) #9
# 将 str 中的 change 替换为 CHANGE
print(str.replace('change', 'CHANGE')) #feel the CHANGE
(八)字符串对齐:
在使用Word处理文档时可能需要对文档的格式进行调整,如标题居中显示、左对齐、右对齐等。Python提供了center()(居中对齐)、ljust()(左对齐)、rjust()(右对齐)这3个方法来设置字符串的对齐方式。
(九)字符串格式化输出:
字符串格式化输出是按照一种既定格式给字符串填空的方式,以便我们更加方便地写入字符串。
(1)%占位格式化字符串:
def print_intro(name, age, city):
intro = '我叫%s,今年 %d 岁,来自%s。' % (name, age, city)
print(intro)
print_intro('李华', 18, '重庆')
# 输出:我叫李华,今年 18 岁,来自南京。
上段代码中,% 运算符左边是要格式化的字符串,右边是一个元组。如果只有一个占位符,可以将元组里的元素拿出来。常用的占位符如下:
| 格式符 | 格式说明 |
| %c | 将对应的数据格式化为字符 |
| %s | 将对应的数据格式化为字符串 |
| %d | 将对应的数据格式化为整数 |
| %u | 将对应的数据格式化为无符号整型 |
| %o | 将对应的数据格式化为无符号八进制数 |
| %x | 将对应的数据格式化为无符号十六进制数 |
| %f | 将对应的数据格式化为浮点数,可指定小数点后的精度(默认保留6位小数) |
(2)format() 方法格式化字符串:
除了使用 % 运算符 进行字符串格式化输出,我们还可以使用字符串的 format() 方法达到同样的效果。format() 方法使用 {} 作为占位符,然后按照参数顺序替换对应的占位符。
'我叫{},今年 {} 岁,来自{}'.format('李华', 18, '重庆')
# 我叫李华,今年 18 岁,来自重庆
#还可以给占位符编号:
'我叫{0},今年 {1} 岁,来自{2}'.format('李华', 18, '重庆')
# 我叫李华,今年 18 岁,来自重庆
# 调整编号顺序
'我叫{2},今年 {1} 岁,来自{0}'.format('重庆', 18, '李华')
# 我叫李华,今年 18 岁,来自重庆
# 重复编号
'我叫{0},{0}今年 {1} 岁,来自{2}'.format('李华', 18, '重庆')
# 我叫李华,李华今年 18 岁,来自重庆
#还可以给占位符命名:
'我叫{name},今年 {age} 岁,来自{city}'.format(name = '李华', age = 18, city = '重庆')
# 我叫李华,今年 18 岁,来自重庆



