在《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.companysz.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.companysz.com"
>>> str2 = str1[ 7 : 17 : 3]
>>> print(str2)
w.yu
>>> "武林網VEVB"[1 : 6 : 2]
'宇I樂'
>>>
從這個例子中可以看出,我們也可以直接使用字符串本值來進行切片截取。
6、使用負數索引
在進行字符串切片時,也可以使用負數索引,從后往前進行索引操作。
str1 = "www.companysz.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!
本文(完)
新聞熱點
疑難解答