1 字符串定义
- 字符串是python提供的容器型数据类型(序列), 不可变、有序
- 不可变 - 不支持增删改;
- 有序 - 支持下标操作
- python中的字符串是用单引号或者双引号引起来的字符集;引号里面的每个基本单元叫字符
2 字符
- python中只有字符概念,没有字符类型
- 普通字符: 数字、字母、普通符号、中文、日语等
- 转义字符:
转移字符 说明 转移字符 说明 \'
单引号 \"
双引号 \n 换行 \r 回车 \t tab \\ \
- 在特定的符号前加\来表示特殊功能或者特殊意义的字符
- 阻止转义: 在字符串的最前面加r/R,能够阻止字符串中所有的转义
str3 = '\t12\'3\na\"bc \\none 001'
print(str3)
str4 = R'\thow\nare\nyou\"'
print(str4)
-
注意字符长度
- '\tabc\n123' # 长度:8
- r'\tabc\n123' # 长度:10
编码字符: 在字符串中用'\u四位的十六进制数'来表示一个字符
str5 = '123\u4e11'
print(str5)
3 字符编码
计算机本身只有直接存储数字的能力(存数字的二进制的补码),为了能够存储数字以外的符号,
开发人员给每个字符对应一个固定的数字用来对字符进行存储。每个字符对应的固定的数字就是字符的编码值。-
每个字符和数字的一一对应关系就是字符编码表,常见的编码表有: ASCII码表、Unicode编码表
- ASCII码表采用一个字节对字符进行编码:0-127
- Unicode编码表采用2个字节对字符进行编码, 包含了ASCII码
chr函数: chr(编码值) - 获取编码值对应的字符
ord函数: ord(字符) - 获取指定字符对应的编码
print(chr(100), chr(0x5e00))
print(ord('a'), ord("A"))
- 练习: 查看易经六十四卦符号
for code in range(0x4dc0, 0x4dff):
print(chr(code))
4 字符串操作
4.1 获取单个字符
- 语法: 字符串[下标] - 获取指定下标对应的字符
- 字符串 - 结果是字符串的表达式(字符串值、字符串变量、运算结果是字符串)
- [] - 固定写法
- 下标 - 又叫索引,值是整数;字符串确定后,字符串中的没有字符都有一个确定的下标/索引表示这个字符在字符串中的位置。
- python中下标有两种,位置从往后是 0 ~ 字符串长度-1; 位置从后往前是 -1 ~ -字符串长度
- 注意: 获取单个字符的时候下标不能越界
str1 = 'hello'
print(str1[0], str1[3]) # h l
print(str1[-1]) # 获取最右边字符o
str2 = '\tabc 123'
print(str2[2], str2[5]) # b 1
# print(str2[100]) # 下标越界 IndexError: string index out of range
# print(str2[-20]) # 下标越界IndexError: string index out of range
print('hello'[2])
4.2 获取部分字符(字符串切片)
-
语法: 字符串[开始下标:结束下标:步长] - 从开始下标开始获取,每次增加步长取下一个值;取到结束下标前为止(结束下标对应的值取不到)
- 字符串 - 结果是字符串的表达式(字符串值、字符串变量、运算结果是字符串)
- []/: - 固定写法
- 开始下标 - 下标,整数。能取到对应的字符
- 结束下标 - 下标,整数。对应的字符取不到
- 步长 - 整数。如果步长是正数,从前往后取;如果步长是负数,从后往前取
-
切片注意事项
- 字符串切片的结果都是字符串
- 如果步长是正数,那么开始下标对应字符要在结束下标对应的字符的前面,才能取到值
- 如果步长是负数,那么开始下标对应的字符要在结束下标对应的字符的后面,才能取到值
- 切片的时候下标可以越界
str3 = 'abc+123'
print(str3[0:3:2]) # 'abc' 'ac'
print(str3[2:-2:1]) # 'c+1'
print('结果:', str3[2:-2:-1]) # ''
print(str3[0:-1:1]) # abc+12
print(str3[-1:2:-1]) # 321+
print(str3[-1:1:-2]) # 31c
print(str3[-100:100:1]) # abc+123
4.3 获取部分字符的简写
- 省略步长 - 步长为1 :
- 语法:字符串[开始下标:结束下标] <===> 符串[开始下标:结束下标:1]
str4 = 'hello world'
print(str4[3:-2]) # lo wor
- 省略开始下标 - 步长为正从字符串开头往后获取;步长为负从字符串最后往前获取
- 语法: 字符串[:结束下标:步长] 、字符串[:结束下标]
print(str4[:5]) # hello
print(str4[:5:-1]) # dlrow
- 省略结束下标 - 步长为正,取到字符串最后一个字符为止; 步长为负取到第一个字符为止
- 语法: 字符串[开始下标::步长]、 字符串[开始下标:]
str4 = 'hello world'
print(str4[1:]) # ello world
print(str4[1::-1]) # eh
print(str4[:]) # 'hello world'
print(str4[::-1]) # dlrow olleh 字符串倒序
4.3 遍历字符串 - 将字符串中的字符一个一个的取出来
- 直接遍历, 变量取到的就是字符
str4 = 'hello world'
for char in str4:
print(char)
- 简介遍历, 通过遍历下标遍历字符
str4 = 'hello world'
for index in range(-1, -11, -1):
print(index, str4[index])
- 练习: 统计输入的字符串中,字母'a'出现的次数
value = input('请输入一个字符串:')
count = 0
for char in value:
if char == 'a':
count += 1
print(count)
4.4 字符串的运算
4.1 数学运算符: +, *
- 字符串1+字符串2: 两个字符串相加 -> 将两个字符串拼接产生一个新的字符串
str1 = 'abc' + 'hello'
print(str1) # abchello
- 字符串相加两边都要是字符串
str2 = 'abc' + 123 # TypeError: must be str, not int
- 字符串正整数/ 正整数字符串: 字符串重复指定次数产生一个新的字符串
str2 = 3 * 'abc'
print(str2)
4.2 比较运算:针对两个字符串进行比较 >, <, >=, <=, ==, !=
- 字符串比较大小: 按位置从前往后一对一对的比较,找出第一对不相等的字符,看它们的编码值谁大,那个字符串就大
print('bbZ' > 'abaa') # True
print('你好' > 'hello') # True
-
字符串比较大小应用:
- 判断一个字符是否是小写字母: 'a'<=char<='z'
- 判断一个字符是否是大写字母: 'A'<=char<='Z'
- 判断一个字符是否是字母: 'a'<=char<='z' or 'A'<=char<='Z'
- 判断一个字符是否是数字字符: '0'<=char<='9'
- 判断一个字符是否是中文(4e00-9fa5): '\ue400'<=char<='\u9fa5', '一'<=char<='龥'
练习: 统计一个字符串中大写字母的个数
str4 = 'How Are You!'
count = 0
for char in str4:
if 'A' <= char <= 'Z':
count += 1
print(count)
4.3 赋值运算: =, +=, *=
str5 = '你好'
str5 += 'hello' # str5 = str5+'hello'
print(str5)
str5 *= 2
print(str5)
4.5 in 和 not in
- 字符串1 in 字符串2 - 判断字符串2中是否包含字符串1
print('abc' in 'a123abc') # True
print('abc' in '123ab1c') # False
4.6 len函数
- len(字符串) - 获取字符串长度(字符串中字符的个数)
print(len('\tabc')) # 4
str6 = ' abc'
print(len(str6)) # 7
print(len('\u4e00abc')) # 4
4.7 str函数
- str(数据) - 将其他类型数据转换成字符串
- 所有类型的数据都可以转换成字符串; 转换的时候直接数据的外面加引号
print(str(12.5)) # '12.5'
print(str(True)) # 'True'
4.8 格式字符串: 在字符串中用格式占位符代替字符串中变化的部分,然后再使用数据对变化的部分进行赋值
- 语法: 包含格式占位符的字符串 % (数据1,数据2,...)
- 说明: 数据的个数和类型要和前面字符串中格式占位的个数和类型保持一致
格式占位符 | 意义 |
---|---|
%s | 字符串 |
%d | 整数 |
%.Nf | 浮点数(N控制小数后小数的位数) |
%c | 字符、字符对应的编码值 |
name = input('姓名:')
age = int(input('请输入年龄:'))
money = 3.5
message = '我是%s, 今年%d岁, 薪资:%.1fK, 等级:%c' % (name, age, money, 66)
print(message)
5 字符的对象方法 字符串.函数名()
5.1 字符串.capitalize() - 将字符串中的第一个字符转换成大写字母
str1 = 'hell world'
print(str1.capitalize())
print(str1)
5.2 设置对齐方式
- 字符串.center(width, fillchar) - 让字符串在新字符串中居中,width控制新子串的宽度,fillchar是填充字符
- 字符串.rjust(width, fillchar) - 让字符串在新字符串中居右,width控制新子串的宽度,fillchar是填充字符
- 字符串.ljust(width, fillchar)- 让字符串在新字符串中居左,width控制新子串的宽度,fillchar是填充字符
- 字符串.zfill(width) <==> 字符串.rjust(width, '0')- 让字符串在新字符串中居右,width控制新子串的宽度,其余以"0"填充
str1 = 'abc'
print(str1.center(7, '*'))
print(str1.ljust(7, '%'))
print(str1.rjust(7, '='))
num = 15
print(str(num).rjust(3, '0')) #打印一个三位数,num靠右对齐,不够三位用0填充,
print(str(num).zfill(3)) # 相当于rjust filling char是"0"
5.3 字符串查找和替换
str1 = 'a fox jumped over the fence'
方法名 | 说明 | 示例 |
---|---|---|
str.count(sub,start=0,end=len(string)) | 查找子串sub出现的次数;start从指定下标开始查,end结束下标 | str1.count('f') |
str.find(str, beg=0, end=len(string)) | 从左向右检测字符串中是否包含子字符串 str,如果包含返回下标,否则返回-1。beg和end是可选参数,指定查找范围 | str1.find('fox') |
str.rfind(sub[, start[, end]]) | 从右向左检测字符串中是否包含sub子串,包含返回子串的下标,否则返回-1 | str1.rfind('fox') |
str.index(sub[, start[, end]]) | 作用类似find,但子串sub不存在会报错ValueError | str1.index('fox') |
str.rindex(sub[, start[, end]]) | 从右向左检测,类似rfind,会报ValueError | str1.rindex('fox') |
str.replace(old, new[, count]) | 返回一个新字符串,原串中的old被替换为new,可选参数count指定替换次数。 | str1.replace('a','many') |
5.4 字符串分隔和组合
方法名 | 说明 | 示例 |
---|---|---|
str.split([sep[, num=count(sep)]]) | 将字符串拆分为以sep为分隔符的列表,如果指定num,则最多拆分num次 | str1.split(' ') |
str.rsplit([sep[, num=count(sep)]]) | 从右向左拆分 | |
str.partition(seq) | 将字符串拆分为一个有三个元素的元组(seq前的字符串,seq,seq后的字符串)。 | |
str.rpartion(seq) | 同上 | |
str.splitlines([keepends]) | 拆分一个包含多行的字符串,以每行为一个元素返回一个列表。keepends是一个True字符或非零整数,表示保留行尾标志(即换行符) | |
str.join(seq) | 以指定字符串str作为分隔符,将seq对象中所有的元素(字符串表示)合并为一个新的字符串;seq可以是字符串、列表等 |
5.5 字符串判断
方法 | 说明 | 示例 |
---|---|---|
str.isalpha() | 判断字符串是否由字母构成并且只包含字母,是返回True,否返回False | str1.isalpha() |
str.isalnum() | 检测字符串是否由字母和数字组成,如果都是数字或字母返回True,否则返回False | |
str.isdigit() | 检测字符串是否由数字构成,可检测byte类型 | |
str.isdecimal() | 检测字符串是否由数字构成 | |
str.isnumeric() | 检测字符串是否由数字构成, 可以检测汉字数字:十 | |
str.isspace() | 检测字符串是否只有空格或tab构成 | |
str.islower() | 检测字符串中的字母字符是否全部由小写字母组成 | |
str.isupper() | 检测字符串中的字母字符是否全部由大写写字母组成 | |
str.startswith(suffix[, start[, end]]) | 用于判断字符串是否以指定子字符串开头,如果是则返回True,否则返回False。 | |
str.endswith(suffix[, start[, end]]) | 用于判断字符串是否以指定子字符串 结尾,如果是则返回True,否则返回False。 |
5.6 字符串转换
方法 | 说明 | 示例 |
---|---|---|
str.lower() | 字符串转小写 | |
str.upper() | 字符串转大写 | |
str.swapcase() | 把字符串中的大小写字母互换,大写转换成小写,小写转换成大写。不去管非字母类字符。 | |
str.capitalize() | 将字符串的第一个字符转换为大写, 其余转换为小写 | |
str.title() | 字符串中每个单词的首字母大写,其余小写。 | |
str1.center(width,[fillchar]) | 用指定宽度居中显示字符串,如果字符串无法填满width,将用指定字符填充字符串,默认用空格填充 | str1.center(80,'*') |
str.ljust(width[, fillchar]) | 用指定宽度居左显示字符串 | |
str.rjust(width[, fillchar]) | 用指定宽度居右显示字符串 | |
str.lstrip([chars]) | 去除字符串左边指定的字符,默认是去除空格 | |
str.rstrip([chars]) | 去除字符串左边指定的字符,默认是去除空格 | |
str.strip([chars]) | 去除字符串两边边指定的字符,默认是去除空格 |