05. 字符串
一、什么是字符串
字符串用来表示一段文本信息。在 Python 中,字符串需要使用引号引起来,引号可以是单引号,也可以是双引号,但是不要混的用。相同的引号间不能嵌套使用。
s = 'hello'
print(s)
print(type(s))
s = "hello"
print(s)
print(type(s))
如果双引号和单引号混合使用,会报以下错误:
SyntaxError: EOL while scanning string literal
相同的引号之间不能嵌套使用,不同的引号之间可以嵌套使用;
s = "子曰:'学而时习之,不亦说乎'"
单引号和双引号不能跨行使用,如果要换行使用,使用 \ 连接。
s = "锄禾日当午,\
汗滴禾下土。\
谁知盘中餐,\
粒粒皆辛苦。"
print(s)
但是上述程序运行之后,输出结果还是在一行。如果想要换行,并且保留原有的字符串格式,我们可以使用长字符串。长字符串使用三重引号来表示。
s = '''锄禾日当午,
汗滴禾下土。
谁知盘中餐,
粒粒皆辛苦。'''
print(s)
二、转义字符
可以使用 \ 作为转义字符。通过转义字符,可以在字符串中使用一些特性的内容
转义字符 | 说明 |
---|---|
\n | 换行符,将光标位置移到下一行开头 |
\r | 回车符,将光标位置移到本行开头 |
\t | 水平制表符,也即 Tab 键,一般相当于四个空 |
\a | 蜂鸣器响铃 |
\b | 退格(Backspace),将光标位置移到前一列 |
\\ | 反斜线 |
\' | 单引号 |
\" | 双引号 |
\ | 在字符串行尾的续行符,即一行未完,转到下一行继续写 |
\uxxxx | 表示 Unicode 编码 |
s = "子曰:\"学而时习之,不亦说乎\""
print(s)
s = "锄禾日当午,\n\
汗滴禾下土。\n\
谁之盘中餐,\n\
粒粒皆辛苦。"
print(s)
s = '\u2200'
print(s)
三、格式化字符串
【1】、使用 % 占位符格式化字符串
在创建字符串时,可以在字符串中指定占位符;%s 在字符串中表示任意字符串,%f 表示浮点数的占位符,%d 表示整数的占位符。
# %s表示字符串占位符
name = "Sakura"
print("name: %s" %name)
age = 10
# 值按照位置与占位符一一对应
print("name: %s, age: %d" %(name,age))
# 以字典的形式传值,打破位置的直线
info = "name: %(name)s, age: %(age)d" %{'name':'Sakura','age':10}
print(info)
# %m.ns字符串的长度限制在m-n之间
a = "hello %3.5s' %'abcdefg"
print(a)
# %f表示浮点数占位符
# %.nf表示保留n位小数,其余位四舍五入
a = 'result = %.2f' %123.456
print(a)
# %d表示整数占位符,如果是浮点是,直接舍弃小数部分
a = "result = %d" %123.95
print(a)
【2】、使用 format() 方法格式化字符串
我们还可以使用 format() 来进行格式化字符串,该方法是在 Python 2.6 之后的版本引入的。
# 按照位置依次取值
info = "name: {}, age: {}".format("Sakura",10)
print(info)
# 按照位置取值,支持索引
info = "name: {0}, age: {1}".format("Sakura",10)
print(info)
# 打破位置的限制,按照key=value的方式传值
info = "name: {name}, age: {age}".format(name="Sakura",age=10)
print(info)
无论是 % 还是 format(),含有占位符的字符串也是可以被复用的;
info = "name: %s, age: %d"
info1 = info %("Sakura",10)
info2 = info %("Mikoto",14)
print(info1)
print(info2)
info = "name: {}, age: {}"
info1 = info.format("Sakura",10)
info2 = info.format("Mikoto",14)
print(info1)
print(info2)
【3】、f 字符串
在 Python 3.6 之后的版本中,我们可以通过字符串前添加一个 f 来创建一个格式化字符串。在格式化字符串中可以直接嵌入变量。
name = "Sakura"
age = 10
info = f"name: {name}, age: {age}"
print(info)
四、原生字符串
在 Python 中有些字符会有特殊的含义,会进行转义,但是有时候我们不想转义它们,只是想把它们作为普通的字符串打印出来,这是我们可以使用原生字符串,只需在字符串前面加一个 r 即可。
path = r"C:\Program File\navicat\navicat.exe"
print(path)
五、字符串的常见操作
【1】、字符串相加
在 Python 中,字符串支持进行相加操作,即将两个字符串进行拼接,使用加(+)运算符实现。语法格式如下:
first_name = "Sakura"
last_name = "Kinomoto"
name = first_name + " " + last_name
print(name)
【2】、字符串乘法
在 Python 中,使用数字 n 乘以一个字符串会生成一个新的字符串。新字符串的内容为原来字符串被重复 n 次的结果。
names1 = "Sakura "
names2 = names1 * 3
print(names2)
【3】、获取字符串的长度
len(s) # 获取字符串长度
name = "Sakura"
print(len(name))
【4】、大小写转换
str.upper() # 将字符串转换为大写
str.lower() # 将字符串转换为小写
str.capitalize() # 将字符串的首字母大写
str.swapcase() # 将字符串的大小写反转
str.title() # 将字符串中的每个大慈的首字母大写
name = "My name is Sakura Kinomoto"
print("原本的值:",name,end="\n\n")
# 将字符串转为大写,作为结果返回,原字符串不变
result = name.upper()
print("转换为大写后的结果:",result,end="\n\n")
# 将字符串转为小写,作为结果返回,原字符串不变
result = name.lower()
print("转换小写后的结果:",result,end="\n\n")
# 将字符串的首字母大写,作为结果返回,原字符串不变
result = name.capitalize()
print(f"首字母大写后的结果:",result,end="\n\n")
# 将字符串的大小写反转,作为结果返回,原字符串不变
result = name.swapcase()
print("大小写反转的结果:",result,end="\n\n")
# 将字符串的每个单词的首字母大写,作为结果返回,原字符串不变
result = name.title()
print("大小写反转的结果:",result,end="\n\n")
【5】、判断字符串的组成
str.isupper() # 判断字符串是否全为大写
str.islower() # 判断字符串是否全为小写
str.istitle() # 判断字符串中每个单词是否首字母大写
str.isalnum() # 判断字符串是否由字母或数字组成
str.isdecimal() # 判断字符串是否由数字组成
str.isalpha() # 判断字符串是否由字母组成
str.isspace() # 判断字符串是否由空格组成
name = "Sakura Kinomoto"
print("字符串是否全为大写",name.isupper())
print("字符串是否全为大写",name.islower())
print("字符串中每个单词的首字母是否大写",name.title())
print("字符串是否由字母和数字组成",name.isalnum())
print("字符串是否由数字组成",name.isdecimal())
print("字符串是否由字母和数字组成",name.isalpha())
print("字符串是否由空格组成",name.isspace())
【6】、判断字符串是否为数字
str.isdecimal() # 判断字符串是否由数字组成
str.isdigit() # 判断字符串是否为阿拉伯形式的数字
str.isnumeric() # 判断字符串是否为数字
num1 = b"3" # 阿拉伯格式的数字
num2 = "3" # 阿拉伯格式的数字
num3 = "三" # 中文简体数字
num4 = "叁" # 中文繁体数字
num5 = "Ⅲ" # 罗马格式的数字
num6 = "③" # 阿拉伯格式的数字
print("isdecimal()方法判断")
#print(num1,":",num1.isdecimal()) # 无此方法
print(num2,":",num2.isdecimal())
print(num3,":",num3.isdecimal())
print(num4,":",num4.isdecimal())
print(num5,":",num5.isdecimal())
print(num6,":",num6.isdecimal())
print("\nisdigit()方法判断")
print(num1,":",num1.isdigit())
print(num2,":",num2.isdigit())
print(num3,":",num3.isdigit())
print(num4,":",num4.isdigit())
print(num5,":",num5.isdigit())
print(num6,":",num6.isdigit())
print("\nisnumber()方法判断")
#print(num1,":",num1.isnumeric()) # 无此方法
print(num2,":",num2.isnumeric())
print(num3,":",num3.isnumeric())
print(num4,":",num4.isnumeric())
print(num5,":",num5.isnumeric())
print(num6,":",num6.isnumeric())
【7】、判断字符串以什么开头以什么结尾
str.startswith(prefix[, start[, end]]) # 判断字符串是否以什么开头
str.endswith(suffix[, start[, end]]) # 判断字符串是否以什么结尾
text = "中国电信"
# 判断字符串是否以什么开头
if text.startswith("中国"):
print("以中国开头")
else:
print("不是以中国开头")
# 判断字符串是否以什么结尾
if text.endswith("电信"):
print("以电信结尾")
else:
print("不是以电信结尾")
【8】、删除字符串的前缀或后缀
str.removeprefix(prefix, /) # 删除字符串的前缀
str.removesuffix(suffix, /) # 删除字符串的后缀
url = "https://baidu.com"
result = url.removeprefix("https://")
print(result)
result = result.removesuffix(".com")
print(result)
【9】、字符串的替换
str.replace(old, new[, count]) # 替换指定的字符串
text = "中国电信,电信流量卡"
# 字符串的替换
result = text.replace("电信","移动")
print(text)
print(result)
【10】、字符串的切割
str.split(sep=None, maxsplit=- 1) # 以sep字符切割maxsplit次字符串
str.rsplit(sep=None, maxsplit=- 1) # 以sep字符切割maxsplit次字符串,从右边开始切割
str.partition(sep) # 以sep字符切割一次字符串
str.splitlines(keepends=False) # 以换行为切割符,切割字符串
text = "Sakura,10,sakura@petal.com"
# 字符串的切割
data_list = text.split(',')
print(data_list)
# 我们还可以指定最多切割几次
data_list = text.split(',',maxsplit=1)
print(data_list)
# 从右边开始切割
data_list = text.rsplit(',',1)
print(data_list)
# 以指定的字符从分割
data_list = text.partition(",")
print(data_list)
text = """
Hello world!
My name is Sakura!
"""
data_list = text.splitlines()
print(data_list)
【11】、字符串的拼接
str.join(iterable) # 字符串的拼接
# 这是一个列表
name_list = ["Sakura","Mikoto","Shana"]
# 字符串的拼接
str = '/'.join(name_list)
print(str)
【12】、去除字符串的两端的空白
str.strip([chars]) # 去除两端空白
str.lstrip([chars]) # 去除左端空白
str.rstrip([chars]) # 去除右端空白
text = " 中国电信 中国移动 中国联通"
print(text)
# 去掉字符串两端的空白
result = text.strip()
print(result)
# 去掉字符串左边的空白
result = text.lstrip()
print(result)
# 去掉字符串右边的空白
result = text.rstrip()
print(result)
【13】、判断字符串是否包含指定字符串
object.__contains__(self, item) # 判断字符串是否包含指定字符串
text = "中国移动通信"
result = text.__contains__("移动")
print(result)
result = "移动" in text
print(result)
【14】、统计字符串中某个字符串出现的次数
str.count(sub[, start[, end]]) # 统计字符串中某个字符串出现的次数
name = "Sakura"
# 统计a出现的次数
print(name.count('a'))
【15】、查找指定字符串
str.find(sub[, start[, end]]) # 查找指定字符串
str.index(sub[, start[, end]]) # 查找指定字符串第一次出现的索引
name = "Sakura"
print(name.find('a'))
print(name.index('a'))
find() 方法如果没找到则返回 -1;
index() 方法如果找不到,程序会抛出异常:ValueError: substring not found;
【16】、字符串的填充
str.center(width[, fillchar]) # 字符串的填充,只能填充一种字符
str.ljust(width[, fillchar]) # 字符串填充,内容在左边
str.rjust(width[, fillchar]) # 字符串填充,内容在右边
str.zfill(width) # 字符串填充,左边补0
name = "Shana"
# 字符串的填充,只能填充一种字符
print(name.center(20,'*'))
print(name.ljust(20,'*'))
print(name.rjust(20,'*'))
# 字符串填充,左边补0
data = "1001"
print(data.zfill(8))
【17】、字符串转换成字节类型
str.encode(encoding='utf-8', errors='strict') # 字符串转换成字节类型
bytes.decode(encoding='utf-8', errors='strict') # 将字节类型转换为字符串
data = "中国移动"
v1 = data.encode("utf-8")
print(v1)
data = v1.decode("utf-8")
print(data)