字符串类型
Python中字符串类型是str,由字符组成的一串字符序列称为“字符串”,字符串是有顺序的,从左到右,索引从0开始递增。
字符串表示方式
- 普通字符串:采用单引号“ ' ”或双引号“ " ”包裹起来的字符串。
- 原始字符串:在普通字符串前加r,字符串中的特殊字符不需要转义,按照字符串的本来“面目”呈现。
- 长字符串:字符串中包含了换行缩进等排版字符,可以使用三重单引号“ ''' ”或三重双引号“ """ ”包裹起来。
常用的转义字符
字符表示 | unicode编码 | 说 明 |
---|---|---|
\t | \u0009 | 水平制表符 |
\n | \u000a | 换行 |
\r | \u000d | 回车 |
\" | \u0022 | 双引号 |
\' | \u0027 | 单引号 |
\\ | \u005c | 反斜线 |
输入下面代码:
s = 'one\ttwo\tthree'
print(s)
print("分割线-----------")
s1 = 'Hello\npython'
print(s1)
print("分割线-----------")
s2 = 'Hello\rpython'
print(s2)
print("分割线-----------")
s3 = 'Hello\'python'
print(s3)
代码运行结果如下:
字符串中的单引号和双引号也可以不用转义符,只需要在包含单引号的字符串中使用双引号,在包含双引号的字符串中使用单引号即可。
输入下面代码:
s = "hello 'python'"
print(s) #不用转义符实现单引号
s = r'hello\tpython'
print(s) #原始字符串使用示例
s = '''one
two
three
'''
print(s) #长字符串使用示例
代码运行结果如下图:
字符串格式化
在实际编程中,经常会遇到将其他类型变量与字符串拼接到一起并进行格式化输出的情况。
字符串格式化方法一:采用占位符,常用的占位符有 %s:字符串格式;%d:十进制格式;%f:浮点数格式。
示例代码如下
name = '张三'
age =18
print('%s'%name,'age:%s'%age)
name = '@邂逅自己'
age = 18
score = 100
print('姓名:%s,年龄:%d,分数:%.2f' %(name,age,score)) # .2f表示保留2位小数
代码运行结果
张三 age:18
姓名:@邂逅自己,年龄:18,分数:100.00
Process finished with exit code 0
方法二:采用 formatted 字符串,该字符串是带有'f'字符前缀的字符串,可以很方便的格式化字符串。
示例代码如下
name = '张三'
age =18
score = 100
print(f'name:{name}\tage:{age}\tscore:{score}')
language = ['Java','Python','C']
print(f'常用的编程语言有:{language[0],language[1],language[2]}')
代码运行结果
name:张三 age:18 score:100
常用的编程语言有:('Java', 'Python', 'C')
Process finished with exit code 0
详细格式
此外,formatted字符串还支持其他功能,可以添加等号,指定输出格式等。
: | 填充 | 对齐方式 | 宽度 | , | .精度 | 类型 |
---|---|---|---|---|---|---|
引导符号 | 用于填充单个字符 | <左对齐 >右对齐 ^居中对齐 | 字符串的输出宽度 | 数字的千位分隔符(只适用于整数和浮点数) | 浮点数小数部分的精度或字符串的最大输出长度 | 整数类型:b\d\o\x\X 浮点数类型:e\E\f\% |
示例代码如下
# 格式化字符串中可以在字符串中嵌入Python表达式
a = 10
b = 20
print(f'a和b的分数总和为:{a+b},分数的三倍为:{3*(a+b)}')
print('-'*50)
# 使用=
print(f'a和b的分数总和为:{a+b=},分数的三倍为:{3*(a+b)=}')
print('-'*50)
# 指定格式输出:居中,其中30表示显示的宽度为30,*表示不足的用其来填充
user = 'CSDN@邂逅自己'
print(f'{user:*^30}')
# 指定格式输出:右对齐
print(f'{user:*>30}')
# 指定格式输出:左对齐
print(f'{user:*<30}')
print('-'*50)
# 指定输出结果为2位小数且为百分数
pct = 0.666
print(f'{pct*100:.2f}%')
# 采用千位分隔符
print('{0:,}'.format(987654321))
print('{0:,}'.format(98236393.0983764))
# 分别指定数字输出格式为二进制、八进制、十进制和十六进制(可以用x或X)
a = 455
print('455的二进制:{0:b},455的八进制:{1:o},455的十进制{2:d},455的十六进制:{3:x}'.format(455,455,455,455))
代码运行结果
a和b的分数总和为:30,分数的三倍为:90
--------------------------------------------------
a和b的分数总和为:a+b=30,分数的三倍为:3*(a+b)=90
--------------------------------------------------
**********CSDN@邂逅自己***********
*********************CSDN@邂逅自己
CSDN@邂逅自己*********************
--------------------------------------------------
66.60%
987,654,321
98,236,393.0983764
455的二进制:111000111,455的八进制:707,455的十进制455,455的十六进制:1c7
Process finished with exit code 0
方法三:采用format
字符串中可以有占位符({ }表示的内容),配合format()方法的使用,会将format()方法中的参数替换为占位符内容。占位符可以用参数索引表示,即0代表第1个参数,以此类推。占位符也可以用参数的名字表示占位符。(在格式化字符串时,如果只有一个参数,占位符索引可以忽略)
输入下面代码
name = 'Tom'
age = 26
s = '{0}的年龄为{1}'.format(name,age)
print(s)
s = '{a}芳龄为{b}岁'.format(a=name,b=age)
print(s)
结果如下图:
格式化控制符
占位符中还可以有格式化控制符,对字符串的格式进行更加精准控制。不同数据类型在进行格式化时需要不同占位符。
控制符 | 说 明 |
---|---|
s | 字符串格式化 |
d | 十进制整数 |
f、F | 十进制浮点数 |
g、G | 十进制整数或浮点数 |
e、E | 科学计数法表示浮点数 |
o | 八进制整数,符号是小写英文字母o |
x、X | 十六进制整数,x是小写字母,X是大写字母 |
输入下面代码:
name = 'Tom'
age = 26
money = 1234.5678
s = '{0}的年龄为{1:5d}'.format(name,age) #1:5d表示参数为1(第二个参数)格式为十进制整数,且输出长度为5的字符串
print(s) #不足的用空格来替代,如本条语句会有3个空格
s = '{0}的年龄为{1:5d}'.format(name,age)
print(s)
s = '{0}的薪资为{1:.2f}'.format(name,money) #.2f表示保留2位小数
print(s)
s = '{0}的薪资为{1:10.2f}'.format(name,money) #10.2f表示保留2位小数,且长度为10
print(s)
s = '十进制数{0:d}的八进制表示为{0:o},十六进制表示为{0:x}'.format(28)
print(s)
代码结果如下:
Tom的年龄为 26
Tom的年龄为 26
Tom的薪资为1234.57
Tom的薪资为 1234.57
十进制数28的八进制表示为34,十六进制表示为1c
Process finished with exit code 0
字符串查找
字符串类中提供了find和rfind方法用于查找字符串,返回值为查找到的子字符串所在的位置,没有找到就返回-1。
str.find(str,start,end):str是要查找的子字符串,start是开始索引,end是结束索引,这两个参数都可以省略,如果省略start说明查找字符串从头开始,如果省略end说明查找到字符串末尾,如果全部省略就是查找全部字符串。
str.rfind(str,start,end)与上面类似,唯一不同的是如果找到返回最右端位置的索引。
len(str):该方法可以返回字符串的长度,其中str为输入的字符串。
字符串与数字互相转换
(1)字符串转化为数字可以使用int()和float()函数实现,该方法接收的字符串参数如果能成功转换为数字,则返回数字,否则引发异常。int函数也可以指定基数(进制)。
如下面代码
int('AB',16) #结果为171
(2)数字转换为字符串
除了上面的字符串格式化可以实现外,也可以通过str()函数实现,str函数什么类型都可以转换,缺点是不能格式化。
字符串的切片操作
对字符串中某个子串或区间的检索称为切片。
基本语法格式如下
[n:m]
其中n和m为索引,必须是有效索引的范围,即从-n~-1或0~n-1(其中n为字符串的长度);且n:m代表从索引n到索引m中不包括m的字符。若[:m]意为从0到m的索引区间;若改为[:]意为从0到n-1,即整个字符串。
示例代码如下
x = 'Hello,World'
# 显然索引5处为逗号,但是进行切片操作时使用该语法不包括索引5
print(x[0:5])
print(x[:5])
print(x[:])
代码运行结果
Hello
Hello
Hello,World
Process finished with exit code 0
字符串常用的方法
方法名 | 描述 |
---|---|
str.lower() | 把str字符串全部转为小写字母,结果为一个新的字符串 |
str.upper() | 把str字符串全部转为大写字母,结果为一个新的字符串 |
str.split(sep=None) | 把str字符串安装指定的分隔符sep进行分隔,结果为列表类型 |
str.count(sub) | 结果为sub这个字符串在str中出现的次数 |
str.find(sub) | 查询sub这个字符串在str中是否存在,如果不存在结果为-1,如果存在,结果为sub首次出现的索引 |
str.index(sub) | 功能与find()相同,区别在于要查询的子串不存在时,程序报错 |
str.startswith(s) | 查询字符串str是否以子串s开头 |
str.endswith(x) | 查询字符串str是否以子串s结尾 |
str.removeprefix() | 如果str以它开头的话,将会返回一个修改过前缀的新字符串,否则它将返回一个原始字符串(严格区分大小写) |
str.removesuffix() | 如果str字符串以其结尾,则返回带有修改过后缀的新字符串,否则它将返回一个原始字符串(严格区分大小写) |
str.replace(old,news[,count]) | 使用news替换字符串中所有的old字符串,结果是一个新字符串,count代表替换的次数(不加次数时默认是全部替换) |
str.center(width,fillchar) | 字符串str在指定的宽度范围内居中,可以使用fillchar进行填充(对于不足的用其来填充) |
str.join(iter) | 在iter中的每个元素的后面都增加一个新字符串str |
str.strip(chars) | 从字符串中去掉左侧和右侧chars中列出的字符串,该字符的顺序并不会影响要去除的结果 |
str.lstrip(chars) | 从字符串中去掉左侧chars中列出的字符串 |
str.rstrip(chars) | 从字符串中去掉右侧chars中列出的字符串 |
示例代码如下
s1 = 'HelloWorld'
s11 = 'CSDN@邂逅自己'
# 全部转为小写
s2 = s1.lower()
print(s2)
# 全部转为大写
s3 = s1.upper()
print(s3)
# 使用指定的字符串进行分隔,结果为列表
s4 = s11.split('@')
print('平台为:',s4[0],'作者为:',s4[1])
# 使用count统计子字符串出现的次数
print('统计l出现的次数:',s1.count('l'))
print('统计H出现的次数:',s1.count('H'))
# 使用find方法进行查找
s5 = s1.find('o')
# 当找不到时不会报错,此时s6=-1
s6 = s1.find('s')
print(s5,s6)
s7 = s1.index('o')
# 使用index时,若找不到会报错
print(s7)
s8 = s1.startswith('Hello')
s9 = s1.startswith('hello')
s10 = s1.endswith('World')
s11 = s1.endswith('world')
print(s8,s9,s10,s11)
info = 'ABCDEFG'
# 当前缀不符合时
print(info.removeprefix('B'))
# 当前缀符合条件时
print(info.removeprefix('AB'))
# 当后缀符合条件时
print(info.removesuffix('FG'))
# 当后缀不符合时
print(info.removesuffix('F'))
a1 = 'HelloWorld'
print('-'*20,'字符串的替换','-'*20)
a2 = a1.replace('o','oo')
print(a2)
# 只替换一次
a3 = a1.replace('o','oo',1)
print(a3)
print('-'*20,'字符串在指定宽度范围居中','-'*20)
# 不设置字符填充
print(a1.center(20))
# 设置字符填充
print(a1.center(20,'-'))
print('-'*20,'去掉字符串左右的空格','-'*20)
a11 = ' Hello World '
a12 = '---CSDN@邂逅自己---'
print(a11.strip())
# 去掉左侧的
print(a11.lstrip())
# 去掉右侧的
print(a11.rstrip())
print(a12.strip('---')) # -和---的结果也是一样的
# 同理,也可以值=只去掉左侧和右侧的字符串
print(a12.lstrip('-'))
print(a12.rstrip('-'))
a13 = '12CSDN@邂逅自己'
print(a13.strip('21')) # 此时12和21的顺序并不会影响结果
代码运行结果
helloworld
HELLOWORLD
平台为: CSDN 作者为: 邂逅自己
统计l出现的次数: 3
统计H出现的次数: 1
4 -1
4
True False True False
ABCDEFG
CDEFG
ABCDE
ABCDEFG
-------------------- 字符串的替换 --------------------
HellooWoorld
HellooWorld
-------------------- 字符串在指定宽度范围居中 --------------------
HelloWorld
-----HelloWorld-----
-------------------- 去掉字符串左右的空格 --------------------
Hello World
Hello World
Hello World
CSDN@邂逅自己
CSDN@邂逅自己---
---CSDN@邂逅自己
CSDN@邂逅自己
Process finished with exit code 0
字符串的编码和解码
实际上,两台计算机之间数据进行传输的时候传输的是二进制数据。
字符串的编码
将str类型转换为bytes类型,需要使用到字符串的encode()方法
语法格式如下:
str.encode(encoding='utf-8',erros='strict/ignore/replace')
其中errors表示遇到错误的处理方案:
strict表示严格处理,即直接报错;ignore表示忽略;
replace表示替换,对于无法进行编码的字符会用?来进行替换
字符串的解码
将bytes类型转换成str类型,需要使用到bytes类型的decode()方法
语法格式如下:
bytes.decode(encoding='utf-8',erros='strict/ignore/replace')
其中errors表示遇到错误的处理方案:
strict表示严格处理,即直接报错;ignore表示忽略;
replace表示替换,对于无法进行编码的字符会用?来进行替换
需要注意的是编码和解码格式必须一一对应。
示例代码如下
str1 = '中国梦:实现中华民族伟大复习'
bytes1 = str1.encode(errors='replace') # 当不设置编码时,默认采用utf-8编码
print(bytes1)
bytes2 = str1.encode(encoding='GBK') # 此处采用gbk进行编码
print(bytes2)
str2 = bytes1.decode(encoding='utf-8')
str3 = bytes2.decode(encoding='GBK')
print(str2+'\n'+str3)
代码运行结果
b'\xe4\xb8\xad\xe5\x9b\xbd\xe6\xa2\xa6\xef\xbc\x9a\xe5\xae\x9e\xe7\x8e\xb0\xe4\xb8\xad\xe5\x8d\x8e\xe6\xb0\x91\xe6\x97\x8f\xe4\xbc\x9f\xe5\xa4\xa7\xe5\xa4\x8d\xe4\xb9\xa0'
b'\xd6\xd0\xb9\xfa\xc3\xce\xa3\xba\xca\xb5\xcf\xd6\xd6\xd0\xbb\xaa\xc3\xf1\xd7\xe5\xce\xb0\xb4\xf3\xb8\xb4\xcf\xb0'
中国梦:实现中华民族伟大复习
中国梦:实现中华民族伟大复习
Process finished with exit code 0
数据验证
数据的验证是指程序对用户输入的数据进行“合法”性验证
方法名 | 说明 |
---|---|
str.isdigit() | 所有字符都是数字(只能识别十进制的阿拉伯数字且小数不可以) |
str.isnumeric() | 所有字符都是数字(可以识别阿拉伯数字、罗马数字和中文数字,包括人民币大写的“壹贰叁肆伍陆”) |
str.isalpha() | 所有字符都是字母(包含中文字符) |
str.isalnum() | 所有字符都是数字或字母(包含中文字符) |
str.islower() | 所有字符都是小写 |
str.isupper() | 所有字符都是大写 |
str.istitle() | 所有字符都是首字母大写 |
str.isspace() | 所有字符都是空白字符(\n、\t等) |
示例代码如下
print('985'.isdigit()) # True
print('一二三四'.isdigit()) # False
print('985.211'.isdigit()) # False
print('985'.isnumeric()) # True
print('一二三四'.isnumeric()) # True
print('985.211'.isnumeric()) # False
print('-'*50)
print('Hello你好'.isalpha()) # True
print('Hello你好985'.isalpha()) # False
print('Hello你好九八五'.isalpha()) # True
print('-'*50)
print('Hello你好'.isalnum()) # True
print('Hello你好985'.isalnum()) # True
print('Hello你好九八五'.isalnum()) # True
print('-'*50) # 此处可以看到当输入中文时,会被判断为既是小写也是大写
print('HelloWorld'.islower()) # False
print('helloworld'.islower()) # True
print('hello你好'.islower()) # True
print('HelloWorld'.isupper()) # False
print('HELLOWORLD'.isupper()) # True
print('HELLO你好'.isupper()) # True
print('-'*50)
print('Hello'.istitle()) # True
print('HelloWorld'.istitle()) # False
print('Helloworld'.istitle()) # True
print('Hello World'.istitle()) # True
print('Hello world'.istitle()) # False
print('-'*50)
print('\t'.isspace()) # True
print('\n'.isspace()) # True
print(' '.isspace()) # True
字符串的拼接操作
(1)使用“+”号进行拼接
(2)使用str.join()方法进行拼接
(3)使用格式化字符串进行拼接
(4)直接拼接,只要程序不报错就可以
示例代码如下
s1 = 'hello'
s2 = 'world'
# 此处为使用+
print(s1+s2)
print('-'*20)
# 此处为使用join
print(''.join([s1,s2]))
print('---'.join([s1,s2,'Java','C','C++','C#','PHP']))
print('-'*20)
# 此处为直接拼接
print('hello''world')
print('-'*20)
# 此处为使用格式化字符串
print('%s%s'%(s1,s2))
print(f'{s1}{s2}')
print('{0}{1}'.format(s1,s2))
代码运行结果
helloworld
--------------------
helloworld
hello---world---Java---C---C++---C#---PHP
--------------------
helloworld
--------------------
helloworld
helloworld
helloworld
Process finished with exit code 0
字符串的去重操作
(1)使用循环
(2)使用索引+not in
(3)通过集合去重+列表排序
示例代码如下
s = 'helloworldhelloworld'
s1 =''
for i in s:
if i not in s1:
s1 += i
print(s1)
print('-'*20)
s2 = ''
for i in range(len(s)):
if s[i] not in s2:
s2 += s[i]
print(s2)
print('-'*20)
s3 = set(s) # 通过集合的无序操作进行筛选
list1 = list(s3) # 再将集合转换为列表,此时列表为无序状态
list1.sort(key=s.index) # 再使用列表的排序进行排序
print(''.join(list1)) # 最后将列表转化为字符串即可
代码运行结果
helowrd
--------------------
helowrd
--------------------
helowrd
Process finished with exit code 0
如果想要系统的学习Python知识,可以点开我的主页,点击专栏“Python零基础从入门到实战”进行学习。
最后,文章创作不易(本文前后经过多次修改,从最初的几千字到现在近万字,只为了给大家最好的学习教程),如果觉得文章对大家有帮助的话,还请点赞+关注;如果有能力的话,也可以打赏一下喔,谢谢大家!!!