在《Python字符串的索引与访问字符串中的字符》文章中介绍了使用字符串位置索引可以访问字符串中的单个字符的方法,但有时,我们需要访问字符串中的若干个连续的字符,即使用字符串中的一个子串。Python针对这种情况也提供了比较方便的处理方式。
简单说,Python字符串切片就是按照指定索引截取字符串中的片段构成一个新的字符串。
str_object[start_pos : end_pos : step]
切片从 start_pos 开始(包含起始位置索引处的字符),结束于 end_pos(不包含结束位置索引处的字符);
step 表示步长,即每step个字符截取1次字符;
Python字符串切片语法中的三个参数都是可选的,start_pos 默认为0,end_pos 默认为字符串长度(字符个数),step 默认为1;
在Python中,对于任何索引 i ,都遵循 s[:i] + s[i:] = s 的规则。
截取字符串中的任何字符索引 i 在源字符串中的索引应满足:
start_pos <= i < end_pos
即截取时,包含开始位置的字符,而不包含结束位置处的字符。
当指定步长 step 时,截取的字符的索引 i 应该是:
i = start_pos + n * step , n 取 0,1,2......
同时,i < end_pos ,即指定步长时,截取的字符也不包含结束位置 end_pos 处的字符。
1、使用 start_pos 参数
>>> str1 = "Python is easy."
>>> str2 = str1[3 : ] # 从索引位置3,即字符h开始到最后
>>> print(str2)
hon is easy.
>>> s = "武林网VEVB"
>>> print(s[3 : ]) # 从索引位置3,即字符 I 开始到最后
VEVB
在Python中的运行情况截图:
2、只使用 end_pos 参数
>>> str1 = "Python is easy."
>>> str2 = str1[:6] # 截取前 6 个字符,即索引位置0-5
>>> print(str2)
Python
>>> s = "武林网VEVB"
>>> print(s[:3]) # 截取前3个字符,即索引0-2处的字符
武林网
end_pos 为截取停止位置,不包含在截取范围内。
在Python中的运行情况:
3、只指定 step 参数
>>> str1 = "http://www.VeVb.com"
>>> str2 = str1[ : : 2]
>>> print(str2)
ht:/w.ieucm
>>> s = "武林网VEVB"
>>> s[ : : 3]
'翔I园'
>>>
在指定步长 step 参数时,处于开始索引位置处的字符是一定包含在内的,然后是按照 step 指定的步长,每次从当前索引处加 step 步长进行截取。如下图阴影处示意。
str1 | h | t | t | p | : | / | / | w | w | w | . | b | i | y | e | 5 | u | . | c | o | m |
字符索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
step | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | |
str2 | h | t | : | / | w | . | i | e | u | c | m |
在Python中的运行效果如下图:
4、同时指定 start_pos 和 end_pos 参数
>>> s1 = "武林网VEVB提供详细的Python教程"
>>> s1[7 : 11]
'提供详细'
>>> s2 = "Python/tR/tSPSS/r/nJava"
>>> s2[4 : 16]
'on/tR/tSPSS/r/nJ'
>>>
要注意的是:end_pos 参数是停止位置索引,不包含在截取范围内,如 s1[7 : 11] 是截取的索引为 7 到 10 处的字符。
还要注意到,转义字符也算作一个字符,如 s2 中的 /t ,/r 和 /n ,它们分别被作为一个字符来处理。
在Python中的运行情况如下图所示:
5、同时指定3个参数的情况
>>> str1 = "http://www.VeVb.com"
>>> str2 = str1[ 7 : 17 : 3]
>>> print(str2)
w.yu
>>> "武林网VEVB"[1 : 6 : 2]
'宇I乐'
>>>
从这个例子中可以看出,我们也可以直接使用字符串本值来进行切片截取。
6、使用负数索引
在进行字符串切片时,也可以使用负数索引,从后往前进行索引操作。
str1 = "www.VeVb.com"
str2 = str1[-3 : ]
print(str2)
str3 = str1[ :-4]
print(str3)
str4 = str1[-10: -4]
print(str4)
str5 = str1[-13 : -1 : 2]
print(str5)
str6 = str1[-1 : -13 : -2]
print(str6)
当 start_pos 和 end_pos 为负数时,是相对于字符串序列末端进行的,从末端进行时,最后一个字符的索引为 -1,然后往前依次为 -2 ,-3 ...。
当 step 为负数时,开始位置是从字符串后端开始,结束位置在字符串前端,所以 这时如需要切到想要的子字符串,需要保证: start_pos > end_pos 。
本例的示意图如下所示:图中绿色方块代表截取开始位置,灰色方块代表截取停止位置。
str1 | w | w | w | . | b | i | y | e | 5 | u | . | c | o | m |
字符索引 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
负数索引 | -14 | -13 | -12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
str2=str1[-3:] | c | o | m | |||||||||||
str3=str1[:-4] | w | w | w | . | b | i | y | e | 5 | u | ||||
str4=str1[-10:-4] | b | i | y | e | 5 | u | ||||||||
str5=str1[-13:-1:2] | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | |||
w | . | i | e | u | c | |||||||||
step为正,从左往右生成新字符串: 'w.ieuc' |
||||||||||||||
str6=[-1:-13:-2] | -1 | -2 | -1 | -2 | -1 | -2 | -1 | -2 | -1 | -2 | -1 | |||
. | i | e | u | c | m | |||||||||
step为负:从右往左生成新字符串:'mcuei.' |
输出结果:
com
www.VeVb
VeVb
w.ieuc
mcuei.
我们可以使用字符串切片功能把字符串进行翻转:
s1 = "武林网VEVB"
s2 = s1[ : : -1]
print(s2)
输出结果:
园乐TI亭宇翔
7、省略所有参数
当使用下面两种形式时,相当于各参数取默认值
s = "Hello,Python!"
s1 = s[ : : ] # 从头截到尾
s2 = s[ : : : ] # 从头截到尾,默认步长1
print('s1=', s1)
print('s2=', s2)
输出结果:
Hello,Python!
Hello,Python!
本文(完)
新闻热点
疑难解答