- 例解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=1739667204-kxlKkJewk75YyHIiwj38pcaYHZUkbbAT-0-5e1cf44ed89af4ab159ca02f287b227e)
为了正确地表示字符串中的单引号,需要在字符串两边使用双引号。如果采用了单引号,就会出现语法错误,因为Python将找到的第二个单引号与第一个单引号实行配对,如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_19.jpg?sign=1739667204-S4uOPxq8LJDuR6byweTbDe0YVK4MCruD-0-989b72c6d2576a5b32e5c4fbbe7e85ce)
如果字符串中间有回车,则输入时需要使用转义字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_20.jpg?sign=1739667204-mnNjqUYcF2X7PAPJGYYskophmrcIscIo-0-d79ce5aa8dbf9a45b74fbea0651a5306)
三引号能够保存输入时的原始样式,如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_21.jpg?sign=1739667204-ixWVsZBh3bZlKvzJsB8QJrKTKkFxVTxb-0-09db245b8ad455084f24175e7ea25088)
在Python内部保存的时候,并没有分成多行,还是用\n表示回车。不使用print语句,直接输入变量就可以看到Python存储的样式:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_22.jpg?sign=1739667204-iQ2hGN0w4YmLfktp6kQFw26WdHaKuKeg-0-16b6c85e67cbe4758a0ec21aeb65faa0)
2.2.2 通过字符串切片获取字符或子串
使用索引运算符[ ]来得到一个字符。按照从左到右的顺序取字符,第一个字符的索引(也常被称为下标)是0;按照从右到左的顺序取字符,还可以使用负数,最后一个字符的索引是-1。如果使用的下标已经超出范围,则会出现IndexError的异常:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_23.jpg?sign=1739667204-EvOfQaKoUcOt2Vjgqv1C4M9U1bIXv1EY-0-078d093abf33565253c8c00d7fd7b950)
使用切片运算符[:]来得到一部分字符串。冒号左侧是起始下标,右侧是结束下标。其中,起始下标对应的字符包含在子串内,而结束下标对应的字符不包含在子串内。所以取出字符串“Python”的前两个字符,需要使用以下方式:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_24.jpg?sign=1739667204-9Z6M8FBuWgfKzVnBO6kHZOhxoidrk3Dw-0-13a78bfe5a19b0558f0062a65e11b8c7)
那么,如果需要取出“thon”呢?字符“n”的下标是5,从下标为2的第三个字符取到下标为5的子串只能取出“tho”:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_25.jpg?sign=1739667204-bmYZGxIsrJwHFwpkApg5OZSFojIW18en-0-af92a52a6830875ec233e4d48f82d0f8)
试一下将结束下标改为6,虽然字符串没有这个下标值:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_26.jpg?sign=1739667204-5CdNxuux3SS8RWjha9lT5xPYnFYnMIwN-0-8bc6e6add2564c2684b5d2bbb920b0f4)
通过上面的例子,可以得到结论:通过索引运算符取出一个字符,如果索引超出范围会发生错误,而通过切片运算符取子串,下标值可以是任意值。既然6都能用,60是不是也能使用呢?如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_27.jpg?sign=1739667204-bhvxBkLzVMdhBSSq4ZwRiEbNym8wwmPm-0-3547e1bcab1b5850ab4c690864d78536)
在实际使用过程中,如果想取到结尾,结束下标干脆就不用写了:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_28.jpg?sign=1739667204-o3wPgcVWlg3oQUXmwTqkNo0dFfXXkxLJ-0-2f34c5959847ceba0508ce1aaf9a5de1)
同样的道理,从开头取,起始下标也是不用写的:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_29.jpg?sign=1739667204-hawUAaSDstJjwP6aomWkLId8CUKmDGGJ-0-f64b325da2edbc130935f1b4c119ce1c)
字符串取切片还支持一个步长值,可以跳跃地取子串,如只想取出“Pto”:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_30.jpg?sign=1739667204-bxIz3crcfh756rhWMbAgrZnyPkr4Kgwj-0-e058d4e1be45beeb284fe1f8b67becce)
起始下标和结束下标都没有写,表示从头取到尾,步长为2表示每隔一个字符取一个字符。如果只需要取出“yhn”,则如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_31.jpg?sign=1739667204-6RPGbwnzz8KbJnXxzZ6ZD1p3Azjv5HWu-0-aa77f50fc88e6654c68afed74b9ce85f)
步长值也能使用负数,表示自右向左取切片:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_32.jpg?sign=1739667204-4X8QEMWnAUugNZA18N9TTAdGIFoGYc8f-0-15bf420e3315f336f1f808fb13c6e240)
2.2.3 字符串的拼接与重复
字符串支持+操作,和数字运算不一样,字符“相加”只是简单地将两个字符串拼接到一起:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_33.jpg?sign=1739667204-RUX5kTnJbYucAZHVgKFusZriui9COOIT-0-1ad00137a2e93b1f95098a45ab82d14b)
只要参与拼接的双方最终都是字符串对象就行,变量py_str是字符串类型,也可以实现拼接操作:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_34.jpg?sign=1739667204-T4o2fZAK8cIq6ZNIQWjCeL1LRi9HSE9e-0-295a6e23070cee6ea6d9195a3f0c090b)
字符串还支持*操作,字符串的*表示将字符串重复多次:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_35.jpg?sign=1739667204-kzGkpm570pTh4i3L19tgBN2pfLcltzzJ-0-2b417a6100b1c3b238598ff854324298)
2.2.4 字符串成员关系判断
判断字符或字符串是否存在于另一个字符串中:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_36.jpg?sign=1739667204-5j78JZAkdkCzEXZTPOd4vNeHW2DOljOD-0-1c7c8ca39bd65f0663c5275953db9bb3)
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_37.jpg?sign=1739667204-hGJQikZCGQ76kNR7paezUmt94usHajT2-0-ffcd689790143ba031805768325dd9bf)
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=1739667204-GjDf9keJbuwHOtGR6Q0uG6pRHP1ig7r7-0-b556794e69cc3f47a61a355a9616a1a2)
strip()也可以去除两端指定的字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_39.jpg?sign=1739667204-GKTuBZBsfBGLbcOwoBkRizx8izKXe6CZ-0-85aba5c61ad4cd66669646c51d48e6cb)
如果只是去除左端或右端的字符,则使用lstrip()或rstrip():
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_40.jpg?sign=1739667204-ZIuNy8PkuqddU7mNJkG16jwmo2dGGEE8-0-8553553485f5d6060a56d2c626846112)
➢ str.split()。
split()默认使用空格作为分隔符,将字符串分隔开。
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_41.jpg?sign=1739667204-pbq8a4BctuKPjyO1ZKff5cM77CdCP1iB-0-7cdad1e26c5a649d4047db84a459beec)
也可以指定分隔符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_42.jpg?sign=1739667204-RCbSisErqB91n2g34hAStl3anKKqzbiN-0-c5358839db4c6f11b377918178669a58)
➢ str.replace()。
通过名称就能猜到,它用于字符串的替换操作:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_43.jpg?sign=1739667204-u9ZyqeEOnzku9aGrMVpk36kzRDMR47XE-0-4cc37f9a0d13a030048dd0675f43cf5b)
➢ str.islower()。
字符串中的字母全部是小写则返回True,不考虑非字母字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_44.jpg?sign=1739667204-cGIdOCsWGK8o4yEdlNGTt9crhBHE6dhY-0-c30aebff0a4205040d015bf96892f72d)
➢ str.isupper()。
字符串中的字母全部是大写则返回True,不考虑非字母字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_45.jpg?sign=1739667204-jpJKTBo6kq70R5WjPvQ3zqUxaaEes7HW-0-d75b62923b4fb0d69d554772dcc947ec)
➢ str.isdigit()。
字符串中所有字符全部是数字才返回True:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_46.jpg?sign=1739667204-3GzprGiXuiedj34QM5Y63eyodEQEgnvj-0-0d894edb418478c9e050a88bf84e1317)
➢ str.ljust()。
字符串左对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_47.jpg?sign=1739667204-1RHAErfmBzNXTevPrxHo7yfJrJAAOwa0-0-ddf399d635d9063c630f20d79b795591)
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_48.jpg?sign=1739667204-iir5VgwvNuTWXtCEXNSxh3dqTTdEC2ja-0-7947cc47d539cfa1609be0ed49264a25)
➢ str.rjust()。
字符串右对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_49.jpg?sign=1739667204-jezQR7T9QVCFeOsgvAVrq2fhPclnwCkq-0-d4c64a077091c3e6ead3315d2eec3538)
➢ str.center()。
字符串居中:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_50.jpg?sign=1739667204-jzJM2rF7lsQEGQu2YFcp8YwqmwHCxxto-0-4774cb1b4a6e687788f71e27d3425a35)
➢ str.startswith()。
判断字符串以哪些字符开头:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_51.jpg?sign=1739667204-a3JR7RyhsLU1fqZEtW5wk8HL5OYESqsq-0-cb4c46103c230e7d66beaa995e1ae17f)
➢ str.endswith()。
判断字符串以哪些字符结尾:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_52.jpg?sign=1739667204-es9I1E41qtwkcov1HoF9XNgOyUYYSCgJ-0-5ee56e44ab0a39811f2174bb2868ab22)
2.2.6 字符串格式化方法
如果字符串中有变化的数据,则可以用%s进行占位:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_53.jpg?sign=1739667204-UkRobxd8ROLboYGFIe1LZQ8eqAFn8Baz-0-39cb852467bde153fdf397271bbe0a5f)
在中间%的前面有一个字符串,字符串中有两个%s进行占位,这两个%s被后面元组中的字符串“Tom”和数字20替换。
%s表示使用str()函数将相应的数据进行转换。上面的例子中,20是十进制整数,它也可以使用%d进行占位:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_54.jpg?sign=1739667204-aCySumlACGtHqjYjUJXm2CFutpX8GQCU-0-d073c59d09522c558332d22bf74fd647)
占位符还可以是一个表示宽度的数字:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_55.jpg?sign=1739667204-pdYqG6YAmwYDA8pe76suNviFVei6Aqx1-0-d4048eac7509f06aff4c5f44e939d7cf)
第一个%10s表示后面元组中的“name”字符将占据10个字符的宽度,因为“name”的宽度是4,那么需要在它前面补上6个空格。
%s中间的数字,正数表示右对齐,采用负数可以实现左对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_56.jpg?sign=1739667204-7bqNpqfjKGQEfU87b3DyzZfLal89h4IB-0-08e00a9048f1f74ed04ba1678baac8d8)
浮点数使用%f:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_57.jpg?sign=1739667204-qx5k7CkE6Y9i6WsHLsvVL5PlbvTFUy1u-0-a0eedeede2cabbfb8f88ff8bbff8f19d)
以八进制数进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_58.jpg?sign=1739667204-blvhMqYlz07HTHjzvZt53mCeaqAigpZu-0-7bc022d5e9725a1f131fa50cf94f86cc)
以十六进制数进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_59.jpg?sign=1739667204-8ksAFnCmSz2MB4odZ7KQZuIdno2t5Yab-0-319ef552b6d484faf458bfed977efe24)
使用%%输出百分号:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_60.jpg?sign=1739667204-QaIAVtVuLOEkLRLXilDY4IFfeETWW7Fw-0-cd17f0f461f24ed436b68648205b9ce1)
2.2.7 利用原始字符串表达字面本身的含义
如果你正在使用Windows系统编写程序,很可能会需要定义一个路径,就像这样的:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_61.jpg?sign=1739667204-FmVbJFMrNrxkEFVgNhlzFr3BdxSWyHZ1-0-04ba398bc9d00a452ee9da2276b8ce57)
接下来我们用print语句进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_62.jpg?sign=1739667204-JhgPbCMEMvMtVFO29NxKs8Xhf9gcZUZh-0-e30cd4beabe8f48289e88f7e35dc174d)
你没有看错,就是这样的!为什么呢?因为\t将会变成Tab键,而\n会被翻译成回车。因此,路径就不得不这么书写:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_63.jpg?sign=1739667204-tP3lmwKKlnxJSbKWoxkbJXn37oIW0f2c-0-d39729a50cfd030eac4b910aea8c832c)
现在好了,Windows系统的路径不再出现错误,两个反斜线表示一个真正的反斜线,它不会再和后面的字母t和n组合起来表示其他含义。不过,这种写法很麻烦,每次都要写两个反斜线,这个时候,原始字符串就派上用场了。
原始字符串就是在字符串前面加一个r而已:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_64.jpg?sign=1739667204-ug0FraVpIBoyj0T6JHAa99BmAr5kcwYC-0-b8339d556d94c6d5adec7916e7d82181)
有了原始字符串,路径看上去就真的是一个Windows路径了,不再显得那么奇怪。那么,原始字符串是怎么办到的呢?print打印出来的内容是方便给人看的,如果不用print,则Python交互解释器就会显示出它在内部存储的真正的样子:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_65.jpg?sign=1739667204-oiO1S375E7gNhKnyyVU8yMOFvboJIFG7-0-4a873521a2094e1457c0a00cee42fd89)
原来是加上r后,Python自动把一个反斜线变成两个了!