:字符串与常用操作)
python字符串用来保存文本。姓名、文件路径、网页地址和接口返回的消息只要内容是文字在 Python 中通常都会使用字符串处理。思维导图这一章主要讲字符串的创建、索引、切片、常用方法和格式化。字符串看起来简单不过索引越界、转义字符、split()和join()的用法以及字符串不可变这些地方都比较容易写错。一、创建字符串Python 中的字符串类型是str可以使用单引号、双引号或者三引号创建nameIvanlanguagePythonmessage这是一个 可以换行的字符串单引号和双引号没有类型上的区别选择哪一种主要看字符串中包含什么内容。例如字符串里已经有单引号时外面使用双引号会方便一些messageIm learning Python如果字符串里有双引号也可以反过来写message他说“今天开始学习 Python。”三引号可以保存跨越多行的文本其中的换行也会成为字符串内容的一部分text第一行 第二行 第三行print(text)输出结果为第一行 第二行 第三行空字符串中没有任何字符但是它仍然是一个字符串对象empty_textprint(type(empty_text))print(len(empty_text))输出结果为class str 0二、转义字符与原始字符串反斜杠\在字符串中用来表示一些不能直接写出来或者具有特殊含义的字符。写法含义\n换行\t制表符\\一个反斜杠\单引号\双引号\r回车例如message姓名Ivan\n语言Pythonprint(message)输出结果为姓名Ivan 语言Python1. 路径中的反斜杠Windows 路径中经常出现反斜杠。如果直接写路径其中的\n、\t等组合可能会被当成转义字符pathC:\new\test.txtprint(path)这段代码不会按照原路径输出因为\n会换行\t会变成制表符。可以把每个反斜杠再转义一次pathC:\\new\\test.txt也可以在字符串前加上r创建原始字符串pathrC:\new\test.txtprint(path)原始字符串会保留大多数反斜杠。不过它不能以单个反斜杠结尾下面的写法会出现语法错误# 错误写法pathrC:\new\处理路径时更常见的办法是使用标准库中的pathlib。这一部分会放到文件操作章节中再讲。三、字符串索引字符串由一个个字符组成每个字符都有自己的位置这个位置称为索引。Python 的索引从0开始textPythonprint(text[0])print(text[1])print(text[5])输出结果为P y n也可以使用负数索引从右向左读取字符。最后一个字符的索引是-1print(text[-1])print(text[-2])print(text[-6])输出结果为n o Plen()可以取得字符串的字符数量textPythonprint(len(text))结果为6所以它能使用的正数索引是0到5。访问不存在的位置会引发IndexErrorprint(text[6])中文字符也按照字符数量计算text学习Pythonprint(len(text))print(text[0])输出结果为8 学这里的len()计算的是字符数量不是字符串保存到文件以后占用的字节数。四、字符串切片索引一次只能取得一个字符切片可以取出一段字符串。基本写法如下字符串[开始位置:结束位置:步长]切片包含开始位置不包含结束位置。例如textPythonprint(text[0:2])print(text[2:6])输出结果为Py thontext[0:2]取得索引0和1不会取得索引2。这种规则也常写成“左闭右开”。1. 省略开始或结束位置省略开始位置时默认从字符串开头切print(text[:3])输出Pyt。省略结束位置时会一直切到字符串末尾print(text[3:])输出hon。开始和结束都省略时会得到完整字符串print(text[:])2. 使用负数索引切片负数索引也可以放在切片中filenamereport.pdfprint(filename[-3:])print(filename[:-4])输出结果为pdf report3. 设置步长第三个参数表示每隔几个字符取一次text0123456789print(text[::2])print(text[1::2])输出结果为02468 13579步长为负数时会从右向左取字符。下面的写法可以把字符串倒过来textPythonprint(text[::-1])输出结果为nohtyP。与单个索引不同切片超出字符串范围通常不会报错textPythonprint(text[0:100])结果仍然是Python。Python 会在字符串实际结束的位置停下来。五、字符串是不可变对象字符串创建以后其中的字符不能直接修改。下面的代码会出现TypeErrortextPythontext[0]J如果想把Python改成Jython需要创建一个新的字符串再让变量指向它textPythontextJtext[1:]print(text)字符串方法也是一样。例如replace()返回修改后的新字符串并不会在原字符串上直接修改textI like Javanew_texttext.replace(Java,Python)print(text)print(new_text)输出结果为I like Java I like Python如果后面的代码要继续使用替换结果就要接收它的返回值texttext.replace(Java,Python)六、字符串的基本运算1. 拼接字符串可以拼接多个字符串first_nameIvanlast_nameChenfull_namefirst_name last_nameprint(full_name)字符串不能直接和数字拼接age20# 错误写法message年龄age可以先使用str()转换也可以直接使用 f-stringmessage1年龄str(age)message2f年龄{age}2. 重复字符串*可以把字符串重复指定次数line-*20print(line)3. 判断是否包含in和not in可以判断字符串中是否包含一段内容urlhttps://www.python.orgprint(pythoninurl)print(javanotinurl)字符串判断区分大小写print(Pythoninpython.org)结果为False。4. 比较字符串字符串可以使用、!、、等运算符比较print(PythonPython)print(Pythonpython)print(applebanana)大小比较会按照字符的 Unicode 编码顺序逐个比较不等同于汉语拼音、字典顺序或者自然语言中的大小关系。业务代码需要排序中文、忽略大小写或处理不同语言时通常要增加专门的规则。七、查找与统计1.find()与rfind()find()返回指定内容第一次出现的索引没有找到时返回-1textPython is easy, Python is usefulprint(text.find(Python))print(text.find(Java))输出结果为0 -1rfind()从右侧开始查找所以它会返回最后一次出现的位置print(text.rfind(Python))2.index()与rindex()index()的结果与find()类似不过没有找到时会引发ValueErrortextPythonprint(text.index(th))是否使用find()或index()要看没有找到是不是正常情况。如果没有找到也允许继续运行find()通常更方便如果没有找到说明数据本身有问题可以使用index()再交给异常处理代码处理。3.count()count()用来统计某段内容出现的次数textbananaprint(text.count(a))print(text.count(an))输出结果为3 24.startswith()与endswith()这两个方法用来判断字符串的开头和结尾filenamereport.pdfprint(filename.startswith(report))print(filename.endswith(.pdf))也可以传入一个元组同时判断多个候选值filenamephoto.pngis_imagefilename.endswith((.jpg,.jpeg,.png,.gif))print(is_image)八、大小写与空白处理1. 大小写转换常用的大小写方法如下方法作用lower()转为小写upper()转为大写capitalize()首字符大写其余字符小写title()每个单词的首字母大写swapcase()交换大小写casefold()用于不区分大小写的文本比较textHello Pythonprint(text.lower())print(text.upper())print(text.title())如果只是进行简单的英文大小写转换lower()已经够用。需要比较不同语言的文本时casefold()处理得更彻底leftStraßerightSTRASSEprint(left.casefold()right.casefold())结果为True。2. 去掉两端字符strip()去掉字符串两端的空白lstrip()只处理左侧rstrip()只处理右侧text Python \nprint(repr(text.strip()))print(repr(text.lstrip()))print(repr(text.rstrip()))这里使用repr()输出是为了让空格和\n更容易看出来。strip()也可以接收参数不过参数表示一组需要从两端删除的字符并不是完整的前缀或后缀textwww.example.comprint(text.strip(w.com))这段代码会不断删除两端属于w、.、c、o、m的字符结果可能和预想的不一样。删除固定前缀或后缀时应该使用urlhttps://example.comprint(url.removeprefix(https://))filenamereport.pdfprint(filename.removesuffix(.pdf))九、替换、拆分与连接1.replace()replace()用来替换字符串中的内容textJava is usefulnew_texttext.replace(Java,Python)print(new_text)第三个参数可以限制替换次数textone one oneprint(text.replace(one,two,2))输出结果为two two one。2.split()split()按照指定分隔符把字符串拆成列表textPython,Java,Golanguagestext.split(,)print(languages)输出结果为[Python, Java, Go]不传分隔符时split()会按照连续的空白字符拆分并忽略两端空白text Python Java\tGo print(text.split())输出结果为[Python, Java, Go]如果明确传入一个空格规则就不同了连续空格会产生空字符串textPython Javaprint(text.split( ))输出结果为[Python, , , Java]maxsplit可以限制最多拆分几次record2026-08-21-error-messageprint(record.split(-,3))3.splitlines()splitlines()按照换行符拆分多行文本text第一行\n第二行\n第三行print(text.splitlines())4.join()join()把多个字符串连接起来languages[Python,Java,Go]text, .join(languages)print(text)输出结果为Python, Java, Go调用join()的对象是分隔符因此写法是分隔符.join(字符串序列)。列表里如果有整数需要先转换为字符串numbers[10,20,30]# 错误写法# text ,.join(numbers)text,.join(str(number)fornumberinnumbers)print(text)这里暂时用到了一个生成器表达式。现阶段只需要知道它会把列表中的每个数字交给str()转换具体语法会在推导式与生成器章节中再讲。十、判断字符串内容Python 提供了一组以is开头的方法用来判断字符串是否符合某种形式方法判断内容isalpha()是否全部为字母且至少有一个字符isdigit()是否全部为数字字符且至少有一个字符isdecimal()是否全部为十进制数字字符isalnum()是否全部由字母或数字组成isspace()是否全部为空白字符islower()是否包含字母且字母都是小写isupper()是否包含字母且字母都是大写istitle()是否符合标题大小写形式print(Python.isalpha())print(2026.isdigit())print(Python3.isalnum())print( \n.isspace())这些方法的结果都是布尔值。需要注意isdigit()识别的数字字符范围比普通的0到9更广所以它不能替代完整的数据校验。判断用户输入能不能传给int()最稳妥的方式仍然是转换并处理可能出现的ValueError。十一、字符串格式化把变量放进字符串时通常使用 f-string。它从 Python 3.6 开始支持写法是在字符串前加f然后把变量或表达式放入花括号nameIvanage20messagef姓名{name}年龄{age}print(message)花括号中可以写表达式price19.9count3print(f总价{price*count})1. 控制小数位数price19.956print(f{price:.2f})print(f{price:.1f})输出结果为19.96 20.02. 千位分隔与百分比number1234567.89rate0.856print(f{number:,.2f})print(f{rate:.1%})输出结果为1,234,567.89 85.6%3. 对齐与宽度表示左对齐表示右对齐^表示居中textPythonprint(f|{text:10}|)print(f|{text:10}|)print(f|{text:^10}|)输出结果为|Python | | Python| | Python |4. 日期格式日期对象也可以放进 f-string 中格式化fromdatetimeimportdatetime nowdatetime(2026,8,21,10,30)print(f{now:%Y-%m-%d%H:%M})输出结果为2026-08-21 10:305.str.format()旧一些的代码中经常能看到format()nameIvanscore95.5message{} 的成绩是 {:.1f} 分.format(name,score)print(message)它仍然可以正常使用不过新代码在大多数情况下使用 f-string 更直观。%s、%d这种百分号格式化也会出现在旧代码和日志配置中能够看懂即可。十二、字符串与字节Python 中的str保存 Unicode 文本bytes保存字节数据。文本写入文件或者通过网络传输时通常需要按照某种编码转换成字节。1. 编码encode()把字符串转换成字节text你好Pythondatatext.encode(utf-8)print(data)print(type(data))2. 解码decode()把字节转换回字符串textdata.decode(utf-8)print(text)编码和解码必须使用相同或者兼容的字符编码。用错误编码解码可能出现乱码也可能引发UnicodeDecodeError。text你好datatext.encode(utf-8)# 错误的解码方式# result data.decode(ascii)UTF-8 中一个中文字符通常占三个字节所以字符数和字节数可能不同text你好print(len(text))print(len(text.encode(utf-8)))输出结果为2 6十三、综合示例整理一条商品信息下面接收一行商品数据去掉多余空格再拆出名称、单价和数量最后计算总价raw_textinput(请输入商品信息格式为 名称,单价,数量)partsraw_text.strip().split(,)iflen(parts)!3:print(输入格式不正确)else:nameparts[0].strip()pricefloat(parts[1].strip())countint(parts[2].strip())totalprice*countprint(f商品{name})print(f单价{price:.2f}元)print(f数量{count})print(f总价{total:.2f}元)输入Python 入门书, 59.8, 2输出结果为商品Python 入门书 单价59.80 元 数量2 总价119.60 元示例中的if和else属于条件判断。这里先看程序怎样把字符串清理、拆分和转换条件判断会在下一章详细讲。十四、常见错误1. 索引超出范围textPythonprint(text[6])字符串长度为6最后一个有效索引是5。2. 忘记接收字符串方法的返回值text Python text.strip()print(repr(text))strip()没有修改原字符串。应该写成texttext.strip()3. 把strip()当成删除完整前缀urlwww.example.comresulturl.strip(www.)strip()按字符集合删除两端内容。删除固定前缀应该使用resulturl.removeprefix(www.)4. 混淆split()与join()textPython,Java,Goitemstext.split(,)# 字符串拆成列表result,.join(items)# 列表连接成字符串5. 在普通字符串中直接写 Windows 路径pathC:\new\test.txt其中的\n和\t会被当成转义字符。可以使用双反斜杠、原始字符串或者后面会讲到的pathlib。6. 使用字节长度代替字符长度text你好print(len(text))print(len(text.encode(utf-8)))前者是字符数量后者是 UTF-8 编码后的字节数量。限制用户名长度时通常看字符数限制网络报文或文件大小时才会考虑字节数。十五、练习练习一取得文件名和扩展名给定字符串archive.backup.zip分别取得文件名archive.backup和扩展名zip。可以先使用rfind()找到最后一个点的位置再配合切片完成。练习二隐藏手机号码输入一个 11 位手机号码只显示前 3 位和后 4 位中间使用四个星号代替。例如138****5678练习三统计单词给定一段英文文本去掉两端空格并按照空白拆分统计其中有多少个单词。练习四整理标签输入字符串 Python, 数据分析, Web开发 去掉每个标签两端的空格再使用 | 连接成下面的形式Python | 数据分析 | Web开发练习五检查文件类型判断文件名是否以.jpg、.jpeg、.png或.gif结尾。检查时要忽略扩展名的大小写。这一章把字符串中最常用的内容放在了一起。后面处理输入数据、文件内容和接口结果时索引、切片、拆分、替换和格式化都会经常用到。日期2026年8月24日专栏Python教程