一、字符串基础功能:
1.什么是字符串:
简单讲用引号包裹的就是字符串,可以是单引号或双引号。
2.字符串的基础操作:
创建字符串:
# 创建空字符串
s = ''
# 创建非空字符串
s = 'hello Lily'
字符串索引:
s = 'hello Lily'
print(s[0]) # h
print(s[1]) # e
print(s[-1]) # y
字符串切片:
s = '你是我的 甜心 小宝贝儿'
print(s[6:]) # 心 小宝贝儿
print(s[4:7])# 甜心
print(s[::-1]) # 儿贝宝小 心甜 的我是你
字符串的拼接,重复,成员判断:
# 5.拼接
print("昨夜星光闪闪" + "我爱你的心满满") #昨夜的星闪闪爱你的心满满
# 6.重复
print("下蛋公鸡,公鸡中的战斗机,欧耶!" * 3) # 下蛋公鸡,公鸡中的战斗机,欧耶!下蛋公鸡,公鸡中的战斗机,欧耶!下蛋公鸡,公鸡中的战斗机,欧耶!
# 7.成员
print("a good" in "today is a good day!") # True
字符串遍历:
s = "hello"
for c in s:
print(c) # 每个字符
for i in range(len(s)):
print(i, s[i]) # 下标
for i,c in enumerate(s):
print(i, c) # 下标,字符
字符串的不可变性:
s = "hello"
# s[0] = "a" # 报错
s = s + " world"
print(s) # 'hello world'
总结:字符串(str)与列表(list)大部分基础操作相同。
二、字符串常用方法:
统计子串个数:
s = "hello"
print(s.count('ll')) # 1
print(s.count('lll')) # 0
字符串的大小写转换:
print("hello".upper()) # HELL 变成大写
print("HELLo1".lower()) # hello1 变成小写
print("i loVE you".title()) # I Love You 每个单词首字母大写,其他变成小写
print("i loVE you".capitalize()) # I love you 整个字符串首字母大写,其他变成小写
print("i loVE you".swapcase()) # I LOve YOU 大小写切换
字符串的判断方法:
# 1.判断是否数字
print('1'.isdigit()) # True
# 2.判断是否字母
print('abc'.isalpha()) # True
# 3.判断是否字母或数字
print('abc123'.isalnum()) # True
# 4.判断字母是否小写
print("abc123,".islower()) # True
# 5.判断是否大写
print("ABC123,".isupper()) # True
# 6.判断是否是title格式
print("Hello".istitle()) # True
# 7.判断是否只有空格
print(' '.isspace()) # True
字符串的查找方法:
# find() : 从左往右查找子字符串第一次出现的下标, 如果不存在则返回-1
# rfind() : 从右往左查找子字符串第一次出现的下标, 如果不存在则返回-1
s = 'Hong Kong driver diagnosed'
print(s.find('ong')) # 1
print(s.find('ong2')) # -1
print(s.rfind('ong')) # 6
print(s.rfind('ong2')) # -1
# 下面的不常用
# print(s.index('ong')) # 1
# print(s.index('ong2')) # 报错
# print(s.rindex('ong')) # 6
# print(s.rindex('ong2')) # 报错
字符串的合并与拆分:
拆分/分割
# split(): 按照指定的字符串进行拆分,返回一个拆分之后的列表
s = "I love you"
list1 = s.split() # ['I', 'love', 'you']
list1 = s.split(" ") # ['I', 'love', '', '', 'you']
list1 = s.split("love") # ['I ', ' you']
list1 = s.split('hello') # ['I love you']
list1 = s.split('you') # ['I love ', '']
list1 = s.split('o', 1) # ['I l', 've you'], 按照前1个o来拆分
print(list1)
# splitlines() : 按行拆分
s = '''论语
吾日三省吾身
为人谋而不忠乎
与朋友交而不信乎
传不习乎
'''
print(s.splitlines()) # ['论语', '吾日三省吾身', '为人谋而不忠乎', '与朋友交而不信乎', '传不习乎']
print(s.splitlines(True)) # ['论语\n', '吾日三省吾身\n', '为人谋而不忠乎\n', '与朋友交而不信乎\n', '传不习乎\n']
print(s.split('\n')) # ['论语', '吾日三省吾身', '为人谋而不忠乎', '与朋友交而不信乎', '传不习乎', '']
连接/合并
# join() : 将列表中的所有字符串用指定的连接字符串合并
l = ['论语', '吾日三省吾身', '为人谋而不忠乎', '与朋友交而不信乎', '传不习乎']
print( '+'.join(l) )
# 论语+吾日三省吾身+为人谋而不忠乎+与朋友交而不信乎+传不习乎
print( '\n'.join(l) )
#论语
#吾日三省吾身
#为人谋而不忠乎
#与朋友交而不信乎
#传不习乎
print( '===='.join(l) )
# 论语====吾日三省吾身====为人谋而不忠乎====与朋友交而不信乎====传不习乎
字符串替换:
s = 'mask have tesla tesla tesla'
s = s.replace('mask', '王传福')
print( s.replace('tesla', 'BYD') ) # 王传福 have BYD BYD BYD
print( s.replace('tesla', 'BYD', 2) ) # 王传福 have BYD BYD tesla
print(s) # 王传福 have tesla tesla tesla
编码和解码:
# 编码: 字符串=>二进制
s = "Python 牛!"
b = s.encode() # 默认UTF-8编码, b'Python \xe7\x89\x9b!'
print(b)
# 解码: 二进制=>字符串
s2 = b.decode()
print(s2) # 'Python 牛!'
字符串首尾匹配:
s = 'hello kitty'
print(s.startswith('hell')) # True
print(s.endswith('tty')) # True
ASCII码转换:
print(ord('a')) # 97
print(chr(100)) # d
运算字符串中数据:
# eval():
print(eval("1+2")) # 3
l = eval("[1,2,3]")
print(l, type(l)) # list
三、实战练习:用Python实现歌词解析:
musicLrcStr = """[00:03.50]传奇
[00:19.10]作词:刘兵 作曲:李健
[00:20.60]演唱:王菲
[00:26.60]
[04:40.75][02:39.90][00:36.25]只是因为在人群中多看了你一眼
[04:49.00]
[02:47.44][00:43.69]再也没能忘掉你容颜
[02:54.83][00:51.24]梦想着偶然能有一天再相见
[03:02.32][00:58.75]从此我开始孤单思念
[03:08.15][01:04.30]
[03:09.35][01:05.50]想你时你在天边
[03:16.90][01:13.13]想你时你在眼前
[03:24.42][01:20.92]想你时你在脑海
[03:31.85][01:28.44]想你时你在心田
[03:38.67][01:35.05]
[04:09.96][03:39.87][01:36.25]宁愿相信我们前世有约
[04:16.37][03:46.38][01:42.47]今生的爱情故事 不会再改变
[04:24.82][03:54.83][01:51.18]宁愿用这一生等你发现
[04:31.38][04:01.40][01:57.43]我一直在你身旁 从未走远
[04:39.55][04:09.00][02:07.85]
"""
# 先将所有的时间和歌词放在列表中
# 按行拆分
lrc_list = musicLrcStr.splitlines()
# 列表存放所有时间和歌词
music_list = []
# 遍历每一行歌词
for lrc in lrc_list:
# print(lrc) # 其中的每一行歌词内容
# 按']'拆分
line_list = lrc.split(']')
# print(line_list)
# 歌词内容
lrc_content = line_list.pop()
# print(line_list)
# 遍历每一行的所有歌词时间
for lrc_time in line_list:
lrc_time = lrc_time[1:] # 将'['去掉
# 将提取出来的时间与歌词存入字典当中
music_dict = {'time': lrc_time, 'content': lrc_content}
# 将存放单句时间歌词的字典存入歌词列表中
music_list.append(music_dict)
# 列表中字典按'time'升序排列
music_list.sort(key=lambda a:a['time'])
import time
# 用于存放前一句歌词的时间
sec = 0
for d in music_list:
# 取出当前时间
t = d['time']
# 将时间转换成秒
i = t.find(':')
t2 = float(t[:i])*60 + float(t[i+1:]) # 秒
# 调用time.seelp()方法暂停歌词显示时间
time.sleep(t2 - sec) # 暂停
# 将本句歌词时间传入sec之中
sec = t2
# 打印当前歌词
print(f'{d["time"]} : {d["content"]}')
四、习题:
1.输入一个字符串,压缩字符串如下aabbbccccbbd变成a2b3c4b
2,将字符中单词用空格隔开
3.去掉字符串123@zh@qq.com中的@;
4.已知字符串 s = “aAsmr3idd4bgs7Dlsf9eAF”,要求如下
a.请将s字符串的大写改为小写,小写改为大写
b.请将s字符串的数字取出,并输出成一个新的字符串
c.请统计s字符串出现的每个字母的出现次数(忽略大小写,a与A是同一个字母)
上期习题答案:
1.声明一个字典保存一个学生的信息,学生信息中包括:
姓名、年龄、成绩(单科)、电话、性别(男、女、不明)
studt1 = {'name': '张山', 'age': 22, 'sl': 55, 'tel': 13504128857, 'sex': '男'}
studt2 = {'name': '小花', 'age': 12, 'sl': 66, 'tel': 13504128832, 'sex': '女'}
studt3 = {'name': '流浪', 'age': 23, 'sl': 78, 'tel': 13504568838, 'sex': '不明'}
studt4 = {'name': '兰妃', 'age': 16, 'sl': 99, 'tel': 13504127632, 'sex': '女'}
studt5 = {'name': '李', 'age': 25, 'sl': 33, 'tel': 13504147968, 'sex': '男'}
studt6 = {'name': '沈晓花', 'age': 46, 'sl': 88, 'tel': 13504176828, 'sex': '不明'}
2.声明一个列表,在列表中保存6个学生的信息(6个(题1)中的字典)
s = [studt1, studt2, studt3, studt4, studt5, studt6]
(1) 统计不及格学生的个数
n = 0
for i in range(len(s)):
if s[i]['sl'] < 60:
print(s[i]['name'])
n += 1
print('不及格的人数为:', n)
)
(2) 打印不及格学生的名字和对应的成绩
for i in range(len(s)):
if s[i]['sl'] < 60:
print(s[i]['name'], s[i]['sl'])
(3) 统计未成年学生的个数
n = 0
for i in range(len(s)):
if s[i]['age'] < 18:
print(s[i]['name'], s[i]['age'])
n += 1
print(n)
(4) 打印手机尾号是8的学生的名字
for i in range(len(s)):
if s[i]['tel'] % 10 == 8:
print(s[i]['name'], s[i]['tel'])
(5)删除性别不明的所有学生(选做)
i = 0
while i < len(s):
if s[i]['sex'] == '不明':
s.pop(i)
i - = 1
i += 1
print(s)