所有標準的序列操作對字串都適用,但字串是不可變的
字串常量:
單引號:‘spa"m'
雙引號:"spa'm"
三引號:'''...spam...''',"""...spam..."""
逸出字元:"s\tp\na\om"
Raw字串:r"C:\new\test.spm"
Unicode字串:u'eggs\u0020spam
單雙引號是一樣的
單雙引號可以互換,字元常量運算式可以用兩個單引號或兩個雙引號來表示--兩種形式同樣有效返回相同類型的對象:
複製代碼 代碼如下:
>>> 'zxcvbn',"zxcvbn"
('zxcvbn', 'zxcvbn')
>>> #不適用逸出字元就可以實現在一個字串中包含其餘種類 的引號
>>> 'knight"s',"knight's"
('knight"s', "knight's")
可以自動在任意的運算式中合并相鄰的字串常量,儘管也可以使用+操作符實現:
複製代碼 代碼如下:
>>> title="sdfsd"'dfg'"fgfd"
>>> title
'sdfsddfgfgfd'
字串的格式化使用字元%來實現:
在%的左側放置一個字串,右側放置希望格式化的值,可以使用一個值,也可以使用多個值的元組或字典
複製代碼 代碼如下:
>>> format="Hello. %s. %s enough for ya?"
>>> values=('world','Hot')
>>> print format % values
Hello. world. Hot enough for ya?
如果需要轉換的元組作為轉換運算式的一部分存在,那麼必須將它用圓括弧括起來,以免出錯
長字串、原始字串
1、長字串
如果需要寫一個非常長的字串,需要跨多行,則可以使用三個引號代替普通引號
複製代碼 代碼如下:
>>> print '''this is
a
very long
string'''
this is
a
very long
string
如果一行之中最後一個字元是反斜線,那麼分行符號本身就“轉義”了,也就是被忽略了
複製代碼 代碼如下:
>>> print "hello.\
world!"
hello.world!
>>> #這個用法也適用運算式和語句
>>> 1+2+\
4+5
12
>>> print \
'hello.world'
hello.world
2、原始字串
原始字串以r開頭,可以在原始字串中放入任何字元,最後輸出的字串包含了轉義所用的反斜線,但是不能在字串結尾輸入反斜線:
複製代碼 代碼如下:
>>> print \
'hello.world'
hello.world
>>> print r'Let\'s go!'
Let\'s go!
>>> print r'this is illegal\'
SyntaxError: EOL while scanning string literal
索引與分區
字串的字元是通過索引來提取的,將獲得在特定位置的一個字元的字串。
Python位移量是從0開始的,並比字串的長度小1,還支援類似在字串中使用負位移這樣的方法從序列中擷取元素,負位移認作是從結束處反向計數
當使用一對冒號分隔的位移索引字串這樣的序列對象時,將擷取從下邊界直到但不包括上邊界的所有元素
索引(s[i])擷取特定位移的元素:
第一個元素的位移為0
負位移索引意味著從最後或右邊反向進行計數
s[0]擷取第一個元素
s[-2]擷取了倒數第二個元素
分區(s[i:j])提取對應的部分作為一個序列:
上邊界並不包含在內
分區的邊界預設為0和序列的長度,如果沒有給出的話
s[1:3]擷取從位移為1的元素,直到但不包括位移為3的元素
s[1:]擷取了從位移為1直到末尾之間的元素
s[:3]擷取了從位移為0直到但是不包括位移為3之間的元素
s[:-1]擷取了從位移為0直到但是不包括最後一個元素之間的元素
s[:]擷取了從位移0到末尾之間的元素
複製代碼 代碼如下:
>>> s='spam'
>>> s[0],s[-2]
('s', 'a')
>>> s[1:3],s[1:],s[:-1]
('pa', 'pam', 'spa')
>>> s[0],s[-2]
('s', 'a')
擴充分區:第三個限制值
分區運算式增加了一個可選的第三個索引,用作步進X[I:J:K]表示:索引X對象中的元素,從位移為I直到位移為J-1,每隔K元素索引一次
複製代碼 代碼如下:
>>> s='abcdefghijklmnop'
>>> s[1:10:2]
'bdfhj'
>>> s[::2]
'acegikmo'
>>> s='hello'
>>> s[::-1]
'olleh'
>>> s[4:1:-1]
'oll'
字串轉換工具
複製代碼 代碼如下:
>>> '42'+1
Traceback (most recent call last):
File "", line 1, in
'42'+1
TypeError: cannot concatenate 'str' and 'int' objects
>>> int('42'),str(42)
(42, '42')
>>> repr(42),'42'
('42', '42')
>>> s='42'
>>> i=1
>>> s+i
Traceback (most recent call last):
File "", line 1, in
s+i
TypeError: cannot concatenate 'str' and 'int' objects
>>> int(s)+i
43
>>> s+str(i)
'421'
>>> #類似也可以把浮點數轉換成字串或把字串轉換成浮點數
>>> str(3.1415),float("1.3")
('3.1415', 1.3)
>>> text='1.23E-10'
>>> float(text)
1.23e-10
字串代碼轉換
單個字元也可以通過將其傳給內建的ord函數轉換為其對應的ASCII碼,chr函數則執行相反的操作:
複製代碼 代碼如下:
>>> ord('s')
115
>>> chr(115)
's'
字串方法
字串比列表的方法還要豐富很多,因為字串從string模組中“繼承”了很多方法,本篇文章只介紹一些特別有用的字串方法
1、find
find方法可以在一個較長的字串中尋找一個子字串,它返回子串所在位置的最左端索引,如果沒有找到則返回-1
複製代碼 代碼如下:
>>> 'with a moo-moo here, and a moo-moo there'.find('moo')
7
>>> title="Monty Python's Flying Cirus"
>>> title.find('Monty')
0
>>> title.find('Python')
6
>>> title.find('Zirquss')
-1
這個方法可以接受可選的起始點和結束點參數:
複製代碼 代碼如下:
>>> subject='$$$ Get rich now!!! $$$'
>>> subject.find('$$$')
0
>>> subject.find('$$$',1)
20
>>> subject.find('!!!')
16
>>> subject.find('!!!',0,16)
-1
2、join
join方法是非常重要的字串方法,它是split方法的逆方法,用來在隊列中添加元素:
複製代碼 代碼如下:
>>> seq=[1,2,3,4,5]
>>> sep='+'
>>> sep.join(seq)
Traceback (most recent call last):
File "", line 1, in
sep.join(seq)
TypeError: sequence item 0: expected string, int found
>>> seq=['1','2','3','4','5']
>>> sep.join(seq)
'1+2+3+4+5'
>>> dirs='','usr','bin','env'
>>> '/'.join(dirs)
'/usr/bin/env'
>>> print 'C:'+'\\'.join(dirs)
C:\usr\bin\env
3、lower
lower方法返回字串的小寫字母片
複製代碼 代碼如下:
>>> 'HDWUD HDJHS LKJDS'.lower()
'hdwud hdjhs lkjds'
4、replace
replace方法返回某字串的所有匹配項均被替換後得到字串
複製代碼 代碼如下:
>>> 'This is a test'.replace('is','eez')
'Theez eez a test'
5、split
它是join的逆方法,用來將字串分割成序列
複製代碼 代碼如下:
>>> '1+2+3+4+5'.split('+')
['1', '2', '3', '4', '5']
>>> 'C:\usr\bin\env'.split('/')
['C:\\usr\x08in\\env']
>>> 'Using the default'.split()
['Using', 'the', 'default']
注意:如果不提供任何分隔字元,程式會把所有的空格作為分隔字元
6、strip
strip方法返回去除兩側(不包含內部)空格的字串:
複製代碼 代碼如下:
>>> ' internal whitespace is kept '.strip()
'internal whitespace is kept'
也可指定需要去除的字元,將它們列為參數即可:
複製代碼 代碼如下:
>>> '*** SPAM * for * everyone!!! ***'.strip(' *!')
'SPAM * for * everyone'
注意:只會去除兩側的字元
7、translate
translate方法和replace方法一樣,可以替換字串中的某些部分,但是和前者不同的是,translate方法只處理單個字元