Python 字符串 详解

字符串的拼接

数据类型:字符串,在python中用’ '单引号,或者" "双引号包裹起来的内容就是字符串

name = "min"
age = 18
sex = "纯爷们"
#数据类型:字符串,在python中用' '单引号,或者" "双引号包裹起来的内容就是字符串
name = "wen"
age = 18
sex = "纯爷们"

#注意: 字符串形式的数据不能与数字类型的数据直接拼接
#strData = "wen" + "的年龄是:" + age (age是int类型的不能直接操作)
str_data = "wen" + "的年龄是:" + str(age)
print(str_data)

#python得字符串可以进行乘法操作 *
str_data2 = "wen is a" + " very "*10 + "good man"
print(str_data2)

listStr = ['wen is a good Man', 'wen is a nice man', 'wen is a handsome Man']
#"".join()表示以指定的字符, 来拼接 列表中的所有元素,组成一个新的字符串
strData = ",".join(listStr)
strData = " ".join(listStr)
strData = "".join(listStr)
print(strData)

字符串的截取(切片)

strData = "min先生 is a nice man!敏"
# 提取字符串中的字符
# 位置(下标,索引)
# 格式: 字符串名[索引值] 表示提取字符串中索引值对应位置的单个字符
# 索引是从 0 开始
str1 = strData[0]
str1 = strData[2]

#索引可以写负数,表示从字符串的最右侧开始数,如: -1 表示最后一个字符
str1 = strData[-2]

# str1 = strData[20] 注意 : IndexError: string index out of range 角标越界异常

# 能取到的索引的最大值 长度 - 1

**str1 = strData[len(strData) - 1]

#获取字符串的长度,格式:len[变量]
# length = len(strData)
# print(length)
# print(str1)


# 截取一定范围的字符串
# 格式: 字符串名[start:stop] 截取字符串中start位置到 stop位置之间的字符串
# start表示起始位置(包含)
# stop 表示结束位置(不包含)
# name = strData[0:3]
name = strData[4:6]
# print(name)
# [star:stop] start可以省略不写,不写则表示默认从 0 开始
# stop也可以忽略不写,不写则表示一直截取到末尾
strdata = strData[:6]
strdata = strData[7:]

#切片在只有前两个参数下,只能从左往右切(区间大小),[-1,-3] 结果为空,[-3,-1]可以

strdata = strData[7:-6]#注意: start位置索引要在stop表示的位置的前面
# print(strdata)


# 逆序
# 格式: 字符串名[start:stop:step] step表示步长, -1 表示倒着数, 默认是1
newData = strData[::-1]

#[-1,-3,-1] 表示反方向,从右往左 切

#newData = strData[::2]
print(newData)

str= "伊丽莎白鼠的溜肥肠还有挖掘机"
print(str[4:10:3]) #结果:鼠肥
print(s[-3:-9:-2]) #挖还肥 倒着数起始不是0,直接是-1,逆序时注意取右(前一个)
#步长就可以理解为 每几个 出来一个头部的,先确定范围再确定步长

#打印一个字符串最后两个字符
str="渡我被身子赛高"
print(str[-2:])

#打印一个字符串所有具有相同字符的索引
str="渡我被身子赛高真的赛高"
index=0 #计数
for c in str:
     if c=="赛":
         print(index)
     index=index+1

字符串的格式化

name = "min"
age = 18
heigth = 1.888888

# 字符串的格式化
# %s 替代一个可变的字符串
# %d 替代一个可变的数字
# %f 替代一个可变的浮点数, 注意 %.数值f 表示保留多少位小数

print("name:%s ,age:%d ,height:%.2f"%(name,age,heigth))
# print("name:%s ,age:%d ,height:%f"%(name,age,heigth))
format的用法
str2 = "我叫{}, 今年年{}岁了了, 我喜欢{}".format("周杰伦", 28, "周润发") #按位置格式化
print(str2)

str3 = "我叫{0}, 今年年{2}岁了了, 我喜欢{1}".format("周杰伦", "周润发", 28) #指定位置
print(str3)

str4 = "我叫{name}, 今年{age}岁了, 我喜欢{singer}".format(name="周杰伦", singer="周润
发", age=28) #指定关键字
print(str4)

在这里插入图片描述

和居中的效果连用
strvar = '{}'.format("商品").center(18)
print("序号" + strvar + '价格')

#通过格式化显示如下效果:
goods_lst = [{'name': '电脑', 'price': 10000},
     {'name': '鼠标', 'price': 99},
     {'name': '美女', 'price': 200},
     ]


def show_goods():
     strvar = '{}'.format("商品").center(13)
     print("序号" + strvar + '价格')
     for index, value in enumerate(goods_lst, start=1):
          value['num'] = index
          strvar = "{value[num]:<10}{value[name]:<8}{value[price]}".format(value=value)
          print(strvar)


show_goods()

在这里插入图片描述

字符串的大小写操作

strData = "Men"
#把字符串中的字母全部转换成大写
print(strData.upper())

strData1 = "MIN IS VERY GOOD"
strData1 = "MIN IS very GOOD"
strData1 = "MIN IS very GOOD!888 敏"

#把字符串中的字母全部转换成小写,
print(strData1.lower())

#每个英文单词的首字母大写
strData2 = "min is 88a good man"
print(strData2.title())
#注意:每个被特殊字符隔开的字⺟首字⺟大写,除了英文外都是

#将第一个字符串的首字母大写
print(strData2.capitalize())

#大小写互相切换
strData3 = "min is VERY GOOD"
print(strData3.swapcase())

#不常⽤
ret = s1.casefold() # 转换成小写, 和lower的区别: lower()对某些字符支持不够好.
casefold()对所有字母都有效. 比如东欧的一些字母
print(ret)
s2 = "БBß" # 俄美德
print(s2)
print(s2.lower())
print(s2.casefold())

#判断字符串中的字母是否全部是大写
strData4 = "men Is GOod man!88,敏"
strData4 = "MiN IS GOOD MAN"
strData4 = "MIN IS GOOD MAN!88,min"
#strData4 = "MIN IS good MAN"
print(strData4.isupper())

#判断字符串中的字母是否全部是小写
strData5 = "MIN Is GOod man!88,温"
strData5 = "MIN IS GOOD MAN"
strData5 = "min is good man"
strData5 = "Min is good man!88,温"
print(strData5.islower())

#判断是否是title,首字母全部大写
strData6 = "men Is GOod man!88,温"
strData6 = "Men Is Good Man"
strData6 = "Men Is GOOD Man"
strData6 = "Men Is 888Good Man"
#strData6 = "wen is good man!88,温"
print(strData6.istitle())

#应用:检验用户输入的验证码是否正确
verify_code = "abDe"
user_verify_code = input("请输⼊入验证码:")
if verify_code.upper() == user_verify_code.upper():
     print("验证成功")
else:
     print("验证失败")

字符串的位置操作(对齐方式)

# " 标题 "
# "左边缘对齐 "
# " 右边缘对齐"

strData1 = "标题"

#让字符串内容贴 居中
#一个参数表示设置字符串的长度, 并让原字符串的内容居中, 空出的用 空格 填充
print(strData1.center(60))
#第二个参数指定 空白 的位置用 什么 字符填充
print(strData1.center(60,"*")) #填充是包含在内的,即是字符串+填充=参数1的数值

strData2 = "字符串左边缘对齐"
#print(strData2.ljust(60))
print(strData2.ljust(60,"*"))


strData3 = "字符串右边缘对齐"
# print(strData2.rjust(60))
print(strData2.rjust(60,"*"))

字符串的提取(去除空格和字符)

#去除字符串两边的
strData = " wenXXX "
strData = "***wenXXX********"
strData = "***wen***XXX********"
#print(strData)

print(strData.strip())#不加参数默认是去除字符串两边的 空白,\t \n 都算
print(strData.strip("*"))#参数用来指定去除字符串两边的字符

print(strData.lstrip("*"))#去除字符串左边的字符,默认是去空格
print(strData.rstrip("*"))#去除字符串右边的字符,默认是去空格

#应用:用户输入时多了空格
username = input("请输⼊入⽤用户名:").strip()
password = input("请输⼊入密码: ").strip()
if username == 'alex' and password == '123':
     print("登录成功")
else:
     print("登录失败")

#不常用:
# 更改tab的长度
s6 = "alex wusir\teggon"
print(s6)
print(s6.expandtabs()) # 可以改变\t的长度, 默认长度更改为8

字符串的查找

strData = "wen is a very very very good man"
pathData ="I:\sz1704\day09\code"

#从原字符串中找出指定的字符串, 找到后会返回“第一个”匹配项的首个字母的索引, 注意: 如果没有找到 返回 -1
print(strData.find("good"))
print(strData.find("very"))
#参数2表示查找范围的起始位置,参数3表示查找范围的结束位置
print(strData.find("very",16,23))#注意范围不要越界

#从字符串的右边开始找
print(strData.rfind("very"))

.index().rindex()查找

strData = "wen is a very very very good man"
print(strData.index("v"))
#index 与find类似, 从原字符串中找出指定的字符串, 找到后会返回 第一个 匹配项的首个字母的索引,
print(strData.index("vey"))#注意: 如果没有找到 会 报错
print(strData.rindex("very"))
print(strData.index("very",18,27))

#起始和结尾的查找
#www.baidu.com
#strData = "www.baidu.com"
#strData = "ww.baidu.com"
strData = "wwww.baidu.com"
strData = "wwww.baidu.com"
#判断字符串是否以 某个字符串开始
res = strData.startswith("www")
#判断字符串是否以 某个字符串 结尾
res = strData.endswith("com")
print(res)


s13 = "我叫sylar, 我喜欢python, java, c等编程语言."
ret1 = s13.startswith("sylar") # 判断是否以sylar开头
print(ret1)
ret2 = s13.startswith("我叫sylar") # 判断是否以我叫sylar开头
print(ret2)
ret3 = s13.endswith("语言") # 是否以'语言'结尾
print(ret3)
ret4 = s13.endswith("语言.") # 是否以'语言.'结尾
print(ret4)

字符串切割

strData = "wen is a good man wen is nice man"
.split()切割,分裂
#获取所有的单词
#以空格为拆分的字符
#split表示以指定的字符,将原字符串拆成多个字符串,多个字符串会放在一个列表中
#空参,即默认情况是以空格拆分
#第二参数,表示切割几次
    .split("l",1)


listStr = strData.split()
print(listStr)

strData = "wen is a good man,wen is nice man"
#指定切割字符,指定什么去切,就会损失掉什么
listStr = strData.split(",")

#如果指定的切割字符不存在, 则会把元字符作为列表的一个元素
listStr = strData.split("!")
print(listStr)

#如果切割字符=字符串本身,结果会返回两个空字符串
str= "银王哈哈银王呵呵银王吼吼银王"
lst = str.split("银王") # ['', '哈哈', '呵呵', '吼吼', '']
如果切割符在左右两端. 那么一定会出现空字符串
str="每天按时吃饭"
lst=str.split("每天按时吃饭") #结果["",""]


strData = """wen is a good Man
wen is a nice man
wen is a handsome Man #隐藏了换行符
"""
#把字符串切分成一行一行的数据
#默认不包含换行符,其实就是根据\n 来切割
listStr = strData.splitlines() #或者可以直接写.split("\n")

#如果指定参数, 表示是否保留换行符, True 保留
listStr = strData.splitlines(True)#Flase和默认一样
print(listStr)

字符串的替换

str_data = "wen is a good, wen is very nice man, wen is a handsome man,wen is a xxx"
#new_data=str_data.replace("wen","min",-1)
#old 需要被替换掉的:原字符串
#new 用来替换的:新字符串
#count 默认是全部替换,默认值是-1, 数值表示替换的次数

new_data=str_data.replace("wen","min",3)
print(new_data)

#应用:可以去掉某些不需要的元素
str= "sylar_alex_taibai_wusir_eggon" #想去掉"_"
str_new=str.replace("_","")
print("str_new")

#去除用户输入的空格
shizi = input("请输入你要计算的内容:")
#所有的空格去掉
shizi = shizi.replace(" ", "") # 5+9
lst = shizi.split("+") # 用+切割. 切割的结果是list
print(int(lst[0])+ int(lst[1]))

字符串的条件判断

s14 = "123.16"
s15 = "abc"
s16 = "_abc!@"

#是否由字⺟和数字组成
print(s14.isalnum()) #al +num 组成的“alnum”
print(s15.isalnum())
print(s16.isalnum())

#是否由字⺟组成
print(s14.isalpha())
print(s15.isalpha())
print(s16.isalpha())

#是否由数字组成, 不包括小数点
print(s14.isdigit())
print(s14.isdecimal()) #判断它是否是个小数  “decimal”“小数”
print(s14.isnumeric()) # 这个中⽂数字大写能识别 "numeric"意思是“数(字,值)”
print(s15.isdigit())
print(s16.isdigit())

#练习. 用算法判断某一个字符串是否是⼩数
s17 = "-123.12"
s17 = s17.replace("-", "") # 替换掉负号
     #s17=s17.lstrip("-")
if s17.isdigit():
     print("是整数")
else:
     if s17.count(".") == 1 and not s17.startswith(".") and not s17.endswith("."):
         print("是小数")
     else:
         print("不是⼩小数")


#计算⽤户输⼊的内容中有⼏个整数(以个位数为单位)。
如:content = input("请输⼊内容:") #如fhdal234slfh987
zhengshu = 0
content = input("请输⼊内容:")
for c in content:
     if c.isdigit():
         zhengshu = zhengshu + 1
print(zhengshu)

统计字符出现的次数

strData = "wen is a good, wen is very nice man, wen is a handsome man,wen is a xxx"
print(strData.count("wen"))
print(strData.count("man"))

字符串的长度操作

#字符串长度, python的内置函数len(), int(), bool(), str(), type()
s = "娃哈哈可口可乐"
print(len(s)) # 字符串中的字符的个数

字符的操作 字母, 数字, 其他特殊字符—ascii

strD = "y"
#把这个字母转换成 ascii码
num = ord(strD)
print(num)
#if "A" <= strD and strD <= "Z":
#if 65 <= num and num <= 90:

#将ascii转换成字符
print(chr(65))

eval()可以将字符当作表达式执行
print(eval("12 + 12")) #结果:24

#int, str, list,.....的类型转换
print(list("min very good"))
#输出结果:['m', 'i', 'n', ' ', 'v', 'e', 'r', 'y', ' ', 'g', 'o', 'o', 'd']

迭代

#我们可以使用for循环来便利(获取)字符串中的每一个字符
语法:
for 变量 in 可迭代对象:
#可迭代对象理解成:可以一个一个往外取值的对象

str="渡我被身子赛高"

for c in str:
    print("c")   #可以习惯写成变量c   "charactor"字符串

c=0
while c<len(str)
    print(str[c])
    c+=1

in有两种⽤用法:
1.for中:是把每一个元素获取到赋值给前⾯的变量.
2. 不在for中:判断xxx是否出现在str.
    print("赛高"in str)    True

.join()的用法

.join(可迭代对象)
#可以将列表转换成字符串. 每个元素之间用_拼接
s = "_".join(["高华新", "刘清扬", "崔园樟"])
print(s)

li=["高华新", "刘清扬", "崔园樟"]
s = "_".join(li)
print(s)
print(type(s)) #高华新_刘清扬_崔园樟
             <class 'str'>


ss = "高华新**刘清扬**崔园樟"
ss.split("**")

字符串转换成列表: split()
把列表转换成字符串: join()

s = "_".join("马化腾")
print(s)

练习题

第一题:str1 = "wen is a good man! wen is a good man! wen is a good man!
wen is a good man! wen is a good man!"
统计每个单词出现的个数,并打印  如: man:30  hello:30

str1 = "wen is a good man! wen is a good man! wen is a good man!
wen is a good man! wen is a good man!"
lis_str=str1.split()#以空格拆分,并把它们放在一个列表中
#print(lis_str)
set1=set(lis_str)#set去重
lis_str1=list(set1)#将去重后的值放在一个列表中
#print(lis_str1)

for i in range(len(lis_str1)):
     print("%s:%d个\t"%(lis_str1[i],lis_str.count(lis_str1[i])),end="")
     #统计个数用.count(),参数为要统计的字符串

#优化:
str_data="min is a good man!min is a good man!min is a good man!"
list_str1=str_data.split("!")
#print(list_str1)
str_data2=" ".join(list_str1)
#print(str_data2)
list_str2=str_data2.split()
#print(list_str2)
set_data=set(list_str2)
list_str3=list(set_data)
#print(list_str3)
for i in range(len(list_str3)):
     print("%s:%d个\t"%(list_str3[i],list_str2.count(list_str3[i])),end="")
#遍历列表的方式
for i in list_str3:
     print("%s:%d\t个"%(i,list_str2.count(i)),end="")

第二题:解析歌词
musicLrc = """[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]

思路:
# 1.创建一个空的字典用来保存歌词数据
# 2.将字符串拆分成行
# 3.将一行数据中的 时间key 和 歌词value提取出来
# 4保存到字典中去
# 目的: 将歌词解析出来,用字典来保存, 时间作为key, 歌词作为value

dic_musictxt={} #需要找出 key 和 value 的值,时间作为key和歌词作为value
list_line=music_txt.splitlines()
#print(list_line) 第一次split后,通过行来区分,将所有行的数据以字符串的形式放在一个列表中
for line in list_line:#以行来遍历
     #print(line)
     #print(type(line)) 字符串格式
     line_list=line.split("]") #因为split得到的都是列表,所以命名带list易懂
     #print(line_list,end="") #得到一个列表,['[00:03.50', '传奇']['[00:19.10', '作词:刘兵 作曲:李健']... 里面都是字符串
     value=line_list[-1] #这是为获取后面单独的歌词的值,所以写"-1"
     #print(value,end="")
     #接下来怎么获取到key的值
     for i in range(len(line_list)-1):#range 只需要遍历单项字符串,到歌词前面的数据,所以减一
         #获取时间数据
         #print(line_list[i][1:])
         time_list=line_list[i][1:].split(":")#[1:]这个末尾已经只到时间数字了,再通过":"拆分,来优化时间
         #print(time_list)#['00', '03.50']
         time=float(time_list[0])*60+float(time_list[1])#注意将字符串转换成数值型才能运算
         #print(time)
         key = time #时间就是key
         #接下来就是将数据填充到列表中
         dic_musictxt[key]=value
#print(dic_musictxt)

#排序,因为列表是无序的,将字典中的key全部取出,放在列表中,然后来排序
list_key=[]
for key in dic_musictxt.keys():#遍历字典中key的方法
     list_key.append(key)
#排序,默认是升序
list_key.sort()

#输出格式,按照时间顺序来打印歌词
for key in list_key:
     print("key=%f, value = %s"%(key,dic_musictxt[key]))


#新需求:输入任意一个时间,输出对应时间点的歌词
#思路:0 - 3.5 - 19.1 - 20.6....... 4.5, 20

set_time=float(input("please enter star time:"))
for i in range(len(list_key)):
     if set_time<list_key[i]:#判断它最后小于那个,取前面的一个时间
         cur_time=list_key[i-1]#取前一个时间
         print("当前时间歌词是:%s"%(dic_musictxt[cur_time]))
         break#找到后就跳出当前循环


#新需求:每隔1s打印出当前时间对应的歌词, 1s、2s
import time
set_time=0
while True:
     for i in range(len(list_key)):
         if set_time<list_key[i]:#判断它最后小于那个,取前面的一个时间
             cur_time=list_key[i-1]#取前一个时间
             print("%f :%s"%(set_time,dic_musictxt[cur_time]))
             break
     set_time+=1
     time.sleep(1) #让程序睡一秒
第三题:切片练习

s = "123a4b5c"

#1)通过对s切⽚形成新的字符串s1,s1 = "123"
print(s[:3])

#2)通过对s切⽚形成新的字符串s2,s2 = "a4b"
print(s[3:6])

#3)通过对s切⽚形成新的字符串s3,s3 = "1345"
print(s[::2])

#4)通过对s切⽚形成字符串s4,s4 = "2ab"
print(s[1:7:2])

#5)通过对s切⽚形成字符串s5,s5 = "c"
print(s[-1])

#6)通过对s切⽚形成字符串s6,s6 = "ba2"
print(s[-3::-2])

#第四题,输入一个姓名,判断是否在百家姓中
name=input("please enter a name:").strip()
sum="" #这个要等于空
for c in name:
     sum=sum+c
     if sum in first_names:
         print("find your name")
         break
else: #等所有字符都循环完,才能判断在不在
     print("not find your name")
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值