- 例解Python:Python编程快速入门践行指南
- 张志刚
- 1961字
- 2021-02-26 18:02:24
2.2 字符串
2.2.1 常用的定义字符串的方式
Python中,字符串被定义为引号之间的字符集合。引号既可以使用单引号,也可以使用双引号。无论单引号,还是双引号,表示的含义都完全相同。此外,Python支持三引号(三个连续的单引号或双引号),用于包含特殊字符,保存原始格式。如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_18.jpg?sign=1739559128-qR47B36ifwxFhMWKdADSYAHxmMUr9AiZ-0-3eba9371fbb200e61f04ed08d6685f42)
为了正确地表示字符串中的单引号,需要在字符串两边使用双引号。如果采用了单引号,就会出现语法错误,因为Python将找到的第二个单引号与第一个单引号实行配对,如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_19.jpg?sign=1739559128-NhZni30C7RLxeDDPAzoKtwLbr7amDQNh-0-195d7b68ade70e8b6be906565a8fafb9)
如果字符串中间有回车,则输入时需要使用转义字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_20.jpg?sign=1739559128-rK0SJb0T56EWtnNPZK1NxTS0WkmH2vfk-0-46bf34a55f7722aee321b0c79cd67f6d)
三引号能够保存输入时的原始样式,如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_21.jpg?sign=1739559128-Q3zgHDwmyXTtwiwza0BJwT355ec9t1G4-0-d8d0ce9474472e0abc78f0078dff98c5)
在Python内部保存的时候,并没有分成多行,还是用\n表示回车。不使用print语句,直接输入变量就可以看到Python存储的样式:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_22.jpg?sign=1739559128-xNFjJmlfXTEbgDXP1AwipbzSfENE7Xse-0-97ca8cfb55fe9aeba0bf7ce3e78ace2c)
2.2.2 通过字符串切片获取字符或子串
使用索引运算符[ ]来得到一个字符。按照从左到右的顺序取字符,第一个字符的索引(也常被称为下标)是0;按照从右到左的顺序取字符,还可以使用负数,最后一个字符的索引是-1。如果使用的下标已经超出范围,则会出现IndexError的异常:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_23.jpg?sign=1739559128-6ObrowcqYWgKPhm6f5Og8Kg93aPQc3Ww-0-eb06273236806f87128a02bc257794e1)
使用切片运算符[:]来得到一部分字符串。冒号左侧是起始下标,右侧是结束下标。其中,起始下标对应的字符包含在子串内,而结束下标对应的字符不包含在子串内。所以取出字符串“Python”的前两个字符,需要使用以下方式:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_24.jpg?sign=1739559128-79RMqaqXxc50mRBUSkKaxSx6DZZlMkh6-0-bc4d6ab0db2856679dce1dcbce3eaaa2)
那么,如果需要取出“thon”呢?字符“n”的下标是5,从下标为2的第三个字符取到下标为5的子串只能取出“tho”:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_25.jpg?sign=1739559128-aAqzOGgTosiK4SEWya5VUlRwhkBLVDiG-0-6c6ffc8f31efaf213a6bbf765b54a04d)
试一下将结束下标改为6,虽然字符串没有这个下标值:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_26.jpg?sign=1739559128-nXysxabUFRf3cNhnIRqgJJyaJ30cTYT4-0-ff4ec777f0baeb0790ebd6b6d1a47928)
通过上面的例子,可以得到结论:通过索引运算符取出一个字符,如果索引超出范围会发生错误,而通过切片运算符取子串,下标值可以是任意值。既然6都能用,60是不是也能使用呢?如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_27.jpg?sign=1739559128-PT885rLeTFdNmFa4ZpvopHp3lletRNRs-0-b3835f689602ac1f0c8d817822f688b9)
在实际使用过程中,如果想取到结尾,结束下标干脆就不用写了:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_28.jpg?sign=1739559128-qBkif9SyeRWWpR4wCC7PlzCL4oI3It8c-0-9be50efc977e7c8ac1ca10866240d157)
同样的道理,从开头取,起始下标也是不用写的:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_29.jpg?sign=1739559128-n9B07wZn68kiqPTGVI9qsbWAHD4fEnaY-0-975053467729558d2b8ea6927d6085c6)
字符串取切片还支持一个步长值,可以跳跃地取子串,如只想取出“Pto”:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_30.jpg?sign=1739559128-t7An8FYFd5zCU8lZONi2WF8RkOTPTRpc-0-208fa532370fa238143331bca8807adf)
起始下标和结束下标都没有写,表示从头取到尾,步长为2表示每隔一个字符取一个字符。如果只需要取出“yhn”,则如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_31.jpg?sign=1739559128-akiU2WptCtg9EXcDveo82XonDaX11JN7-0-97ddbad0adc82096b3ea194d6a577fbd)
步长值也能使用负数,表示自右向左取切片:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_32.jpg?sign=1739559128-nFkdIt5GJJZvd3LhvHuQfxYNMI0GqNA6-0-3c26f5ab93ed02d82e330cf9a2a3197f)
2.2.3 字符串的拼接与重复
字符串支持+操作,和数字运算不一样,字符“相加”只是简单地将两个字符串拼接到一起:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_33.jpg?sign=1739559128-R7iWXj3rvYl5PTiqob67rqDD4i2aFATE-0-ad7ae971073fd74bf6cf60ee569aef12)
只要参与拼接的双方最终都是字符串对象就行,变量py_str是字符串类型,也可以实现拼接操作:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_34.jpg?sign=1739559128-8l9dXAllHDDzYxaZ7x0YVBrmo2LYkrLb-0-b1902b182dbaa046d847087efd918571)
字符串还支持*操作,字符串的*表示将字符串重复多次:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_35.jpg?sign=1739559128-h5PRz0bQZg90fihpEfu743YCGTBL7ogH-0-d5666edab752e3f076b9a5eafe2da584)
2.2.4 字符串成员关系判断
判断字符或字符串是否存在于另一个字符串中:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_36.jpg?sign=1739559128-tJhcPPdveTBLOqUfkPpZygogPd5NWSFx-0-8cabaac3258f16eb833f78a091a57af5)
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_37.jpg?sign=1739559128-A2hpf2ypkMexyKaq4tYJm2jS589IETdM-0-4c5c95fdf3d3e4848bbc9b61c658fedb)
2.2.5 字符串方法
字符串拥有非常多方法,这里仅仅将常用的方法做一个简单的说明,完整方法请查阅官方文档,或使用help帮助。
➢ str.strip()。
strip()默认用于去除字符串两端的空白字符。空白字符并不是只有空格,全部的空白字符是" \r\t\v\f\n"。如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_38.jpg?sign=1739559128-q3PJJ5Av9iTCqXJkTFYESuBdCVeWIWR7-0-35aac00c89f307e288c6bfefe73f2397)
strip()也可以去除两端指定的字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_39.jpg?sign=1739559128-740QJmKfSbmKZqHyI5VyB0Jknl6YqEqc-0-9960ad4b5d3179e6e999cf78732492b7)
如果只是去除左端或右端的字符,则使用lstrip()或rstrip():
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_40.jpg?sign=1739559128-K3gL64W75nyiCwqwe7iqX0SWnFILbeZO-0-5b08d264a7ccfa6c13d69c0d92161388)
➢ str.split()。
split()默认使用空格作为分隔符,将字符串分隔开。
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_41.jpg?sign=1739559128-E5wj9C0PjwSzKE2FRczQxTwpM6gb2YPJ-0-c15a0f9d4309e3bffdbd7375912995ec)
也可以指定分隔符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_42.jpg?sign=1739559128-xniAktedN8nSNTtExFn6npx6CRt95wxV-0-5536d764e0264a75778f61e5f8717660)
➢ str.replace()。
通过名称就能猜到,它用于字符串的替换操作:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_43.jpg?sign=1739559128-u1I2TpVP7MPphhM8MBCJEimtDzCUrE2q-0-290cd442f1fb31a29e66af027a1be01c)
➢ str.islower()。
字符串中的字母全部是小写则返回True,不考虑非字母字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_44.jpg?sign=1739559128-mplZXUhVYLY0l2KWjx7z8fGMK5VOXiNz-0-5721b6e4af3844a36e4eccaf97bb12d7)
➢ str.isupper()。
字符串中的字母全部是大写则返回True,不考虑非字母字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_45.jpg?sign=1739559128-GMEE8Nsl9wZAG57o4VGL8lREyIGbv4T7-0-3594114abcc90cceb77400d8690c3520)
➢ str.isdigit()。
字符串中所有字符全部是数字才返回True:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_46.jpg?sign=1739559128-i0norssybsgt71Di2uOLwsFalAUuKwPX-0-94814146037c77ea03f40332f90647f8)
➢ str.ljust()。
字符串左对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_47.jpg?sign=1739559128-99LGgybJzW9yl2IETVEQbrXTAgEHGBUU-0-7425365ddc55220cb6200e4da948a970)
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_48.jpg?sign=1739559128-QqX3eOvzTQHMcOIFTijtffjMjcxvKz9f-0-60aec41b66413d0d18fdebc7898a1627)
➢ str.rjust()。
字符串右对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_49.jpg?sign=1739559128-7qkaHJ2Ra8ze6qVbC95o6B6l7vOfqSHL-0-834f8a030117d5b795d49ef0f6e7a4dc)
➢ str.center()。
字符串居中:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_50.jpg?sign=1739559128-DZMfzQ7pa72ZaHaajezcJPi2C56JP82r-0-3d00deb464d068a92389e39846a5b4b3)
➢ str.startswith()。
判断字符串以哪些字符开头:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_51.jpg?sign=1739559128-ZYTZga1XftzStvGk6uTGmx4f6BhXA7j3-0-687c3a738b655ef6e43994ef1af70ff8)
➢ str.endswith()。
判断字符串以哪些字符结尾:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_52.jpg?sign=1739559128-4KrUAGNL4T4wc3yUobGHEieIwc2b4xMh-0-820506221bdaff2436d5eaea8ef97265)
2.2.6 字符串格式化方法
如果字符串中有变化的数据,则可以用%s进行占位:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_53.jpg?sign=1739559128-UPPGPw2SswvSTcQBlbZAzJitLIfSZMHm-0-a917449b739fd8801a59d1523f1f9d28)
在中间%的前面有一个字符串,字符串中有两个%s进行占位,这两个%s被后面元组中的字符串“Tom”和数字20替换。
%s表示使用str()函数将相应的数据进行转换。上面的例子中,20是十进制整数,它也可以使用%d进行占位:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_54.jpg?sign=1739559128-xL2n7rGnj3uV4Xes2dzh2bFrf6wtQeDj-0-b2950c1304aadfaec0b99b4cb43a8203)
占位符还可以是一个表示宽度的数字:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_55.jpg?sign=1739559128-1XH8DbM7XPnBvBsbyYy6mKVnjlyvwTKa-0-5367ca08fec74581622ade2b09e9b57a)
第一个%10s表示后面元组中的“name”字符将占据10个字符的宽度,因为“name”的宽度是4,那么需要在它前面补上6个空格。
%s中间的数字,正数表示右对齐,采用负数可以实现左对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_56.jpg?sign=1739559128-2haYhgyQqprI8wPMMPDJLYSlUFzFX7BO-0-d9a275e1759690444000caeb0ea1b067)
浮点数使用%f:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_57.jpg?sign=1739559128-V9YOqT1H8b6cUbEFTz7U6TN3pZPijx6F-0-6f794fe57803f63e9e8e73a52ff28038)
以八进制数进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_58.jpg?sign=1739559128-dNILbVRb1fBft5wWFKKZJZYf9icmBHRZ-0-0df1a5a973acd9b816891b673d593070)
以十六进制数进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_59.jpg?sign=1739559128-OzMHPtqYf6w01PGjGbJpTVqN8s4lnoBa-0-01b1f643dd55192d3022a49f1f1d1b59)
使用%%输出百分号:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_60.jpg?sign=1739559128-QdShjLOG925C5M7LGYPloZtZIrxWvSK3-0-40c1b99583e485a48977151ba65496f1)
2.2.7 利用原始字符串表达字面本身的含义
如果你正在使用Windows系统编写程序,很可能会需要定义一个路径,就像这样的:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_61.jpg?sign=1739559128-J0QAlFMuVuY9CxgDMmhcGRUlluCgttfL-0-e2a97cabdad896673cb3d0e2ecf54fe6)
接下来我们用print语句进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_62.jpg?sign=1739559128-rdcNIbFwaFUkqibfbIpCS7hI0CTWRpAa-0-ea134d1b7dde48b36194a5e65523e2e3)
你没有看错,就是这样的!为什么呢?因为\t将会变成Tab键,而\n会被翻译成回车。因此,路径就不得不这么书写:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_63.jpg?sign=1739559128-vNFzzvnSZ8xS8ONxVWmxuBaisvcT3dVu-0-8bd0aa9a30d0db51b224598feb42aeaf)
现在好了,Windows系统的路径不再出现错误,两个反斜线表示一个真正的反斜线,它不会再和后面的字母t和n组合起来表示其他含义。不过,这种写法很麻烦,每次都要写两个反斜线,这个时候,原始字符串就派上用场了。
原始字符串就是在字符串前面加一个r而已:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_64.jpg?sign=1739559128-lI6vSEXNbSmIdhORy0R3YAuI28iB4lZL-0-60abd494559138f88e9bdddb6ca1d7e1)
有了原始字符串,路径看上去就真的是一个Windows路径了,不再显得那么奇怪。那么,原始字符串是怎么办到的呢?print打印出来的内容是方便给人看的,如果不用print,则Python交互解释器就会显示出它在内部存储的真正的样子:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_65.jpg?sign=1739559128-aFdiiUkZSGq1Jsql6j36LZkGW9LxuCPv-0-6dcb178218a17eae1bd33f738c9d9a47)
原来是加上r后,Python自动把一个反斜线变成两个了!