Day11笔记-字符串

本文详细介绍了Python中字符串的创建、操作、系统功能、转换方法以及实践应用,包括字符串的不可变性、拼接、重复、判断、遍历、转义字符、字符串格式化、查找、填充、提取、替换、编码解码等。此外,还提供了多个实例演示和练习,帮助读者深入理解Python字符串的使用技巧。
摘要由CSDN通过智能技术生成

一、字符串

由若干个字符组成的一个序列被称为字符串,其中的字符可以是字母,数字,符号,中文等

注意:字符串属于不可变的数据类型,可以作为字典的key

1.创建
# 1.' '
str1 = '123abc%$#计算机'
print(str1)

# 2." "
str2 = "123abc%$#计算机"
print(str2)

# 3.""" """ 或 ''' '''
str3 = """123abc%$#计算机"""
print(str3)

# 注意:三引号的特殊之处:内部的内容可以换行,而且可以原样输出
str3 = """123
abc
%$#
计算机"""
print(str3)

# 4.转义字符
# 语法:\x
"""
可以将一个普通字符转换为特殊字符
可以将一个特殊字符转换为普通字符
"""
# a.n---->\n,\n表示换行
s1 = 'hellonworld'
print(s1)
s1 = 'hello\nworld'
print(s1)

# b.t---->\t,\t表示制表符【tab键】
s1 = 'hellotworld'
print(s1)
s1 = 'hello\tworld'
print(s1)

# c."---->\"
s2 = "'hello'"
print(s2)
s2 = '"hello"'
print(s2)

s2 = "\"hello\""
print(s2)
s2 = '\'hello\''
print(s2)

# d.\------>\\
s3 = 'aaa\\bbb\\ccc'
print(s3)

s3 = 'aaa\\bbb\\ccc\\ddd\\kf\\ggg'
print(s3)

# r"":可以将字符串中的特殊字符进行转义,无需手动转义,常用于路径的表示或者正则表达式中
s3 = r'aaa\bbb\ccc\ddd\kf\ggg'
print(s3)
2.操作
# 字符串的使用和列表的使用相似,都是有序的,都有索引
# 1.字符的访问
str1 = 'ghajkghajk'
print(str1[0])
print(str1[-len(str1)])

print(str1[-1])
print(str1[len(str1) - 1])

# 2.+:拼接
s1 = 'abc'
s2 = '123'
print(s1 + s2)

# 3.*:重复
print("#" * 30)
print(s1 * 3)

# 4.in/not in:判断是否存在
print('a' in s1)
print('a' not in s1)

# 5.遍历
data = 'hello'
for ch in data:
    print(ch)

for i in range(len(data)):
    print(data[i])

for i,ch in enumerate(data):
    print(i,ch)
3.系统功能
3.1转换

eval():将str转换为有效的表达式

# 1.eval(str):可以识别一个字符串str中的有效的python语句并执行该语句
# a
s1 = '123'
r1 = eval(s1)
r2 = int(s1)
print(r1,type(r1))
print(r2,type(r2))

# b
s1 = '123.34'
r1 = eval(s1)
r2 = float(s1)
print(r1,type(r1))
print(r2,type(r2))

# c.
eval("print('哈哈哈哈哈哈')")

list1 = [34,65,6,67]
eval('list1.append(88)')
print(list1)

# d.
# 练习1:从控制台输入数学表达式,并计算结果
# data = input("请输入数学表达式:")
# print(f"{data}的运算结果为:{eval(data)}")

# 练习2:从控制台输入5个数,组成一个列表,求平均值
# numlist = eval(input("请输入5个数字的列表:"))
# print(f"平均值:{sum(numlist) / len(numlist)}")

upper():将小写字母转换为大写

lower():大—》小

swapcase():大—》小 小----》大

capitalize():首单词的首字母大写,其他全部小写,英文句子

title():每个单词的首字母大写,其他全部小写

ord(),chr()

# 2.chr()和ord()
"""
chr(num):获取数字num在ASCII表中对应的字符
ord(ch):获取字符ch在ASCII表中对应的十进制数字
"""
print(chr(97))
print(ord('A'))
print(ord('0'))

# 练习:从控制台输入一个小写字母,将其转换为对应的大写字母
ch = input("请输入一个小写字母:")  # e
# 获取小写字母对应的数字
n1 = ord(ch)
print(n1)
# 获取大写字母对应的数字
n2 = n1 - 32
print(n2)
# 获取对应的大写字母
ch1 = chr(n2)
print(ch1)

# 整合
ch = input("请输入一个小写字母:")
# 面试题
print(chr(ord(ch) - 32))
3.2查找

find():从左往右进行检索,返回被查找的子字符串在原字符串中第一次出现的位置,如果查找不到返回-1 ******

rfind():从右往左进行检索

index():从左往右进行检索,返回被查找的子字符串在原字符串中第一次出现的位置,如果查找不到则直接报错 ****

rindex():从右往左进行检索

3.3填充

center(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居中显示 ****

ljust(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居左显示,

rjust(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居右显示,

zfill(width):原字符串居右显示,剩余的字符默认用0填充

"""
center(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居中显示

ljust(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居左显示,

rjust(width[,fillchar]):用fillchar填充指定的字符串,填充之后的长度为width,原字符串居右显示,

zfill(width):原字符串居右显示,剩余的字符默认用0填充
"""

# 1.center():两端使用指定字符填充,原字符串居中显示
# fillchar可以省略,默认使用空格填充
print("hello".center(20))
# fillchar可以自定义,但是,fillchar必须是一个字符
print("hello".center(20,"*"))
# print("hello".center(20,"*****")) # TypeError: The fill character must be exactly one character long

# 2.ljust():右边使用指定字符填充,原字符串居左显示
print("hello".ljust(20))
print("hello".ljust(20,"*"))

# 3.rjust():左边使用指定字符填充,原字符串居右显示
print("hello".rjust(20))
print("hello".rjust(20,"*"))

# 4.zfill():左边使用字符0填充,原字符串居右显示
print("hello".zfill(20))
print("hello".rjust(20,"0"))
3.4提取

strip():去除一个指定字符串中两端指定的子字符 ****

lstrip():去除一个指定字符串中左边指定的子字符

rstrip():去除一个指定字符串中右边指定的子字符

3.5合并和分割

join():使用指定的子字符串将列表中的元素连接【列表-----》字符串】 ****

split():使用指定的子字符串将原字符串进行分割,得到一个列表 【字符串-----》列表】****

3.6替换

replace(old,new):将原字符串中的old替换为new ****

映射替换:

​ maketrans():生成映射表

​ translate():根据映射表将指定字符串中的指定字符替换为映射表中对应的字符

3.7判断

isalpha():一个字符串非空并字符全部是字母才返回True

isalnum():一个字符串非空并字符是字母或者数字才返回True

isupper()/islower()/istitle():和upper,lower,title有关

isdigit()/isdecimal():一个字符串非空并字符全部是数字才返回True ***

startswith();判断一个字符串是否是以指定自字符串开头【前缀】 ***

endswith():判断一个字符串是否是以指定自字符串结尾【后缀】 ****

3.8编码和解码

encode():编码

decode();解码

"""
【面试题】简述字符串的编码和解码
编码:将字符串类型转换为字节类型,实现方式:bytes()或encode()
解码:将字节类型转换为字符串类型,实现方式:str()或decode()

字符串:''   ''   三引号
字节:b''   b""   b三引号

常用的编码格式:
    utf-8
    gbk
"""

# 1.编码
str1 = "3454jgjgj计算机%¥#"
# a.bytes()
r1 = bytes(str1,encoding="utf-8")   # int()/float()/list()....
print(r1)
print(type(r1))

# b.encode()
r2 = str1.encode(encoding="gbk")
print(r2)
print(type(r2))

# 2.解码
# a.str()
# 注意:字符串的编解码的格式一定要保持一致,否则无法操作
s1 = str(r1,encoding="utf-8")
print(s1)
print(type(s1))

# b.decode()
s2 = r2.decode(encoding="gbk")  # r2.decode("gbk")
print(s2)
print(type(s2))


# 使用场景:文件读写和爬虫
3.9格式化

占位符

format()

f""

# 1.占位符             ******
"""
%d:可以匹配数字,一般匹配整型【整数】
%f:可以匹配数字,一般匹配浮点型【小数】
%s:可以匹配Python中的一切数据类型
"""
# 语法:"使用占位符设置格式" % (实际的数据)
# 作用:使用实际的数据将占位符占用的位置进行填充
print(13,'abc')
print('年龄:%d,爱好:%s' % (10,'篮球'))

# 注意1:实际数据的数量和占位符的数量需要完全一致
# print('年龄:%d,爱好:%s' % (10))  # TypeError: not enough arguments for format string

# 注意2:从前往后进行一一匹配,实际数据的类型和占位符的类型要匹配
# print('年龄:%d,爱好:%s' % ('篮球',10)) # TypeError: %d format: a number is required, not str

print('年龄:%s,爱好:%s' % (10,'篮球'))

# 注意3:%d匹配到浮点数会自动取整,%f匹配到整型会自动转换为浮点型
print('年龄:%d,爱好:%s,体重:%f' % (10.85,'篮球',55))

# 注意4:%.nd,n表示整数显示的位数,不够的话在原数字的前面补0
# %.nf,n表示保留小数点后n位   *****
print('年龄:%.5d,爱好:%s,体重:%.2f' % (10,'篮球',55.2463563234))
# print('年龄:%s,爱好:%s,体重:%s' % (10.85,'篮球',55.2463563234))

# 2.format()
# 注意1:format和占位符相比,优点:不需要考虑类型的问题
print('年龄:{},爱好:{}'.format(10,'篮球'))

# 注意2:format和占位符相比,优点:也可以不需要考虑数量的问题
print('名次:{},年龄:{},爱好:{}'.format(10,10,'篮球'))   # 默认,数量一致
print('名次:{0},年龄:{0},爱好:{0}'.format(10,'篮球'))   # 同一个数据可以重复使用

# 注意3:format也可以限制类型,{编号:s},s表示字符串类型,f表示浮点型,d表示整型,
# 默认保留小数点后6位
print('年龄:{0},爱好:{1},体重:{2:f}'.format(10,'篮球',55.6347))

# 3.f"",推荐          *******
print(f'年龄:{10},爱好:{"篮球"}')
print(f'年龄:{10},爱好:{"篮球"},体重:{55.6347}')

# 练习:
name = input("请输入你的姓名:")
age = input("请输入你的年龄:")
hobby = input("请输入你的爱好:")
print("大家好,我是%s,今年%s岁,爱好%s,还有%d年退休。" % (name,age,hobby,60 - int(age)))
print("大家好,我是{},今年{}岁,爱好{},还有{}年退休。".format(name,age,hobby,60 - int(age)))
print(f"大家好,我是{name},今年{age}岁,爱好{hobby},还有{60 - int(age)}年退休。")
4.练习一
# 注意:字符串是不可变的数据类型,所以但凡涉及到字符串的更改,都是生成了一个新的字符串

# 1.写代码,有如下变量,请按照要求实现每个功能
name = "gouguoQ "

# a.移除name变量对应值的两边的空格,并输出移除后的内容
"""
strip():去除一个指定字符串中两端指定的子字符       ******
lstrip():去除一个指定字符串中左边指定的子字符
rstrip():去除一个指定字符串中右边指定的子字符
"""
# 注意1:默认都是去除字符串两头的空格
name = "      gouguoQ  "
print(name)
a1 = name.strip()
print(a1)
# 注意2:如果指定需要去除的字符,则会查找去除
name = "*******gouguoQ***"
print(name)
a2 = name.strip('*')
print(a2)

a2 = name.lstrip('*')
print(a2)
a2 = name.rstrip('*')
print(a2)

# b.判断name变量对应的值是否以"go"开头,并输出结果
# c.判断name变量对应的值是否以"Q"结尾,并输出结果
"""
startswith();判断一个字符串是否是以指定自字符串开头【前缀】  ***
endswith():判断一个字符串是否是以指定自字符串结尾【后缀】  
"""
name = "gouguoQ "
b = name.startswith('go')
print(b)
c = name.endswith('Q')
print(c)

# d.将name变量对应的值中的"o",替换为"p",并输出结果
"""
replace(old,new):将原字符串中的old替换为new			
映射替换:
	maketrans():生成映射表
	translate():根据映射表将指定字符串中的指定字符替换为映射表中对应的字符
"""
name = "gouguogougouQ "

# 注意1:默认会全部替换
d1 = name.replace('o','p')
print(d1)
# 注意2:可以控制替换的次数
d1 = name.replace('o','p',2)
print(d1)
# 注意3:映射替换,生成映射表的时候,给定的字符串的长度必须相等,可以用于简单的加密
str1 = '65178561089'
table = str.maketrans('012345','abcdef')   # 生成映射表
print(table)
d2 = str1.translate(table)      # 根据映射表完成替换操作
print(d2)

t = str.maketrans('o','p')
d3 = name.translate(t)
print(d3)

# g.将name变量对应的值变大写,并输出结果
# h.将name变量对应的值变成小写,并输出结果
"""
upper():将小写字母转换为大写
lower():大---》小
swapcase():大---》小  小----》大
capitalize():首单词的首字母大写,其他全部小写,英文句子
title():每个单词的首字母大写,其他全部小写
"""
data = 'tHis is A Text'
print(data.upper())
print(data.lower())
print(data.swapcase())
print(data.capitalize())
print(data.title())

# e.将name变量对应的值根据"o"分割,并输出结果
"""
split():使用指定的子字符串将原字符串进行分割,得到一个列表  【字符串-----》列表】
"""
name = "gouguogougouQ "
# 注意1:默认会全部分割
e1 = name.split('o')
print(e1)

# 注意2:可以控制分割的次数
e1 = name.split('o',2)
print(e1)

# n.利用下划线将列表li = ['gou', 'guo', 'qi']的每一个元素拼接成字符串gou_guo_qi
"""
join():使用指定的子字符串将列表中的元素连接【列表-----》字符串】		
"""
li = ['gou', 'guo', 'qi']
n = "_".join(li)
print(n)


name = "gouguoQ"
# i.请输出name变量对应的值的第二个字符
print(name[1])

# j.请输出name变量对应的值的前三个字符
print(name[:3])

# k.请输出name变量对应值的后2个字符
print(name[-2:])
print(name[len(name) - 2:])

# m.获取子序列,仅不包含最后一个字符,如:woaini则获取woain  root则获取roo
print(name[:-1])

# l.请输出name变量中的值"Q的索引的位置
"""
find():从左往右进行检索,返回被查找的子字符串在原字符串中第一次出现的位置,如果查找不到返回-1		****		**
rfind():从右往左进行检索
index():从左往右进行检索,返回被查找的子字符串在原字符串中第一次出现的位置,如果查找不到则直接报错		
rindex():从右往左进行检索
"""
name = "gouguoQabcQ123Q"
print(len(name))

# 注意1:如果子字符串存在的前提下,find和index使用相同,都是返回子字符串在原字符串中从左往右第一次出现的索引
print(name.find('Q'))
print(name.index('Q'))

# 注意2:如果子字符串不存在的前提下,find返回-1,index直接报错
print(name.find('X'))   # -1
# print(name.index('X'))  # ValueError: substring子字符串 not found

# 注意3:如果子字符串存在的前提下,rfind和rindex使用相同,都是返回子字符串在原字符串中从右往左第一次出现的索引
# 说明:此时的索引还是原字符串中的索引
print(name.rfind('Q'))   # 14
print(name.rindex('Q'))  # 14

# 注意4:默认情况下,全局查找,但是,可以指定查找的范围【区间】,仍然是前闭后开区间
# 说明:此时的索引还是原字符串中的索引
print(name.find('Q',6,8))  # 6
print(name.index('Q',6,8))  # 6

print(name.find('Q',7,10))  # -1

# 【面试题】代码阅读题
# 1
data = 'abc'
data.upper()
print(data)  # abc

# 2
data = 'abc'
data = data.upper()
print(data)  # ABC
5.练习二
# 2.已知字符串 a = "aAsmr3idd4bgs7Dlsf9eAF",要求如下
a = "aAsmr3idd4bgs7Dlsf9eAF"
# a.请将a字符串的大写改为小写,小写改为大写
a1 = a.swapcase()
print(a1)

# b.请将a字符串的数字取出,并输出成一个新的字符串
"""
isdigit()/isdecimal():一个字符串非空并字符全部是数字才返回True   ***
"""
b = ""
for ch in a:
    if ch.isdigit():
        b += ch
print(b)

# c.请统计a字符串出现的每个字符的出现次数(忽略大小写,a与A是同一个字母),并输出成一个字典。
# 例 {'a':4,'b':2}
# 方式一
count_dict = {}
c = a.lower()
for ch in c:
    if ch not in count_dict:
        count_dict[ch] = 1    # 添加键值对
    else:
        count_dict[ch] += 1   # 修改指定键对应的值
print(count_dict)

# 方式二
count_dict = {}
c1 = a.lower()
for ch in c1:
    count_dict[ch] = c1.count(ch)
print(count_dict)

# d.输出a字符串出现频率最高的字母
count_dict = {}
for ch in a:
    count_dict[ch] = c1.count(ch)
print(count_dict)

max_count = max(count_dict.values())
print(max_count)

for key,value in count_dict.items():
    if value == max_count:
        print(key)

# e.请判断 'boy'里出现的每一个字母,是否都出现在a字符串里。如果出现,则输出True,否则,则输出False
# 方式一:统计个数
a = 'abc23647ofhajyfh'
substr = 'boy'
count = 0
for ch in substr:
    if ch in a:
        count += 1
if count == len(substr):
    print(True)
else:
    print(False)

# 方式二:使用集合的去重性
a = 'abc27fhoafh'
substr = 'boy'
s1 = set(a)
s1.update(substr)
if len(s1) == len(set(a)):
    print(True)
else:
    print(False)
6.练习三
# 3.统计用户输入的内容中有几个数字,几个字母?
"""
isalpha():一个字符串非空并字符全部是字母才返回True,不推荐使用
isalnum():一个字符串非空并字符是字母或者数字才返回True,不推荐使用
isdigit()/isdecimal():一个字符串非空并字符全部是数字才返回True   ***
"""
# 不严谨的写法
"""
问题:
    isalpha和isalnum:工作原理依据的是ASCII码,但是,在使用的过程中,可以识别除了ASCII码表外的中文
    在实际开发中,不建议使用这两个功能
"""
# content = input("请输入内容:")
# digits_count = 0
# letters_count = 0
# for ch in content:
#     if ch.isalpha():
#         letters_count += 1
#     elif ch.isdigit():
#         digits_count += 1
# print(f"用户输入的内容中有{digits_count}个数字,{letters_count}个字母")

# 正确写法:
# 方式一
# content = input("请输入内容:")
# digits_count = 0
# letters_count = 0
# for ch in content:
#     if 'a' <= ch <= 'z' or 'A' <= ch <= 'Z':
#         letters_count += 1
#     elif ch.isdigit():
#         digits_count += 1
# print(f"用户输入的内容中有{digits_count}个数字,{letters_count}个字母")

# 方式二
import string
# print(string.ascii_letters)
# print(string.ascii_lowercase)
# print(string.ascii_uppercase)
# content = input("请输入内容:")
# digits_count = 0
# letters_count = 0
# for ch in content:
#     if ch in string.ascii_letters:
#         letters_count += 1
#     elif ch.isdigit():
#         digits_count += 1
# print(f"用户输入的内容中有{digits_count}个数字,{letters_count}个字母")
#

# 4.编写敏感词语过滤程序,提示用户输入内容,如果用户输入的内容中包含特殊的字符,
# 如山寨 水货,则将内容替换为*****
data = input("请输入内容:")
words = ['山寨','水货','草','大傻逼']
for word in words:
    if data.find(word) != -1:   # word in data
        data = data.replace(word,"*" * len(word))
print(data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值