Python基础字符串索引与切片操作完全指南一、开篇字符串是一串带编号的字符想象一下酒店的房间走廊——每个房间门上都贴着一个编号第一个房间是0号第二个是1号以此类推。Python中的字符串就像这个走廊每个字符是一个房间而索引就是房间号。⌨️ 在Python中操作字符串的任意部分——提取子串、反转字符串、隔位取值——这些操作通过索引和切片来实现。这两个操作是Python字符串处理中最常用、最核心的技能。一旦掌握它们你处理文本的能力将提升一个档次。二、索引基础单个字符的访问2.1 正索引从左往右从0开始Python的索引从0开始——这是计算机世界的通用惯例textPython# 索引 P y t h o n# 正索引: 0 1 2 3 4 5# 负索引:-6 -5 -4 -3 -2 -1print(text[0])# P第一个字符print(text[1])# yprint(text[2])# tprint(text[5])# n最后一个字符print(text[6])# IndexError: string index out of range 从0开始对初学者来说可能不习惯但这是几乎所有编程语言的传统。记住第n个字符的索引是n-1。2.2 负索引从右往左从-1开始Python的负索引是一个非常有用的特性让你可以从末尾往前数textPythonprint(text[-1])# n倒数第一个即最后一个print(text[-2])# o倒数第二个print(text[-3])# h倒数第三个print(text[-6])# P倒数第六个即第一个print(text[-7])# IndexError: string index out of range 负索引的实际应用# 获取文件扩展名不用split的替代方案filenamereport_2024.pdfextensionfilename[filename.rfind(.):]print(extension)# .pdf# 检查字符串后缀defhas_extension(filename,ext):检查文件是否有特定扩展名returnfilename[-len(ext):]extprint(has_extension(data.csv,.csv))# Trueprint(has_extension(data.json,.csv))# False# 获取最后一个字符比如判断路径末尾是否有/path/home/user/documents/ifpath[-1]/:print(路径以/结尾)2.3 索引越界访问超出范围的索引会触发IndexErrortextHellotry:print(text[10])exceptIndexErrorase:print(f索引越界{e})print(f字符串长度是{len(text)}有效索引是-{len(text)}到{len(text)-1})# 安全获取指定位置的字符defsafe_get_char(text,index):安全地获取指定索引的字符越界返回Noneif-len(text)indexlen(text):returntext[index]returnNonetextPythonprint(safe_get_char(text,0))# Pprint(safe_get_char(text,100))# None三、切片基础获取一段子串3.1 切片语法text[start:stop:step]切片的基本语法是[start:stop:step]start起始索引包含即从这个位置开始取stop结束索引不包含即取到这个位置之前step步长默认是1textPython编程# 基本切片print(text[0:6])# Python索引0到5不包含6print(text[6:8])# 编程索引6、7# 图解text P y t h o n 编 程# 索引: 0 1 2 3 4 5 6 7# text[0:6] 取索引0,1,2,3,4,5 → Python# text[6:8] 取索引6,7 → 编程⚠️ 切片的不包含stop规则是最容易让新手出错的地方。记住一个记忆技巧text[a:b]返回的字符个数正好是b - a。3.2 省略start或stoptextPython# 省略start从开头开始取print(text[:3])# Pyt等价于text[0:3]# 省略stop取到末尾print(text[3:])# hon等价于text[3:len(text)]# 两个都省略取整个字符串浅拷贝print(text[:])# Python# 负索引在切片中print(text[-3:])# hon取最后3个字符print(text[:-2])# Pyth去掉最后2个字符 实用案例# 去除文件扩展名filenamedocument.txtname_without_extfilename[:-4]# 去掉.txtprint(name_without_ext)# document# 更通用的方式defget_filename_without_extension(filename):获取不含扩展名的文件名dot_indexfilename.rfind(.)ifdot_index-1:returnfilenamereturnfilename[:dot_index]# 获取域名urlhttps://www.example.com/path/page.htmldomainurl[url.index(//)2:url.index(/,url.index(//)2)]print(domain)# www.example.com3.3 带步长的切片textPython编程# 步长为2隔一个取一个print(text[::2])# Pto编取索引0,2,4,6# 步长为3print(text[::3])# Ph程取索引0,3,6# 从索引1开始步长为2print(text[1::2])# yhn程取索引1,3,5,7# 负步长——反向取print(text[::-1])# 程编nohtyP字符串反转print(text[::-2])# 程nhy反向隔一个取一个text[::-1]是Python中最简洁的字符串反转方式。这在判断回文串时特别有用defis_palindrome(text):判断字符串是否是回文clean_texttext.lower().replace( ,)returnclean_textclean_text[::-1]print(is_palindrome(racecar))# Trueprint(is_palindrome(A man a plan a canal Panama))# Trueprint(is_palindrome(hello))# False3.4 切片图解字符串: P y t h o n 编 程 正索引: 0 1 2 3 4 5 6 7 负索引:-8 -7 -6 -5 -4 -3 -2 -1 text[0:4] Pyth (取0,1,2,3) text[4:] on编程 (取4,5,6,7) text[:4] Pyth (取0,1,2,3) text[2:6] thon (取2,3,4,5) text[-3:] n编程 (取-3,-2,-1 → 5,6,7) text[1:-1] ython编 (取1到-2 → 1,2,3,4,5,6) text[::2] Pto编 (0,2,4,6) text[::-1] 程编nohtyP (取-1,-2,...,-8)四、切片的高级用法4.1 越界切片不会报错和索引不同切片的start或stop超出范围不会报错——Python会自动调整到有效范围textPython# 索引越界会报错# print(text[100]) # IndexError!# 切片越界不会报错——Python自动处理print(text[0:100])# Pythonstop被截断为len(text)print(text[100:])# start超出范围返回空字符串print(text[-100:3])# Pytstart被截断为0这个特性让切片用起来比索引宽容得多——你不需要担心越界问题。4.2 使用切片删除或替换部分字符串textHello, World!# 删除前6个字符实际是创建新字符串new_texttext[7:]print(new_text)# World!# 替换中间的一部分# 把World替换为PythontextHello, World!new_texttext[:7]Pythontext[12:]print(new_text)# Hello, Python!# 插入内容textHelloWorldnew_texttext[:5] text[5:]print(new_text)# Hello World# 删除最后一个字符textHello!new_texttext[:-1]print(new_text)# Hello4.3 使用切片进行文本清理defremove_whitespace(text):去除字符串首尾的空白字符start0endlen(text)whilestartendandtext[start].isspace():start1whileendstartandtext[end-1].isspace():end-1returntext[start:end]# 当然实际开发中用strip()即可# 这个例子只是演示如何用切片实现类似功能print(repr(remove_whitespace( hello )))# hellodeftruncate(text,max_length,suffix...):截断长字符串加上后缀iflen(text)max_length:returntextreturntext[:max_length-len(suffix)]suffixprint(truncate(这是一段很长的文本内容需要被截断,10))# 这是一段很长...4.4 用切片实现文本分页defpaginate_text(text,page_size):将文本按指定大小分页return[text[i:ipage_size]foriinrange(0,len(text),page_size)]long_textPython编程语言是一门强大而优雅的语言适合各种开发场景。pagespaginate_text(long_text,10)fori,pageinenumerate(pages,1):print(f第{i}页:{page})五、切片的性能特性5.1 切片会创建新字符串textPythonslice_texttext[0:3]print(id(text))# 比如 14073512345print(id(slice_text))# 比如 14073567890不同的id# 切片创建了新字符串不是引用原字符串的一部分5.2 小字符串切片的优化# 对于非常小的字符串重复切片影响不大# 但对于大字符串如文件内容要注意# 如果只需要首尾等特定部分用索引而不是切片textHello# text[0:1] # 获取第一个字符但返回字符串H不是字符first_chartext[0]# 获取第一个字符返回字符H效率略高5.3 大文本切片建议# 处理大文本时如果频繁切片会产生大量临时字符串对象# 建议对需要多次使用的切片结果存到变量里# ❌ 低效defprocess_text_v1(text):foriinrange(1000):parttext[i:i100]process(part)# ✅ 高效defprocess_text_v2(text):foriinrange(0,len(text),100):parttext[i:i100]# 每个块只切片一次process(part)六、切片操作的实际应用6.1 提取日期各部分date_str2024-05-30yeardate_str[:4]monthdate_str[5:7]daydate_str[8:10]print(f{year}年{month}月{day}日)# 2024年05月30日6.2 解析固定格式的文本# 假设有固定格式的日志8位日期 6位时间 等级(4位) 消息log_entry20240530143000INFO用户登录成功timestamplog_entry[:14]# 20240530143000levellog_entry[14:18]# INFOmessagelog_entry[18:]# 用户登录成功print(f时间:{timestamp})print(f等级:{level})print(f消息:{message})6.3 生成密码掩码defmask_string(text,visible_chars4,mask_char*):将字符串的一部分隐藏iflen(text)visible_chars:returntext visible_parttext[-visible_chars:]masked_partmask_char*(len(text)-visible_chars)returnmasked_partvisible_part# 手机号脱敏phone13812345678print(mask_string(phone,4))# *******5678# 身份证号脱敏id_card110101199001011234print(mask_string(id_card,4))# **************1234# 银行卡号脱敏bank_card6222021234567890print(mask_string(bank_card,4))# ************78906.4 字符串轮转defrotate_string(text,n):将字符串向左轮转n位ifnottext:returntext n%len(text)# 处理n大于字符串长度的情况returntext[n:]text[:n]textPythonprint(rotate_string(text,1))# ythonPprint(rotate_string(text,2))# thonPyprint(rotate_string(text,-1))# nPytho负数右转七、切片的常见错误7.1 搞混索引和切片textHello# 索引返回单个字符print(text[0])# Hstr类型单个字符print(type(text[0]))# class str# 切片返回字符串print(text[0:1])# Hstr类型但是用切片取的print(type(text[0:1]))# class str# 注意两者的区别# text[0] vs text[0:1]# text[1] 如果超出范围会IndexError# text[0:1] 如果超出范围返回空字符串7.2 步长符号搞反textPython# 正向步长start必须小于stopprint(text[0:4:1])# PythOK0 4print(text[4:0:1])# start stop且step为正返回空# 反向步长start必须大于stopprint(text[4:0:-1])# ohtyOK4 0从索引4向索引0走print(text[0:4:-1])# start stop且step为负返回空# 反向取全部print(text[::-1])# nohtyP八、本篇小结✅ 索引和切片是Python字符串操作的核心技能。今天的内容索引从0开始text[0]是第一个字符text[-1]是最后一个切片语法[start:stop:step]包含start不包含stop省略规则text[:3]从头取text[3:]取到末尾text[:]取全部负步长反转text[::-1]是最简洁的字符串反转切片不报错越界切片自动调整比索引宽容性能注意大文本频繁切片会产生大量临时对象 索引和切片不仅在字符串中用列表、元组也支持相同的操作。掌握了这一套你就能在所有序列类型中游刃有余。下一篇我们深入字符串的常用方法——查找与替换。
Python基础:字符串索引与切片操作完全指南
Python基础字符串索引与切片操作完全指南一、开篇字符串是一串带编号的字符想象一下酒店的房间走廊——每个房间门上都贴着一个编号第一个房间是0号第二个是1号以此类推。Python中的字符串就像这个走廊每个字符是一个房间而索引就是房间号。⌨️ 在Python中操作字符串的任意部分——提取子串、反转字符串、隔位取值——这些操作通过索引和切片来实现。这两个操作是Python字符串处理中最常用、最核心的技能。一旦掌握它们你处理文本的能力将提升一个档次。二、索引基础单个字符的访问2.1 正索引从左往右从0开始Python的索引从0开始——这是计算机世界的通用惯例textPython# 索引 P y t h o n# 正索引: 0 1 2 3 4 5# 负索引:-6 -5 -4 -3 -2 -1print(text[0])# P第一个字符print(text[1])# yprint(text[2])# tprint(text[5])# n最后一个字符print(text[6])# IndexError: string index out of range 从0开始对初学者来说可能不习惯但这是几乎所有编程语言的传统。记住第n个字符的索引是n-1。2.2 负索引从右往左从-1开始Python的负索引是一个非常有用的特性让你可以从末尾往前数textPythonprint(text[-1])# n倒数第一个即最后一个print(text[-2])# o倒数第二个print(text[-3])# h倒数第三个print(text[-6])# P倒数第六个即第一个print(text[-7])# IndexError: string index out of range 负索引的实际应用# 获取文件扩展名不用split的替代方案filenamereport_2024.pdfextensionfilename[filename.rfind(.):]print(extension)# .pdf# 检查字符串后缀defhas_extension(filename,ext):检查文件是否有特定扩展名returnfilename[-len(ext):]extprint(has_extension(data.csv,.csv))# Trueprint(has_extension(data.json,.csv))# False# 获取最后一个字符比如判断路径末尾是否有/path/home/user/documents/ifpath[-1]/:print(路径以/结尾)2.3 索引越界访问超出范围的索引会触发IndexErrortextHellotry:print(text[10])exceptIndexErrorase:print(f索引越界{e})print(f字符串长度是{len(text)}有效索引是-{len(text)}到{len(text)-1})# 安全获取指定位置的字符defsafe_get_char(text,index):安全地获取指定索引的字符越界返回Noneif-len(text)indexlen(text):returntext[index]returnNonetextPythonprint(safe_get_char(text,0))# Pprint(safe_get_char(text,100))# None三、切片基础获取一段子串3.1 切片语法text[start:stop:step]切片的基本语法是[start:stop:step]start起始索引包含即从这个位置开始取stop结束索引不包含即取到这个位置之前step步长默认是1textPython编程# 基本切片print(text[0:6])# Python索引0到5不包含6print(text[6:8])# 编程索引6、7# 图解text P y t h o n 编 程# 索引: 0 1 2 3 4 5 6 7# text[0:6] 取索引0,1,2,3,4,5 → Python# text[6:8] 取索引6,7 → 编程⚠️ 切片的不包含stop规则是最容易让新手出错的地方。记住一个记忆技巧text[a:b]返回的字符个数正好是b - a。3.2 省略start或stoptextPython# 省略start从开头开始取print(text[:3])# Pyt等价于text[0:3]# 省略stop取到末尾print(text[3:])# hon等价于text[3:len(text)]# 两个都省略取整个字符串浅拷贝print(text[:])# Python# 负索引在切片中print(text[-3:])# hon取最后3个字符print(text[:-2])# Pyth去掉最后2个字符 实用案例# 去除文件扩展名filenamedocument.txtname_without_extfilename[:-4]# 去掉.txtprint(name_without_ext)# document# 更通用的方式defget_filename_without_extension(filename):获取不含扩展名的文件名dot_indexfilename.rfind(.)ifdot_index-1:returnfilenamereturnfilename[:dot_index]# 获取域名urlhttps://www.example.com/path/page.htmldomainurl[url.index(//)2:url.index(/,url.index(//)2)]print(domain)# www.example.com3.3 带步长的切片textPython编程# 步长为2隔一个取一个print(text[::2])# Pto编取索引0,2,4,6# 步长为3print(text[::3])# Ph程取索引0,3,6# 从索引1开始步长为2print(text[1::2])# yhn程取索引1,3,5,7# 负步长——反向取print(text[::-1])# 程编nohtyP字符串反转print(text[::-2])# 程nhy反向隔一个取一个text[::-1]是Python中最简洁的字符串反转方式。这在判断回文串时特别有用defis_palindrome(text):判断字符串是否是回文clean_texttext.lower().replace( ,)returnclean_textclean_text[::-1]print(is_palindrome(racecar))# Trueprint(is_palindrome(A man a plan a canal Panama))# Trueprint(is_palindrome(hello))# False3.4 切片图解字符串: P y t h o n 编 程 正索引: 0 1 2 3 4 5 6 7 负索引:-8 -7 -6 -5 -4 -3 -2 -1 text[0:4] Pyth (取0,1,2,3) text[4:] on编程 (取4,5,6,7) text[:4] Pyth (取0,1,2,3) text[2:6] thon (取2,3,4,5) text[-3:] n编程 (取-3,-2,-1 → 5,6,7) text[1:-1] ython编 (取1到-2 → 1,2,3,4,5,6) text[::2] Pto编 (0,2,4,6) text[::-1] 程编nohtyP (取-1,-2,...,-8)四、切片的高级用法4.1 越界切片不会报错和索引不同切片的start或stop超出范围不会报错——Python会自动调整到有效范围textPython# 索引越界会报错# print(text[100]) # IndexError!# 切片越界不会报错——Python自动处理print(text[0:100])# Pythonstop被截断为len(text)print(text[100:])# start超出范围返回空字符串print(text[-100:3])# Pytstart被截断为0这个特性让切片用起来比索引宽容得多——你不需要担心越界问题。4.2 使用切片删除或替换部分字符串textHello, World!# 删除前6个字符实际是创建新字符串new_texttext[7:]print(new_text)# World!# 替换中间的一部分# 把World替换为PythontextHello, World!new_texttext[:7]Pythontext[12:]print(new_text)# Hello, Python!# 插入内容textHelloWorldnew_texttext[:5] text[5:]print(new_text)# Hello World# 删除最后一个字符textHello!new_texttext[:-1]print(new_text)# Hello4.3 使用切片进行文本清理defremove_whitespace(text):去除字符串首尾的空白字符start0endlen(text)whilestartendandtext[start].isspace():start1whileendstartandtext[end-1].isspace():end-1returntext[start:end]# 当然实际开发中用strip()即可# 这个例子只是演示如何用切片实现类似功能print(repr(remove_whitespace( hello )))# hellodeftruncate(text,max_length,suffix...):截断长字符串加上后缀iflen(text)max_length:returntextreturntext[:max_length-len(suffix)]suffixprint(truncate(这是一段很长的文本内容需要被截断,10))# 这是一段很长...4.4 用切片实现文本分页defpaginate_text(text,page_size):将文本按指定大小分页return[text[i:ipage_size]foriinrange(0,len(text),page_size)]long_textPython编程语言是一门强大而优雅的语言适合各种开发场景。pagespaginate_text(long_text,10)fori,pageinenumerate(pages,1):print(f第{i}页:{page})五、切片的性能特性5.1 切片会创建新字符串textPythonslice_texttext[0:3]print(id(text))# 比如 14073512345print(id(slice_text))# 比如 14073567890不同的id# 切片创建了新字符串不是引用原字符串的一部分5.2 小字符串切片的优化# 对于非常小的字符串重复切片影响不大# 但对于大字符串如文件内容要注意# 如果只需要首尾等特定部分用索引而不是切片textHello# text[0:1] # 获取第一个字符但返回字符串H不是字符first_chartext[0]# 获取第一个字符返回字符H效率略高5.3 大文本切片建议# 处理大文本时如果频繁切片会产生大量临时字符串对象# 建议对需要多次使用的切片结果存到变量里# ❌ 低效defprocess_text_v1(text):foriinrange(1000):parttext[i:i100]process(part)# ✅ 高效defprocess_text_v2(text):foriinrange(0,len(text),100):parttext[i:i100]# 每个块只切片一次process(part)六、切片操作的实际应用6.1 提取日期各部分date_str2024-05-30yeardate_str[:4]monthdate_str[5:7]daydate_str[8:10]print(f{year}年{month}月{day}日)# 2024年05月30日6.2 解析固定格式的文本# 假设有固定格式的日志8位日期 6位时间 等级(4位) 消息log_entry20240530143000INFO用户登录成功timestamplog_entry[:14]# 20240530143000levellog_entry[14:18]# INFOmessagelog_entry[18:]# 用户登录成功print(f时间:{timestamp})print(f等级:{level})print(f消息:{message})6.3 生成密码掩码defmask_string(text,visible_chars4,mask_char*):将字符串的一部分隐藏iflen(text)visible_chars:returntext visible_parttext[-visible_chars:]masked_partmask_char*(len(text)-visible_chars)returnmasked_partvisible_part# 手机号脱敏phone13812345678print(mask_string(phone,4))# *******5678# 身份证号脱敏id_card110101199001011234print(mask_string(id_card,4))# **************1234# 银行卡号脱敏bank_card6222021234567890print(mask_string(bank_card,4))# ************78906.4 字符串轮转defrotate_string(text,n):将字符串向左轮转n位ifnottext:returntext n%len(text)# 处理n大于字符串长度的情况returntext[n:]text[:n]textPythonprint(rotate_string(text,1))# ythonPprint(rotate_string(text,2))# thonPyprint(rotate_string(text,-1))# nPytho负数右转七、切片的常见错误7.1 搞混索引和切片textHello# 索引返回单个字符print(text[0])# Hstr类型单个字符print(type(text[0]))# class str# 切片返回字符串print(text[0:1])# Hstr类型但是用切片取的print(type(text[0:1]))# class str# 注意两者的区别# text[0] vs text[0:1]# text[1] 如果超出范围会IndexError# text[0:1] 如果超出范围返回空字符串7.2 步长符号搞反textPython# 正向步长start必须小于stopprint(text[0:4:1])# PythOK0 4print(text[4:0:1])# start stop且step为正返回空# 反向步长start必须大于stopprint(text[4:0:-1])# ohtyOK4 0从索引4向索引0走print(text[0:4:-1])# start stop且step为负返回空# 反向取全部print(text[::-1])# nohtyP八、本篇小结✅ 索引和切片是Python字符串操作的核心技能。今天的内容索引从0开始text[0]是第一个字符text[-1]是最后一个切片语法[start:stop:step]包含start不包含stop省略规则text[:3]从头取text[3:]取到末尾text[:]取全部负步长反转text[::-1]是最简洁的字符串反转切片不报错越界切片自动调整比索引宽容性能注意大文本频繁切片会产生大量临时对象 索引和切片不仅在字符串中用列表、元组也支持相同的操作。掌握了这一套你就能在所有序列类型中游刃有余。下一篇我们深入字符串的常用方法——查找与替换。