一、 什么是字符串(str)
- 字符串是
容器型数据类型,用单引号或双引号作为容器的标志,元素不需要用逗号隔开 - 字符串是
不可变的(不支持增删改),字符串是有序的(支持下标操作) - 字符串中的元素,只能是文本符号(所有计算机能表达出来的符号),一个符号对应一个元素
- 字符串中每个独立的元素叫字符,python中只有字符的概念,但是没有字符对应的数据类型
1) 空字符串和非空字符串
# 空字符串
str1 = ''
str2 =""
str3 = ''''''
str4 = """"""
#非空字符串
str11 = 'abd'
str22 ="你家"
str33 = '''hello'''
str44 = """world"""
2)字符(字符串中的元素)
-
字符串中的字符分两种,普通字符,转义字符
- 1)普通字符 : 除了转义字符以外的所有字符
- 2)转义字符 : 在指定符号前加\用来表示一些特殊功能和特殊意义的字符
\n 换行
\t 制表符(按tab键)
\' 单引号
\" 双引号
\\ 反斜杠
编码字符:\u 加上4位的十六进制:\u4e00
str1 = '\tabc\n123'
print(str1)
str2 ='abc\'123'
print(str2)
str3 = 'acd\\n123'
print(str3)
#注意:计算字符串长度的时候,一个转意字符串的长度是1
str5 = 'u789a'
str6 = '\u789a你好'
print (str5,str6)
-
阻止转义
在字符串的最前面加r/R,那么这个字符串中所有的转义符都无效
str7 = r'\tqwe\nsdf\u4e00'
print (str7)
#应用1:windows路径
path = r'c\nan\temp'
print (path)
#应用2:正则表达式
二、什么是字符编码
- 计算机在存储数据的时候,只能存数字,而且存的数字的补码
- 为了能够让计算机存储文本数据,给每个字符关联了一个固定的数字,用来对这个字符进行存储,每个字符关联的那个数字就是这个字符的编码值
编码表
1)ASCII码表 一个字节保存一个字符(码值范围:0~127)
- a. 数字在字母的前面
- b. 大写字母在小写字母前面(字母之间是连续递增)
- c. 大写字母和小写字母之间有其他符号
2)Unicode编码表
- Unicode编码表是对ASCII码表的扩展,Unicode编码表包含了ASCII码表中的符号
- Unicode编码表包含了世界上所有国家所有名族所有的语言的所有符号(范围:ffff)
- 中文范围:4e00~9fa5
1)chr函数
chr(编码值) 获取指定编码值对应的字符
print (chr(0x0f00))
for x in range(0x0f00,0x0fff):
print (chr(x), end = ',')
count = 0
for x in range(0x4e00,0x9fa5):
print (chr(x),end = ' ')
count += 1
if count%40 == 0:
print ()
2)ord函数
ord(字符) 获取指定字符对应的编码值
print ()
print (ord('傻'),ord('瓜'))
3)编码字符
str1 = '\u0f00你好!'
print (str1)
三、获取字符串中的元素(获取字符)
# 字符串获取元素和列表获取元素的语法一样
str1 ='how are you'
# 1)获取单个元素
print (str1[2],str1[-2])
# 2)切片
print(str1[1:3])
print(str1[-3::-1])
# 3)遍历
for x in str1:
print(x,end='')
print()
for index in range(len(str1)):
print(str1[index],end='')
print()
四、字符串的其他操作
1) +,*
- 字符串1+字符串2
- 字符串*n
s1 = '123'
s2 = 'abc'
print(s1+s2)
print(s1*2)
2) ==,!=
print(s1 == '123') #True
print(s1 == '321') #False
3) >,<,>=,=<,(针对两个字符串)
s3 = 'abcd'
s4 = 'ABC'
print(s3>s4) #True 比较第一组不相等的字符的编码值的大小
应用:
- 判断是否是数字字符:'0'<= char <='9'
- 判断是否是小写字母:'a'<=char <='z'
- 判断是否是大写字母:'A'<=char<='Z'
- 判断是否是字母: 'a'<=char <='z' or 'A'<=char<='Z'
- 判断是否是中文字符:'\u4e00'<= char<='\u9fa5'
举个例子
#例1: 输入一个字符串,统计字符串中字母和中文的个数
s5 = 'hello 你好吗?'
count1 = 0
count2 = 0
for s in s5:
if s >='\u4e00' and s<='\u9fa5':
count1 += 1
elif 'a'<= s <='z' or 'A'<= s <='Z':
count2 += 1
print('中文字符个数',count1,'英文字符个数',count2)
#例2:判断输入的是否是纯数字字符串
s6 = '12345'
for s in s6:
if not '0'<= s <='9':
print('不是纯数字')
break
else:
print('是纯数字')
4) in 和 not in
字符串1 in 字符串2 判断字符串1是否是字符串2的子串
print('abc' in 'acbwe') #False
print('abc' in 'abcmm') #True
五、相关函数
- max,min,sum,sorted,reversed等,都可以使用于字符串
- len(字符串) - 求字符串长度
- str(数据) - 将自定义数据转换成字符串
- 所有的数据都能转换成字符串
- 将数据的打印值作为字符串的内容
- center,rjust,ljust,zfill(居中,右对齐,左对齐)
- 字符串.center(长度,填充字符) 产生一个新的字符串
- 字符串.zfill(长度)== 字符串.rjust(长度,'0')
print('abc'.center(7,'-'))
print('abc'.rjust(7,'*'))
#举例:给任意一个商品的数字编码值,换成固定格式商品编码
num = ['33','44']
str1 = 'GD'
for n in num:
print(str1 + n.rjust(4,'0'))
-
replace
字符串1.replace(字符串2, 字符串3) - 将字符串1中的字符串2全部替换成字符串3
字符串1.replace(字符串2, 字符串3, N) - 将字符串1中前 N 个字符串2替换成字符串3
str1 = 'how are you? i am fine, Thank you! And you?'
print(str1.replace('you', 'me')) # how are me? i am fine, Thank me! And me?
print(str1.replace('you', 'me', 1)) # how are me? i am fine, Thank you! And you?
-
count
字符串1.count(字符串2) - 统计字符串1中字符串2出现的次数
字符串1.count(字符串2, 开始下标, 结束下标) - 在字符串1中指定范围内统计字符串2出现的次数
print(str1.count('you')) # 3
num = str1.count('you', 0, 11) # 1
print(num)
-
expandtabs(抛弃)
- 字符串.expandtabs() - 将字符串中的制表符替换成 8 个空格(只针对下标是0的制表符有效,后面是 8 - 3)
- 字符串.expandtabs(N) - 将字符串中的制表符替换成 N 个空格 (只针对下标是0的制表符有效,后面是 - 3)
str2 = 'Naa\tabc\t123'
new_str2 = str2.expandtabs(2)
print(str2, len(str2))
print(new_str2, len(new_str2))
- 将制表符替换成8个空格
new_str2 = str2.replace('\t', ' '*8)
print(new_str2)
- 字符串切割
- 字符串1.split(字符串2) - 将字符串1按照字符串2为切割点进行切割
- 字符串1.split(字符串2, N) - 将字符串1按照字符串2为切割点进行切割,切 N 次
- 字符串1.rsplit(字符串2, N) - 将字符串1按照字符串2为切割点进行切割,切 N 次, 从后往前切
str1 = 'how are you? I am fine, Thank you! And you?'
print(str1.split(' ')) # ['how', 'are', 'you?', 'i', 'am', 'fine,', 'Thank', 'you!', 'And', 'you?']
print(str1.split(' ', 2)) # ['how', 'are', 'you? i am fine, Thank you! And you?']
print(str1.rsplit(' ', 2)) # ['how are you? i am fine, Thank you!', 'And', 'you?']
- 删除字符
- 字符串1.strip() - 同时删除字符串最左边和最右边的空白
- 字符串1.lstrip() - 删除字符串中最左边的所有空白
- 字符串1.rstrip() - 删除字符串中最右边的所有空白
- 字符串1.strip(字符串2) - 同时删除字符串最左边和最右边的字符串2
- 字符串1.lstrip(字符串2) - 删除字符串中最左边的所有字符串2
- 字符串1.rstrip(字符串2) - 删除字符串中最右边的所有字符串2
str3 = '\n\t abc 123\n 你好 \n'
print('============================')
print(str3)
print('============================')
print(str3.lstrip())
print('============================')
print(str3.rstrip())
print('============================')
print(str3.strip())
print('============================')
str4 = '**1**abc123***'
print(str4.strip('*')) # 1**abc123
print(str4.rstrip('*')) # **1**abc123
print(str4.lstrip('*')) # 1**abc123***
- 字符串查找
- 字符串1.find(字符串2) - 获取字符串2第一次在字符串1中出现的位置(用正的下标值表示),如果找不到返回 -1
- 字符串1.find(字符串2, 开始下标, 结束下标)
str1 = 'how are you? i am fine, Thank you! And you?'
print(str1.find('you')) # 8
# 练习1:写代码实现查找字符串str1中所有的 'you'出现的位置
start_index = 0
indexs = []
while True:
index = str1.find('you', start_index)
if index == -1:
break
start_index = index + 3
indexs.append(index)
print(indexs)
-
拼接
字符串.join(容器) - 将容器中元素用指定字符串连接在一起(容器中的元素是字符串)
list1 = ['路路', '浩浩', '荣荣']
new_str = ' and '.join(list1)
print(new_str)
new_str2 = '+'.join('abc')
print(new_str2)
# 练习2:用列表推导式实现将任意容器中的元素用join进行连接
nums = [10, 20, '30', True]
# print('+'.join(nums)) # TypeError: sequence item 0: expected str instance, int found
nums = {'name': '晴晴', 'age': 18, 'sex': '女'}
new_str3 = ' '.join([str(x) for x in nums.values()])
print(new_str3) #晴晴 18 女