![例解Python:Python编程快速入门践行指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/703/35808703/b_35808703.jpg)
2.2 字符串
2.2.1 常用的定义字符串的方式
Python中,字符串被定义为引号之间的字符集合。引号既可以使用单引号,也可以使用双引号。无论单引号,还是双引号,表示的含义都完全相同。此外,Python支持三引号(三个连续的单引号或双引号),用于包含特殊字符,保存原始格式。如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_18.jpg?sign=1739600438-SZPH2GKXuB3WCU4g3VBMcmRcfd9qz6p8-0-0687a44e0cce913a7c65639daf7024c6)
为了正确地表示字符串中的单引号,需要在字符串两边使用双引号。如果采用了单引号,就会出现语法错误,因为Python将找到的第二个单引号与第一个单引号实行配对,如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_19.jpg?sign=1739600438-r27EEZiVCa3lV7bgrFbHMYMDK5w13Ico-0-b0477309c13fb31aa5b5b29bf75b7a41)
如果字符串中间有回车,则输入时需要使用转义字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_20.jpg?sign=1739600438-VQylP3vItZoKU45uNgXXlYcCyZpCQAzw-0-af3e5e4658fb3d6c09e25a6b4f7e392d)
三引号能够保存输入时的原始样式,如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_21.jpg?sign=1739600438-Dz5cVClNV7OHLMcj8ahX5IC4pUb388MO-0-5e5375742bc55e3f5f01f613b4c1f9b5)
在Python内部保存的时候,并没有分成多行,还是用\n表示回车。不使用print语句,直接输入变量就可以看到Python存储的样式:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_22.jpg?sign=1739600438-O26IWaaevDSbgU7sPpcv9NC7Yj14WM2q-0-00d36c07ba8112b49fa40942edd698b0)
2.2.2 通过字符串切片获取字符或子串
使用索引运算符[ ]来得到一个字符。按照从左到右的顺序取字符,第一个字符的索引(也常被称为下标)是0;按照从右到左的顺序取字符,还可以使用负数,最后一个字符的索引是-1。如果使用的下标已经超出范围,则会出现IndexError的异常:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_23.jpg?sign=1739600438-LfgYvsnsUTxNbCzPgMjf3keeYeVAfwX6-0-4485ad7f427b6f7f2134e972e8dca3cc)
使用切片运算符[:]来得到一部分字符串。冒号左侧是起始下标,右侧是结束下标。其中,起始下标对应的字符包含在子串内,而结束下标对应的字符不包含在子串内。所以取出字符串“Python”的前两个字符,需要使用以下方式:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_24.jpg?sign=1739600438-gl8ccP4kYn5wRLhBJRojfwuTPixOMGp1-0-14aa8ba2b774f606316d4d20b846994a)
那么,如果需要取出“thon”呢?字符“n”的下标是5,从下标为2的第三个字符取到下标为5的子串只能取出“tho”:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_25.jpg?sign=1739600438-czFjXz7JLqa2GUVkHi95iFUXR2zWutyR-0-fc679b5a79776170e4427c919be520fe)
试一下将结束下标改为6,虽然字符串没有这个下标值:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_26.jpg?sign=1739600438-VUBTjTv8HwX6YbiyEUmjRTJcP4BZhyex-0-df6bf86062ddb2554744dd5a27e42234)
通过上面的例子,可以得到结论:通过索引运算符取出一个字符,如果索引超出范围会发生错误,而通过切片运算符取子串,下标值可以是任意值。既然6都能用,60是不是也能使用呢?如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_27.jpg?sign=1739600438-KE1SeiNW4Ela0qQ5Os7qhtMxsNBQkP86-0-83a4a04860563f9c50f2bc5f90d8e1f2)
在实际使用过程中,如果想取到结尾,结束下标干脆就不用写了:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_28.jpg?sign=1739600438-kkldsJESeoqjASfsw3YKPPqGX2JuVp8j-0-11e8bc94bb0697ce8d139d6d3853a845)
同样的道理,从开头取,起始下标也是不用写的:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_29.jpg?sign=1739600438-UzUqsUltYkFEuUWs7MWUEpAQhpvTUI6c-0-c4008dd8c83ee05740ab788a6236c39a)
字符串取切片还支持一个步长值,可以跳跃地取子串,如只想取出“Pto”:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_30.jpg?sign=1739600438-6Ce6t40vt52yYKBYzxxGgHoo0OJDFXX2-0-bf8fcbd26ce08a12f92697a917e36291)
起始下标和结束下标都没有写,表示从头取到尾,步长为2表示每隔一个字符取一个字符。如果只需要取出“yhn”,则如下所示:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_31.jpg?sign=1739600438-L1lQF4Y5hp7u0oAuL6iRhQ3QpdOt6Jzo-0-f027b868da19e27887bc561718321882)
步长值也能使用负数,表示自右向左取切片:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_32.jpg?sign=1739600438-2EHFkBtIp8ByQ0l0VLI7vJwUjYNulI2J-0-605c95e72686714e38e92658b3d6ac1b)
2.2.3 字符串的拼接与重复
字符串支持+操作,和数字运算不一样,字符“相加”只是简单地将两个字符串拼接到一起:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_33.jpg?sign=1739600438-Pz0fNTrHrPYRjhsKA01xUoAGo2PO4Upl-0-b7c1d38e53e6187b58419c7d967ae079)
只要参与拼接的双方最终都是字符串对象就行,变量py_str是字符串类型,也可以实现拼接操作:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_34.jpg?sign=1739600438-bxYcDzc5zXyOm2H2RIUTMfk1x7aqOwmh-0-a60a61912bea2438d1656fcc35486df6)
字符串还支持*操作,字符串的*表示将字符串重复多次:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_35.jpg?sign=1739600438-K4eEr0oSml4pEDPOxfs3hGrFIFBl0Whj-0-aa010bf032d149265e82c07d72aa3424)
2.2.4 字符串成员关系判断
判断字符或字符串是否存在于另一个字符串中:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_36.jpg?sign=1739600438-sMQbst0qoAvGGmSUs1jcdkymRT46Fefi-0-eaffcad10c881d491d6502fbad6a76f0)
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_37.jpg?sign=1739600438-v0WdkWj6LtF58C2l8UIGxRHGyBMioYPE-0-1ca45cad11f898314accf2188e1bfddb)
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=1739600438-PJlTxdffzk1bHaebJtWyYAruIJUx3qCa-0-5eeb2de24fa501a3098c5a3980a76169)
strip()也可以去除两端指定的字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_39.jpg?sign=1739600438-WL0Mt9BUr4af3Bd7nTq4hJhTXpioVyxB-0-db6d5574065905c6c82f552528328341)
如果只是去除左端或右端的字符,则使用lstrip()或rstrip():
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_40.jpg?sign=1739600438-kM95XHFW0xrZYbpv4qOSdMiFmiqQpiLa-0-702f7e3cd74e0182cca4d8734ffb6041)
➢ str.split()。
split()默认使用空格作为分隔符,将字符串分隔开。
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_41.jpg?sign=1739600438-RHEpoZ6JLk95QYDxRWi5JhretSduP0O0-0-354050c253f3ada79b2574b6c877b116)
也可以指定分隔符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_42.jpg?sign=1739600438-HRs0TE3dYD2uQAyQxqJa7ipczWBClOJH-0-adb97a706d8c982946dfc1a49d3afbf9)
➢ str.replace()。
通过名称就能猜到,它用于字符串的替换操作:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_43.jpg?sign=1739600438-BNIpijX41jlVUI8IQJiReB4zR3oPyL8T-0-09599b3ce8eb68211b6cb2b88586fc28)
➢ str.islower()。
字符串中的字母全部是小写则返回True,不考虑非字母字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_44.jpg?sign=1739600438-nZKLs9WIXBlLFeivJ3vB0kv5JQhd6DNK-0-023f4b939adcdb6746c263dc7943599f)
➢ str.isupper()。
字符串中的字母全部是大写则返回True,不考虑非字母字符:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_45.jpg?sign=1739600438-G3Gdv3QOPmJh4iMU8ee40cYRBMvKB5TY-0-6d61aa8e9e91a9f32793e42a66c0d81c)
➢ str.isdigit()。
字符串中所有字符全部是数字才返回True:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_46.jpg?sign=1739600438-gwImw15VpOys3AyLmyvKK06WFiEU8OgA-0-d0e2ea4a1f93ba3fa7affdbda6643b34)
➢ str.ljust()。
字符串左对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_47.jpg?sign=1739600438-WPEjc2Eq00K0VHtVFcRYsJXJcsi5wtoB-0-0f62aa7a3a788327bd35443f9fa045e3)
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_48.jpg?sign=1739600438-jawZtdlBERHp2CjmXzNh6LcF9QqiDwWc-0-287bef2f69e918ceed670404b4e9fdf6)
➢ str.rjust()。
字符串右对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_49.jpg?sign=1739600438-ZsCHW0f49yeo8eTFlr1fX5VTWKMNbccg-0-85eec962b07174580fe2f3580307ba7d)
➢ str.center()。
字符串居中:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_50.jpg?sign=1739600438-nT1MnCTgWosEyeISMPUESM3waqiBvKBl-0-a1d33bbac6bcec3ad8b63bc1e222f060)
➢ str.startswith()。
判断字符串以哪些字符开头:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_51.jpg?sign=1739600438-aiN7tJEcDCp27Mx6zWw0A8MQhOibXJ4p-0-cfffd253fe39ac5f92dac5e16bee62b7)
➢ str.endswith()。
判断字符串以哪些字符结尾:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_52.jpg?sign=1739600438-JR2gYOfLsHRHv4oz6xUOYyz65foer15M-0-8eabf1d8a42c05007f432ddbd24daf04)
2.2.6 字符串格式化方法
如果字符串中有变化的数据,则可以用%s进行占位:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_53.jpg?sign=1739600438-aE4AbE6RtQ3CadsSpnCOn3uxrZm9CyQD-0-9c9168c7b73cba5851a59ae455c83b4b)
在中间%的前面有一个字符串,字符串中有两个%s进行占位,这两个%s被后面元组中的字符串“Tom”和数字20替换。
%s表示使用str()函数将相应的数据进行转换。上面的例子中,20是十进制整数,它也可以使用%d进行占位:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_54.jpg?sign=1739600438-3mRuOB7rKxm0zUtftDjp8UeRr0CiDZan-0-7690c02da9bcbf1ae1b7fd7961b57bc3)
占位符还可以是一个表示宽度的数字:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_55.jpg?sign=1739600438-TCOgRHzxJ9seFCTTXiltl2a8pozyprrx-0-80b5c2738f02281d119a1600d7231438)
第一个%10s表示后面元组中的“name”字符将占据10个字符的宽度,因为“name”的宽度是4,那么需要在它前面补上6个空格。
%s中间的数字,正数表示右对齐,采用负数可以实现左对齐:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_56.jpg?sign=1739600438-DgkQXEZobtKVPZppeC6xFyehXsXDyD4u-0-82c3d6b905441aad5f50705d28c96167)
浮点数使用%f:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_57.jpg?sign=1739600438-WvHEE6DOqVKscQ6iaoretGNsGsLlsc0T-0-6ad0ed6f1d703f392145c367337a69a2)
以八进制数进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_58.jpg?sign=1739600438-6SFYg9FW7tjtkyBKAIRn7O761N4s6lf7-0-c9f1967d06454c744cf78f03d1f2b630)
以十六进制数进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_59.jpg?sign=1739600438-bqKAi7zlcauEXsYjuqFELNz0L5qSJsdK-0-9ad6207d410f9f22635e6b16c1c29c35)
使用%%输出百分号:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_60.jpg?sign=1739600438-yxyAqBMZwn7IdVT52BaoUzWNjs1f9Mt5-0-e1b0de028378dc4041c36afdef70f394)
2.2.7 利用原始字符串表达字面本身的含义
如果你正在使用Windows系统编写程序,很可能会需要定义一个路径,就像这样的:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_61.jpg?sign=1739600438-4fuzYlsqI5cTcBCdBq9xhhjThKsqbtgI-0-eafdee77aff1de8dba5ad0a03aaa27e6)
接下来我们用print语句进行输出:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_62.jpg?sign=1739600438-yKeZrMqSxfZUSDdIFjezl1XPI4Zz0bWl-0-73a67b7c5a575feb8f72055b6f6a531e)
你没有看错,就是这样的!为什么呢?因为\t将会变成Tab键,而\n会被翻译成回车。因此,路径就不得不这么书写:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_63.jpg?sign=1739600438-008DUn8uIrEw2e0XNngXAD5qlWaNHhfW-0-71e1e2735da95ac5e5bb1aedba44f6ee)
现在好了,Windows系统的路径不再出现错误,两个反斜线表示一个真正的反斜线,它不会再和后面的字母t和n组合起来表示其他含义。不过,这种写法很麻烦,每次都要写两个反斜线,这个时候,原始字符串就派上用场了。
原始字符串就是在字符串前面加一个r而已:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_64.jpg?sign=1739600438-kxD1FBgC1UTplyuvvY8BgPATWRgMg64u-0-a164227a18e4915be5f38d95b4ba735b)
有了原始字符串,路径看上去就真的是一个Windows路径了,不再显得那么奇怪。那么,原始字符串是怎么办到的呢?print打印出来的内容是方便给人看的,如果不用print,则Python交互解释器就会显示出它在内部存储的真正的样子:
![img](https://epubservercos.yuewen.com/65F395/19118079508020906/epubprivate/OEBPS/Images/txt002_65.jpg?sign=1739600438-RvJTKm9E5ZorLJL46mdJwnnCCaJ5ALJq-0-a896bf9e9fce371a9fdb28f69bb668b5)
原来是加上r后,Python自动把一个反斜线变成两个了!