0


第19讲:Python中的字符串的创建、特殊字符穿、转义字符串、字符串运算、跨多行展示、字符串索引、反转与排序

文章目录

1.什么是字符串

字符串指的是一种文本内容,字符串由一系列有序的字符组成,汉字、字母、数字、字母数字都属于字符串,在Python中字符串和列表、元组一样,在字符串中的每个字符都相当于一个元素,有对应的索引。

在Python中可以将字符串看做是字符的一种列表,列表的操作对于字符串来说都是适用的。

在Python中没有单独的字符串类型,字符就是只包含一个元素的字符串,例如"a"、“b”、“c”

2.字符串的创建

字符串的创建有两种方式:

  • 使用引号创建字符串 - 创建字符串时可以使用单引号,也可以使用双引号,通常会使用单引号创建字符串,看个人的习惯。- 当把一个字符串赋值给变量时,变量名不要取名为str,str是字符串对应的类名。
  • 调用内置函数str()创建字符串 - 使用内置函数str()创建字符串的场景不多,除非是将其他类型的数据转换成字符串类型时,才会使用。

在Pycharm这种集成开发环境中,创建一个字符串并打印后,其实看不出来他是否是一个字符串类型的数据,我们可以在Python的交互式命令行中创建字符串,在交互式命令行创建完的字符串打印后,会对字符串使用单引号引起来,一眼就知道这是一个字符串类型的数据,如下图所示。

image-20220731220644858

2.1.使用引号定义字符串

以下操作均在python交互式命令行中操作,主要是为了展现字符串类型的特点(打印字符串时带引号)。

注意:在python交互式命令行中将字符串赋值给变量,如果使用print函数打印变量,则也返回不带引号的字符串,也看不出来明显的区别,我们可以直接在命令行中执行字符串变量的变量名,此时如果变量对象为字符串类型,则会返回一个带单引号的字符串。

1)使用单引号定义字符串

>>> mystr ='jiangxl'>>> mystr
'jiangxl'

2)使用双引号定义字符串

>>> mystr ="jiangxl">>> mystr
'jiangxl'

无论使用单引号还是双引号,定义的字符串,返回时都是带单引号的。

3)使用引号定义一个空字符串

定义空字符串时,引号中不得有任何字符。

>>>''''>>>""''

4)在单引号中可以使用双引号,在双引号中也可以使用单引号

#在单引号中可以使用双引号>>>'abc"123"''abc"123"'#在双引号中也可以使用单引号>>>"abc'123'""abc'123'"

5)单引号中不可以再使用单引号,双引号中也不可以再使用双引号

#单引号中不可以再使用单引号#字符串中的前两个引号会先进行匹配,以至于最后的2个引号出现语法错误>>>'abc'123''
  File "<stdin>", line 1'abc'123''^^^
SyntaxError: invalid syntax

#双引号中也不可以再使用双引号#字符串中的前两个引号会先进行匹配,以至于最后的2个引号出现语法错误>>>"abc"123""
  File "<stdin>", line 1"abc"123""^^^
SyntaxError: invalid syntax

2.2.调用str函数创建字符串

此方法适用于将其他数据类型的数据转换成字符串类型。

#字符串>>>str('abc')'abc'>>>str("abc")'abc'>>>#数字转字符串类型>>>str(123)'123'>>>#空字符串类型>>>str()''

3.在字符串中包含特殊的字符

3.1.常见特殊字符以及使用

在Python中,有很多的转义字符,通过这些特殊的字符,可以对字符串进行相应的处理,

常见的特殊字符串有以下几个:

  • 换行字符 - 换行的特殊字符用\n表示,可以对字符串进行换行输出,也就是将光标移动到下一行的开头,英文为newline。
  • 回车字符 - 回车的特殊字符用\r表示,回车字符可以将光标移动到本行的开头,当使用回车特殊字符时,回车符前的字符串会被覆盖,英文名是return。
  • 水平制表符 - 水平制表符用\t表示,水平制表符在很多的编程语言中都有,就是键盘上的tab键,一个tab制表符会包含四个空格,光标会移动到下一组4个空格的开始处。- 但是在Python中,使用水平制表符,并不会是我们理解的那样(在字符串中tab出四个空格),水平制表符会将4个字符看成一个制表符,当使用\t制表符时,会将制表符后的字符串放入到下一个制表符中,制表符前的字符串如果不足4个字符串,则补上相应个数的空格,总之当使用水平制表符时,字符串中的字符个数一定是4的倍数。
  • 退格字符 - 退格字符用\b表示,对应键盘上的Backspace删除键,使用退格字符,一次会删除退格字符左侧的一个字符。

1)换行字符的使用

在前面我们已经使用过几次换行字符串了,就是将一行内的字符串换行显示。

#换行字符print('username\npassword')

image-20220801224009890

2)回车字符的使用

回车符会将光标移动到本行的开头,如果回车符前面有其他字符,回车符会将右侧的字符覆盖掉前面的所有字符。

#回车字符print('username\rpassword')

此时回车符

\r

右侧的字符串会将左侧的字符串覆盖。

image-20220801224551789

3)水平制表符的使用

Python中的水平制表符比较特殊,并不是说用了水平制表符之后,就会在指定的位置增加四个空格,在Python中的水平制表符会将四个字符视作为一个水平制表符,当在字符串中使用了

\t

水平制表符之后,会判断制表符左侧的字符是否够了4个,如果不够则用空格补上,制表符右侧的字符就处于新的制表符中的第一个字符。

print('123456\t123\t45')'''
    \t制表符前的123456是6个字符,其中1234会被视为1个制表符。
    456就是第2个制表符了,且6后面就是\t制表符,相当于产生一个新的制表符,此时456不够4个字符,少几个字符就会用空格填充,这里会填充1个空格。
    然后\t之后的123,123之后又是一个\t,此时123不满足4个字符,也会被填充一个空格。
    最后打印45
'''#输出结果:123456  123 45

控制端看到可能不是那么明显,但是要明白其中的原理,最主要的就是制表符会将4个字符看成一个整体,

\t

相当于创建一个新的制表符,制表符前面的字符4个为一组,不够的会用空格填充,这一点和其他编程语言有所不同。

image-20220801225803569

也可以对照下图去分析。

image-20220801223026989

print('u\tjiang\txl')#原理都一样#输出结果:u   jiang   xl

4)退格字符的使用

退格字符会删除退格字符串前面的一个字符。

##退格字符print('abc\b123')

3.2.转义字符使在字符串汇总使用特殊字符

在上面讲解了Python中的一些特殊字符,可以对字符串进行一些特殊的处理,但是也有需求,我们就想在字符串中含有这些特殊字符呢?输出就带着特殊字符,把特殊字符看做是一个普通的字符串,打印出来,而不是对字符串进行处理,基于这种情况,又该如何实现呢?

很简单,在其他编程语言中,例如shell,对于特殊字符的打印,都会使用转义字符,将带有特殊含义的字符串去掉它的特殊性,然后转换成一个普通的字符串,最后输出到控制台,对于Python而已,也有特定的转义字符,通过这个转义字符就可以把特殊的字符输出到控制台。

一切特殊字符都可以通过反斜杠

\

转义成普通字符。

#打印u\tjiang\txl这样的一个字符串'''
    u\tjiang\txl字符串中包含特殊字符制表符,但是我们想把制表符看做是普通字符打印出来,通过转义字符的方法就可以实现,在特殊字符前面加上一个反斜杠\
'''print('u\\tjiang\\txl')#输出结果:u\tjiang\txl#打印'username\rpassword'字符串,带着单引号print('\'username\\rpassword\'')#输出结果:'username\rpassword'##打印"username\password"字符串,带着双引号print('\"username\\password\"')#输出结果:"username\password"

image-20220801232325895

4.原始字符串

原始字符串指的是原本的字符串内容。

当有需求需要将字符串中的转义字符、特殊字符都打印到控制台,也就是将print()函数内的所有字符串原封不动的打印出来,这时可就可以使用原始字符串来实现。

当有需求不想让字符串中的转义字符、特殊字符生效,也可以使用原始字符串来实现。

如何才能通过原始字符串返回字符串原本的内容呢?只要在字符串前面添加一个

r

或者

R

,就可以将字符串声明为原始字符串,语法格式如下:

print(r字符串)print(R字符串)

这个

r

关键字是单词row,表示原始。

在使用原始字符串时,有些需要注意的点:

  • 原始字符串中的最后一个字符不能是一个反斜杠,中间可以包含一个反斜杠,因为原始字符串的结尾不可以是一个反斜杠,在中间的反斜杠,解释器也会认为这是字符。
  • 原始字符串中最后一个字符可以是两个反斜杠,但是字符串中如果存在引号,引号内是不可以包含两个反斜杠,因为解释器会把引号内的两个反斜杠看做是原始字符串的结尾,从而忽略后面的字符串,最终会抛出错误。

1)使用原始字符串使字符串中的特殊字符、转义字符不生效

#使用原始字符串使字符串中的特殊字符、转义字符不生效。print(r'\tjiangl:\\123\456')#输出结果:\tjiangl:\\123\456

2)原始字符串最后一个字符不能是一个反斜杠

#原始字符串最后一个字符不能是一个反斜杠。print(r'jiangxl\')

如果最后一个字符是反斜杠,解释器就认为这个反斜杠是转义字符,转移了最后一个引号。

image-20220801234146867

3)单原始字符串中间包含一个反斜杠

#单原始字符串中间包含一个反斜杠print(r'jiang\'s')#输出结果:jiang\'s

4)原始字符串最后一个字符串可以是两个反斜杠

#原始字符串最后一个字符串可以是两个反斜杠print(r'jiangxl\\')#输出结果:jiangxl\\

如果是两个反斜杠,就认为这一个转义字符,语法格式正确。

5)原始字符串中包含引号,引号中不可以有两个反斜杠

#原始字符串中包含引号,引号中不可以有两个反斜杠print(r'jiang\\'s')

如果字符串中包含了引号,那么引号的前面是不可用有两个反斜杠的,因为会被认为是转义字符,从而只剩下引号,语法格式就产生了问题,另外原始字符也会认为到了双斜杠之后就结束了,后面的字符串放在这里,也会导致语法有问题。

image-20220801234522090

5.字符串在代码中的跨多行显示

当代码中要输出的字符串很长时,看起来就不美观了,通过两种方式,可以使字符串跨多行在代码中显示。

  • 通过三个引号的方式实现字符串在代码中跨多行显示。
  • 在每行的结尾处添加\反斜杠实现字符串在代码中跨多行显示。

5.1.三个引号实现字符串在代码中跨多行显示

既可以使用三个单引号实现,还可以使用三个双引号实现。又可以在三个引号中嵌套单引号或者双引号,还可以在三个引号中再嵌套三个双引号。

使用三个引号虽然可以实现字符串在代码中跨多行进行显示,但是在打印的时候也会将其跨多行输出。

1)使用三个引号实现符串在代码中跨多行显示

#使用三个单引号print('''
hello,jiangxl
Python基础
''')#使用三个双引号print("""
hello,jiangxl
Python基础
""")

image-20220802171827287

2)在三个引号中嵌套单引号和双引号实现符串在代码中跨多行显示

#使用三个单引号print('''
你好:'jiangxl'
"Python"基础
''')#使用三个双引号print("""
你好:'jiangxl'
"Python"基础
""")

image-20220802171809386

3)在三个引号中嵌套三个单引号或者三个双引号实现符串在代码中跨多行显示

三个单引号中不能嵌套三个单引号,三个双引号中也不能嵌套三个单引号,否则解释器就认为字符串已经结束了。

#三个单引号内嵌套三个双引号print('''
你好:'jiangxl',"""三个双引号"""
"Python"基础
''')#三个双引号中嵌套三个单引号print("""
你好:'jiangxl','''三个单引号'''
"Python"基础
""")

image-20220802171903520

5.2.反斜杠实现字符串在代码中跨多行显示

如果希望字符串只是在代码中跨多行显示,打印的时候还是在一行内,那可以通过这种方法实现。

print('你好: \
jiangxl')

image-20220802171724571

6.使用加法和乘法操作字符串

在Python的字符串中,我们也可以使用加法、乘法运算符去操作字符串,在前面我们讲到了用加法和乘法去操作列表,方法和效果都是一样的。

  • 使用加法运算符可以将多个字符串合并成一个字符串,也就是将两个字符串连接后生成一个新的字符串。
  • 使用乘法云算法可以将一个字符串中的所有字符重复n次后,生成一个新的字符串,n取决于乘数。

6.1.使用加法云算符操作字符串

使用加法运算符可以将两个字符串合并成一个新的字符串。

print('Hello,'+'jiangxl')#输出结果:Hello,jiangxl

image-20220802222157875

另外多个常量字符串放在一行代码中,也会自动拼接成一个新的字符串。

#将多个字符串同时赋值给一个变量,此时这多个字符串会拼接成一个新的字符串,多个字符串以空格隔开,加逗号就演变成了元组
mystr ='jiangxl''123''456'print(mystr)#输出结果:jiangxl123456

此时多个常量会自动拼接在一起,形成一个完整的字符串。

image-20220802222545952

一个变量中的多个常量字符串如果因为字符串太长,想跨行显示,可以直接在字符串中敲回车键,pycharm会自动为其在结尾添加一个反斜杠。

mystr ='jiangxl'\
        '123'\
        '456'print(mystr)#输出结果:jiangxl123456

image-20220802222545952

6.2.使用乘法运算符操作字符串

使用乘法运算符可以将一个字符串中的字符重复n次,形成一个新的字符串。

print('jiangxl'*3)#输出结果:jiangxljiangxljiangxl

image-20220802222901393

7.查询指定字符在字符串中的索引

7.1.字符串查操作的相关概念理论

字符串可以看做是字符的列表,在字符串中的每一个字符都相当一个元素,所以字符串的查询操作和列表的查询操作很类似。

在字符串中是没有逗号这种元素之间的间隔符的,所有的字符都连在一起形成一个字符串,除了可以查询字符所在字符串的索引外,还可以一次性查询多个字符在字符串中的索引,一次查询多个字符又称为子串。

当查询子串的索引时,只会返回一个索引号,这个索引号就是子串中第一个字符的索引号。

如下图所示,字符串

jixmg59nxm23

,通过内置函数查询子串xm的索引时,返回的是子串中第一个字符的索引,第一个字符的索引就是子串的索引。

image-20220803152122344

7.2.字符串查操作的方式

根据指定的字符在字符串中查询其索引,共有四种可使用的函数:

  • index、find:当指定的字符在字符串中有重复值时,index和find函数都会返回第一次出现该字符的索引。如果查询的是子串,道理也是一样的,当指定的子串在字符串中出现多次时,也会返回第一次出现该子串的索引。
  • rindex、rfind:当指定的字符、子串在字符串中存在重复值时,rindex和rfind函数返回最后一次出现该字符、子串的索引。

7.3.字符串查询的经典案例

输出的结果可以参照上图的字符串概念图,观察其索引是否和我们想的是一样的。

1)查询指定字符所在字符串的索引

一次只指定一个字符就是查询指定字符所在字符串的索引,如果字符串中存在相同的字符,index方法只返回第一次出现该字符对应的索引。

#查询字符i所在字符串中的索引
mystr ='jixmg59nxm23'print(mystr.index('i'))#输出结果:1

2)查询指定索引在字符串中的字符

能通过字符查询在字符串中的索引,当然也就能通过索引去查询字符,无论是列表、元组还是字符串大多数情况下都是用索引去查询对应的元素的,因为索引是唯一的,查询出来的是最准确的元素。

#查询索引5对应在字符串中的字符print(mystr[5])#输出结果:5#查询切片范围索引1~4对应的字符print(mystr[1:4])#输出结果:ixm

3)查询指定子串在字符串中的索引

当一次指定多个字符查询其索引时,这多个字符就称之为子串,当查询子串的索引时,子串中第一个字符的索引就是子串的索引,可以参照上图的概念图。

需求:字符串

jixmg59nxm23

,查询子串xm对应的索引。

分析:子串xm在字符串中出现了多次,如果使用index/find函数查询子串的索引,会得到字符串中第一次出现xm子串的索引,使用rindex/rfind喊出查询子串的索引,会得到字符串中最后一次出现子串的索引。

子串的索引是子串中第一个字符的索引。

image-20220803152122344

mystr ='jixmg59nxm23'#使用index、find函数查询字符串中第一次出现子串xm的索引print(mystr.index("xm"))print(mystr.find("xm"))#输出:2#使用rindex、rfind函数查询字符串中最后一次出现子串xm的索引print(mystr.rindex("xm"))print(mystr.rfind("xm"))#输出:8

4)当指定的子串或者字符不在字符串中时的结果

index、rindex、find、rfind函数在查询指定字符、子串的索引时,都可以指定起始索引和结束索引,在指定的索引范围中查询指定字符、子串的索引,语法格式如下。

index/rindex/find/rfind(字符, 起始索引, 结束索引)

使用index和rindex查询指定的字符或者子串在字符串中不存在时,会抛出错误。

#子串xm使用index、rindex函数查询元素时,查找的是第一个子串xm,对应的索引是2,下面我们再索引3-7范围内去查询子串xm,一定是查不到的。print(mystr.index("xm",3,7))print(mystr.rindx("xm",3,7))#输出结果:ValueError: substring not found

image-20220803160037649

使用find和rfind函数查询指定的字符或者子串在字符串中不存在时,会返回-1。

#子串xm使用find、rfind函数查询元素时,查找的是最后一个子串xm,对应的索引是8,下面我们再索引3-7范围内去查询子串xm,一定是查不到的。print(mystr.find("xm",3,7))print(myst人、.find("xm",3,7))#输出结果:-1

8.字符串是不可变的类型

Python中的字符串是不可变的类型,无法对其中在字符元素进行调整,我想将字符串

jixmg59nxm23

中的9修改为7,如下所示:

mystr ='jixmg59nxm23'#首先获取字符9的索引print(mystr.index("9"))# 6#然后将字符9修改成7
mystr[6]='7'#此时就会报错:TypeError: 'str' object does not support item assignment

image-20220803162828982

如果就想修改字符串中的字符,当然也是有办法了,你可以重新定义下字符串,如果又想保留当前的字符串,还想对字符串进行修改,也可以用之前提到的切片+拼接的方法,将字符串中的字符截取出来然后和新的字符进行拼接,产生一个新的字符串。

需求还是将字符串

jixmg59nxm23

中的9修改为7。

分析:可以用切片截取字符串中字符9之前的所有字符,以及9之后的所有字符,然后使用加法运算符将两个切片拼接在一起,拼接时中间加上7即可实现。

mystr ='jixmg59nxm23'#截取字符9之前的所有字符,无需指定起始索引,结束索引为字符9的索引
mystrstart = mystr[:6]#截取字符9之后的所有字符,无需指定结束索引,起始索引为9字符后下一个字符的索引
mystrstop = mystr[7:]#将两个切片拼接起来,中间加上字符7
mystrnew = mystrstart +"7"+ mystrstop
print(mystrnew)#输出:jixmg57nxm23

image-20220803164844211

9.使用比较运算符比较字符串

9.1.字符串的比较规则

除了使用比较运算符对两个列表、元组进行比较外,字符串也可以使用比较运算符,对两个及以上的字符串进行比较,常见的比较运算符有>、>=、<、<=、==、!=。

字符串与列表的比较方式很像,两者的元素都可以是字符或者是数字,当字符串或者列表中的元素都是字符时,需要获取该字符的ordinal value值,字符与字符之间比的就是其ordinal value的值。

字符串使用比较运算符进行比较时,与列表的比较方式不同,列表使用比较运算符进行比较时,列表中的所有元素必须是数字类型,否则无法比较,字符串并没有这个限制,字符串中无论是字母还是数字都可以使用比较运算符进行比较。

字符串的比较规则和列表的比较规则一致:

  • 首先比较两个字符中的第一个字符,如果相等则继续比较下一个字符。
  • 对两个字符串中的字符依次进行比较,直到两个字符串的字符不相等时,其比较结果就是字符串的比较结果。
  • 此时两个字符串中的其他字符将不会再进行比较。

9.2.字符串的ordinal value

字符串字符串,肯定包含字母,那么字母类的字符是如何进行比较呢?按照我们的理解b是大于a的,c是大于b的,那么a和A进行比较呢?又该如何比较?谁大谁小?

在Python的字符串比较中,当两个字符(非数字)进行比较时,实际上比较的是字符的ordinal value,字符的ordinal value是一个整数值。

调用内置函数ord可以查询指定字符的ordinal value值,调用内置函数chr指定ordinal value值可以返回对应的字符。

1)内置函数ord

ord函数一次只能传入一个字符。

print(ord("a"))#输出:97print(ord("b"))#输出:98print(ord("A"))#输出:65

2)内置函数chr

print(chr(97))#输出aprint(chr(65))#输出A

9.3.字符串之间的比较

1)字符之间的比较

'''
        字符a的ordinal value值为97,字符b的ordinal value值为98,a<b成立,返回True
'''print("a"<"b")#输出结果:True

2)字符串之间的比较

'''
        字符串进行比较时,首先比较第一个字符的结果,这两个字符串中前两个字符相等,接着向后进行比较
        第三个字符一个是a,一个是A,a的ordinal value值为97,A的ordinal value值为65
        a<A成立,返回True,此时字符串的比较结果就为True,后面的字符不进行比较
'''

mystr1 ="jiangxl"
mystr2 ="jiAngxl"print(mystr1 > mystr2)#输出结果:True

3)使用双等于对字符串进行比较

使用==运算符比较字符串的相等性。

a = b ="new"
c ="new"print(a == b)#输出Trueprint(a == c)#输出True

4)使用is对字符串进行比较

列表、元组使用is对元素进行同一性比较时,如果不是同一个内存地址的对象,比较时都会返回False,但是字符串略有不同,字符串常量会被缓存和重用,因此使用is对字符串进行比较时,即使同一性不相等,也会返回True,因为字符串被缓存了,相当于读到的是一个内存地址。

a = b ="new"
c ="new"print(a is b)#输出Trueprint(a is c)#输出True

10.字符串的反转

字符串也可以实现反转,与列表有所不同,字符串是不可变类型,因此无法通过reverse方法修改原字符串的值,只能通过reversed函数实现字符串的反转,reversed函数返回的只是一个迭代器对象,通过list将迭代器对象转换一个列表。

mystr ="jiangxl527"print(list(reversed(mystr)))#输出结果:['7', '2', '5', 'l', 'x', 'g', 'n', 'a', 'i', 'j']

image-20220804114607788

另外还可以使用切片的方法指定step步长为-1,从后往前打印,也可以实现反转。

print(mystr[::-1])#输出结果:725lxgnaij

11.字符串的排序

字符串是字符的列表,也可以对其进行排序,字符串是不可变类型,因此不能通过sort方法对字符串进行排序,只能调用内置函数sorted对字符串进行排序。

字符串的排序过程中,Python是根据字符串中字符的ordinal value值进行排序的。

'''
        排序是根据字符串中字符的ordinal value值仅需排序的,26个因为字母,a字母的ordinal value值最小,z字母的ordinal value值最大。
'''#定义一个字符串,有字母有数字
mystr ="jiangxl527"#升序排序print(sorted(mystr))#输出结果:['2', '5', '7', 'a', 'g', 'i', 'j', 'l', 'n', 'x']#降序排序print(sorted(mystr, reverse=True))#输出结果:['x', 'n', 'l', 'j', 'i', 'g', 'a', '7', '5', '2']

本文转载自: https://blog.csdn.net/weixin_44953658/article/details/128911765
版权归原作者 Jiangxl~ 所有, 如有侵权,请联系我们删除。

“第19讲:Python中的字符串的创建、特殊字符穿、转义字符串、字符串运算、跨多行展示、字符串索引、反转与排序”的评论:

还没有评论