前言
字符串是一种表示文本信息的数据类型。在C中我们使用字符数组对其进行表示,并且没有封装其字符串的相关操作;C++中我们有库里面定义的一个自定义类型string能够对字符串类型进行操作。那么,在Python中,我们是如何对字符串这一类型进行操作的呢?
首先,我们需要注意这一点:在 Python 和 Java 等语言中,字符串都被设计成「不可变」的类型,即无法直接修改字符串的某一位字符,需要新建一个字符串实现。
下面就和我一起来了解一下吧~同样的这也是我的一篇学习笔记哦,让我们一起成长吧~
--------------------------------------------------------------------------------------------------------------------------------
目录
字符串查找替换函数:(注意[]表示里面的参数可有可不有(类似于C++中的缺省参数))
一、字符串的表示
首先,我们就要从如何表示字符串开始入手了。
正如之前初识Python那里所说的那样,Python中的字符串有三种表示方法:
'Hello world' 单引号包围的字符串
"Hello world" 双引号包围的字符串
''' 三引号包围的字符串
多行字符串
'''
上面就是字符串的表示方法,里面就可以输入任意字符。虽然是任意,但是当你在里面想输入外面的引号的时候,就会出现问题,并且有时候,也想输入退格符、换行符、换页符等不可见字符的时候,该如何去输入呢?
这个时候就要用到转义字符了。常用的转义字符如下表所示:
转义符 | 含义描述 | 转义符 | 含义描述 |
\(在一行末尾) | Python的续行符 | \n | 换行 |
\\ | 反斜杠符号 | \t | 横向制表符 |
\' | 单引号 | \r | 回车 |
\" | 双引号 | \f | 换页 |
\a | 提示音 | \ooo | 八进制表示ASCII码对应字符 |
\b | 退格 | \xhh | 十六进制表示ASCII码对应字符 |
\0 | 空 | \other | 其他字符以普通格式输出 |
比如利用转移字符中的16进制和8进制表示1这个字符(ASCII码值对应为49)
s = '\61' # 八进制
a = '\x31' # 十六进制
print(s, a)
二、字符串的格式化操作
早在C语言的学习中,我们知道,printf可以进行格式化输出,让输出到控制台上的信息更加可读工整。C语言中使用的就是%操作符进行格式化字符串的。那么Python中格式化字符串是否可以使用%操作符呢?
在Python中,针对字符串的格式化操作有两种:1.第一种就是使用%操作符进行格式化,2.使用str.format()方法进行格式化。
1.使用%操作符格式化字符串
"想输出的字符串格式" % 单个就是对应其变量/多个元素利用元组括起来()(元组里元素的顺序对应输出字符串里%的先后顺序)
想要输出的字符串格式:
%[(name)][flags][width].[precision]typecode 注:[]表示一个部分,真实写的时候不用写
name:可选参数。如果输出对象是字典,那么此时(name)name就是指定输出对应值的那个键
flags:可选参数。对齐方式:
+ 表示右对齐,正数前添加正号,负数前添加负号。
- 表示左对齐,正数前无符号,负数前添加负号。
空格 表示右对齐,正数前添加空格,负数前添加负号。
0 表示右对齐,正数前无符号,负数前添加负号,并且用0填充未填充的地方。
width:可选参数。指定格式字符串的占用宽度。如果目标宽度比设定的大则无视。
precision:可选参数。在小数点后(小数点表示在格式化输出浮点数的时候可带)指定保留几位小数。如果是字符串,那么.后此数字代表从左起截取多少个字符。
typecode:必选参数。指定格式控制符。
格式控制符:
符号 描述 %c 格式化字符 %s 格式化字符串 %d 格式化整数 %f 格式化浮点数 %e 科学计数法浮点数
如上,我们随便举一个测试代码:
s = {'name': "你好"} # 字典,键name 值你好
print("%(name)s" % s) # 单个对象直接使用变量名
a = {'year': 2022, 'c_year': "二零二二年"}
print("%(year)d用汉语来说就是%(c_year)s" % a)
print("%c %+3d %-3d %03d %3.1f %e" % ('a', 2, -1, 2, 1.23, 1.23)) # 用元组形式对多个元素进行格式化输出字符串
2.使用format方法格式化字符串
为了更加方便对字符串进行格式化控制,在Python2.6开始,就对字符串类型增加了一种格式化控制的方法:format。格式为str.format()。此时的str就是一个模板字符串。
format中的参数和对应str的输出位置的对应关系:
在模板字符串里面设定{}为format里参数对应输出的位置。当{}里面没有format中参数的序号的时候(从左到右,从零开始计数),从左到右就依次对应format里参数的左到右顺序(类似于%控制力元组里面的参数对应的位置),但是当{}里面有对应参数序号时,就可以指定对应的位置进行格式化输出。
print("{}!今年是{}!".format(2022, "二零二二年")) # 默认相对位置
print("{1}!今年是{0}!".format("二零二二年", 2022)) # 指定位置
在使用format格式化使用关键字参数的时候,{}占位符里写上"键"即可。
print("{year} {c_year}".format(year=2022, c_year="二零二二")) # 关键字参数,需要在占位符写上对应键
注意想要使用format格式化某个字典类型的键所对应值的时候:
s = {"year": 2022, "c_year": "二零二二"}
print("{} {}".format(s.get('year'), s.get("c_year"))) # 格式化控制字典类型时
使用序列的索引进行参数匹配:当format里的参数时元组或者列表的时候,{}可以凭借其下标进行访问对应的某个位置。
a1 = [1, 2, 3]
a2 = ("Hello", 0, -1)
print("{0[2]} {1[1]} {1[0]}".format(a1, a2)) # 通过列表、元组的下标索引进行访问
模板字符串str中的格式化控制:
{}里面的格式如下:
:[[fill]align][sign][width][,][.precision][type]
:
前面为空则默认按照format中参数的相对顺序进行,否则就是对应的序号。
fill
可选参数。表示未填充的地方所要填充的字符。
align
可选参数。
< 内容左对齐
> 内容右对齐(默认右对齐)
^ 内容居中对齐
sign
可选参数。
+ 在正数前添加正号,负数前加负号
- 在正数前不变,负数前加负号
空格 在正数前加空格,负数前加负号
width
可选参数。指定格式化后的字符串所占宽度。如果目标宽度比设定的大则无视。
,
可选参数。为数字添加千位分隔符。
precision
可选参数。指定小数位后的精度。如果是字符串,那么.后此数字代表从左起截取多少个字符。
type
可选参数。指定格式化类型:
整数常用格式化类型:
b 将10进制转化为2进制表示,然后格式化 c 10进制自动转化为对应的Unicode字符 d 10进制 o 10进制转化为8进制表示,然后格式化 x 10进制转化为16进制表示,然后格式化 X 10进制转化为16进制表示,然后格式化 浮点型常用格式化类型:
e 转化为科学计数法表示,然后格式化 E 转化为科学计数法表示,然后格式化 f 转化为浮点型(默认保留小数点后6位)表示,然后格式化 F 转化为浮点型(默认保留小数点后6位)表示,然后格式化 % 输出浮点数的百分比形式
下面举例使用:
首先是填充按照什么顺序什么宽度排列,是否添加符号。(位置)[[fill]align][sign][width]
print("{:*<+3}\n{:*< 3}".format(3, 23)) # 指定*填充,左对齐,使用+添加符号,占3格 指定*填充,左对齐,使用空格添加符号,占三格 默认format中参数相对顺序
print("{1:*<+3}\n{0:*< 3}".format(3, 23)) # 指定format中参数顺序
# 注意到上面的符号也是属于width占用格子数中
然后就是千位分隔符、小数点后精度 、格式化类型 [,][.precision][type]
三、字符串的操作符
类似于C++中的operator,也就是运算符重载。Python中对字符串提供了一系列的字符串操作符,使字符串更加方便便捷的进行使用。
下面利用a = "Hello", b = "world"进行举例说明:
操作符 | 描述 | 例子 |
+ | 连接字符串 | a+b Helloworld |
* | 重复输出字符串 | a*2 HelloHello |
[i] | 切片操作。输出对应下标字符 | a[0] H |
[b:e] | 切片操作。输出对应[b, e)的子字符串 | a[1:4] ell |
in | 如果字符串包含指定内容,返回True | "he" in a False |
not in | 如果字符串不包含指定内容,返回True | "He" not in a False |
r/R | 返回转义字符的原始字符 | r'\n'=="\\n" 输出\n |
b | 返回二进制字符串。在字符的第一个引号前 | |
% | 格式化操作字符串 |
简单代码进行举例说明:
str1 = "Hello"
print("He" in str1)
print("eH" in str1)
print("he" in str1)
print("He" not in str1)
a = b"abc"
print(a)
print(str1[0]) # H
print(str1[0:2]) # He
print(str1[0]*3) # HHH
print(str1[0] + str1[1]) # He
print("这个是换行符" + r'\n')
四、字符串处理函数
就像C++中对string自定义类型提供的许多成员函数那样,Python中也提供了许多对字符串类型进行操作的处理函数。下面我只是介绍一点点,详细的可以查阅文档哦~
大小写转换函数:
lower() | 大写字符转换为小写字符 |
upper() | 小写字符转换为大写字符 |
capitalize() | 字符串第一个字符转换为大写 |
swapcase() | 英文字符大小写互换 |
字符串查找替换函数:(注意[]表示里面的参数可有可不有(类似于C++中的缺省参数))
find(str[,start[,end]]) | 检测str是否在对应调用字符串的[start, end)内存在,存在返回对应第一个字符的下标,不存在返回-1 |
index(str[,start[,end]]) | 同find功能,只不过找不到报异常 |
rfind(str[,start[,end]]) | 类似于find,只不过从后往前找,找不到返回-1 |
rindex(str[,start[,end]]) | 类似于rfind,只不过找不到报异常 |
replace(old,new[,count]) | 将被调用字符串中的old对应部分替换成new,如果包含count,则替换不超过count次 |
str1 = "Hello"
print(str1.find('o', 0, 4))
# print(str1.index('o', 0, 4)) # 报异常
print(str1.find('o', 0, 5)) # 证明范围为[)
print(str1)
str1 = str1.replace('l', 't', 1) # 把str1中的l替换为t,不超过1次 注意本身不会发生改变,所以需要拷贝赋值,方可展现结果
print(str1)
字符串判断函数:
isalnum() | 至少包含一个字符,均为字母或者数字--返回True |
isalpha() | 至少包含一个字符,均为字母--返回True |
isdigit() | 字符串只包含数字,返回True |
islower() | 字符均为小写,返回True |
isnumeric | 只包含数字字符,返回True |
isspace() | 只包含空白,返回True |
isupper() | 字符均为大写,返回True |
isdecimal() | 字符串只包含十进制字符,返回True |
str1 = "ae"
str2 = "Ae"
print(str1.islower())
print(str2.islower())
str3 = "AS"
str4 = "as"
print(str3.isupper())
print(str4.isupper())
字符串头尾判断函数:
startswith(str[,start[,end]]) | 在被调用字符串的指定[start,end)范围内查看是否以str开头,是就返回True |
endswith(str[,start[,end]]) | 在被调用字符串的指定[start,end)范围内查看是否以str结束,是就返回True |
字符串计算函数:
无需调用字符串(即不需要str.函数,而是函数(str))
len(str) | 返回字符串长度 |
max(str) | 返回字符串中ASCII码值最大的字符 |
min(str) | 返回字符串中ASCII码值最小的字符 |
需要调用字符串
count(str,[,start[,end]]) | 在被调用字符串的[start,end)区域寻找str出现的次数 |
字符串对齐函数:
center(width[,fillchar]) | 返回一个指定宽度为width居中的字符串,以fillchar字符填充没有的元素,默认为空格 |
ljust(width[,fillchar]) | 类似center,只不过进行左对齐 |
rjust(width[,fillchar]) | 类似于center,只不过右对齐 |
str1 = "Yu"
print(str1.center(4, '*'))
print(str1)
字符串拆分合并函数:
split([sep, num]) | 以sep为分隔符分隔被调用字符串,分割限制num个。默认为空格(返回的是一个列表) |
join(seq) | 以被调用字符串作为分隔符,将seq所有元素合并为一个新的字符串(返回一个字符串) |
str1 = "hello world 2022"
print(str1.split(' ', 1)) # 以空格为分隔符,分割一个
print(str1.split(' ')) # 以空格为分割符,不限制分割
s = str1.split(' ') # 返回一个列表
print(s[2])
q = ' ' # 空格字符串
print(q.join(s)) # 以空格为分割符连接s中所有元素
str2 = q.join(s) # 返回一个字符串
print(str2)
删除字符串中空格函数:
lstrip() | 删除字符串左边的空格 |
rstrip() | 删除字符串右边的空格 |
strip([chars]) | 同时执行上面两个函数 |
五、输入输出语句
我们知道,在程序里面少不了的就是输入(Input)输出(Output)语句。目前针对于控制台的输入输出,比如C语言中的printf函数、scanf函数;C++中的cout、cin;Java中的System.out.print()、java.util.Scanner s = new java.util.Scanner(System.in) s.next()...那么在Python中我们常用的输入输出语句该如何去写呢?
1.输入语句input()和转换语句eval()
首先,常规的一个Python输入语句如下:
tmp = eval(input("提示信息"))
input函数会得到键盘输入的信息,并且将提示信息打印在控制台上。得到信息后,会返回字符串信息。如果此时不想得到字符串信息,而是更加具体的信息比如整型类型或者浮点型,那么就可以使用int()或者flaot()函数进行转换为对应类型,当然eval()函数会直接将输入的对象转换为适合的有效类型。
num1 = eval(input())
num2 = eval(input())
print("{} + {} 的值为 {}".format(num1, num2, num1 + num2))
2.输出语句print()
print()前面我们以及用的很多了,但是实际上它是有着4个参数的哦~
print([obj1,...][,sep=' '][,end='\n'][,file=sys.stdout])
所有参数均可省略,省略后出现一个空行
obj:
即输出的对象
sep:
输出对象的分隔符,默认为空格
end:
输出结尾符号,默认为\n
file:
输出到文件,默认到显示器(标准输出)