之前講到,字符串的定義就是把一些字符序列用引號引起來。例如:
s = 'abc'
上面這行代碼的執行過程:先創建一個字符串對象,并初始化里面字符串的值為'a', 'b', 'c'的序列,再把指針s指向這個對象。如下圖所示:

字符串的序列操作
我們知道字符串內部是一個字符序列。作為序列,我們可以用下標來索引。例如:
c = s[0] # c = 'a'
c = s[1] # c = 'b'
還可以從字符序列的末尾開始索引,-1代表最后一個字符,-2代表倒數第二個字符,... 例如:
c = s[-1] # c = 'c'
c = s[-2] # c = 'b'
另外字符串還支持切片(slice)操作,取出給定兩個下標之間的字符序列(包括開始下標的字符,但不包括結束下標的字符。用數學區間的[a:b)來描述是不是更清楚點呢)。例如:
c = s[0:2] # c = 'ab'
c = s[1:2] # c = 'b'
c = s[1:-1] # c = 'b'
這一點很像verilog的位寬操作,例如:reg s[7:0] = 8'h5a,那我們可以c = s[3:0]來取出3到0位的4'ha。只是verilog是閉區間的。
在切片時,當開始下標是0,冒號前的下標可以省略;結束下標指向最后一個元素,冒號后的下標也可省略。所以上面的切片可以簡化成:
c = s[:2] # c = 'ab'
c = s[1:] # c = 'bc'
當開始下標和結束下標都省略時,s[:]表示整個字符序列'abc'。
注意理解 s[1:-1]和s[1:]的區別,前者不包括最后一個字符,而后者包括。
作為字符序列,還支持拼接和重復操作。例如:
s1 = 'abc'
s2 = s1 + 'def' # s2 = 'abcdef'
s3 = s1 * 3 # s3 = 'abcabcabc'
另外我們要注意字符序列的只讀性。我們不可以對字符賦值,s[0] = 'd'是非法的。但我們可以迂回:
s = 'abc'
s = 'd' + s[1:]
但要注意,第二句并不是簡單的修改s對象的元素值,而是用拼接產生了一個全新對象,并讓s指向新的對象。
字符串類型的操作
除了序列操作外,字符串本身作為一種類,自帶了很多操作函數(類的方法)。下表列出了一些常用的操作:

index, find
position = index(substr, begin=0, end=len(string))
position = find(substr, begin=0, end=len(string))
描述:index和find函數的作用相同,都是查找子字符串。可以指定開始和結束索引,在一個范圍內查找。
返回值:子字符串的起始索引值。index和find的區別是,當沒有找到子字符串時,index報錯,而find返回-1。
例如:
s = 'abcdefdef'
p1 = s.find('de') # p1 = 3
p2 = s.index('de', 5) # p2 = 6
replace
str_new = replace(substr_old, substr_new[, max])
描述:替換函數,如其名,查找子字符串substr_old,替換成substr_new。第三個參數是可選的,指定替換的最大次數,默認是全部替換。
返回值:返回替換后的新字符串。
例如:
s = 'abcdefdef'
s1 = s.place('de', 'gh') # s1 = 'abchgfhgf'
s2 = s.place('de', 'gh',1) # s1 = 'abchgfedf'
split
list = split(str=' ', num)