字符串屬于標(biāo)量存儲(chǔ)尿这、不可改變、順序訪問的數(shù)據(jù)類型倦微。字符串屬于序列的一種,因此對(duì)字符串可行的序列操作對(duì)類似元組和列表同樣適用正压。
1. 字符串的創(chuàng)建
類似于數(shù)字類型的創(chuàng)建欣福,直接將字符串賦值給變量即可創(chuàng)建一個(gè)新的字符串對(duì)象。
>>> a = 'string' # 使用單引號(hào)
>>> a = "string" # 使用雙引號(hào)焦履,在 Python 中拓劝,單引號(hào)和雙引號(hào)沒有區(qū)別
>>> a = '''
... a
... string
... block ''' # 使用三引號(hào),字符串塊(三引號(hào)在某些情況下可以起到注釋掉不需要執(zhí)行的代碼的作用)
>>> a
'\na\nstring\nblock '
>>> a = ''
'' # 空字符
對(duì)變量重新賦值一個(gè)新的字符串即可 “ 更新 ” 變量
>>> a = 'string1'
>>> a
'string1'
>>> a = 'string2'
>>> a
'string2'
2. 轉(zhuǎn)義字符
一個(gè)反斜線加一個(gè)單一字符嘉裤,可以表示一些通常情況下不可打印的字符郑临,這種組合稱為轉(zhuǎn)義字符。
>>> a = 'string1\nstring2' # \n 代表換行符屑宠,雖然由兩個(gè)字符組成厢洞,但在最終表示中會(huì)被一個(gè)單一字符替代
>>> print a
string1
string2
常用的轉(zhuǎn)義字符包括:
轉(zhuǎn)義字符 | 代表含義 |
---|---|
\n | 換行 |
\t | 橫向制表符(tab) |
\\ | 反斜線( \ ) |
' | 單引號(hào) |
" | 雙引號(hào) |
\u | 后跟四位十六進(jìn)制數(shù),表示 Unicode 字符串 |
當(dāng)我們不需要對(duì)字符進(jìn)行轉(zhuǎn)義時(shí)典奉,可以使用原始字符串操作符 raw 字符串躺翻。在原始字符串中,所有的字符都是直接按照輸入的字符來使用卫玖,沒有轉(zhuǎn)義或不能打印的字符公你。使用 raw 只需要在字符串前加 r/R 即可。
>>> a = r'string1\nstring2'
>>> print a
string1\nstring2 # 輸出的結(jié)果和輸入一樣假瞬,沒有進(jìn)行轉(zhuǎn)義
>>> a
'string1\\nstring2' # Python 自身在顯示 '\' 時(shí)也會(huì)使用轉(zhuǎn)義字符 '\\'
- 注:在交互模式下
print a
和直接顯示a
的區(qū)別:使用print
可以顯示變量格式化以后的顯示效果陕靠,而直接輸入變量名則會(huì)顯示變量的值在 Python 內(nèi)部的表示形式。
3. Unicode 字符串
如果需要使用 Unicode 字符串時(shí)脱茉,可以在字符串前加 u/U 即可使用 Unicode 字符串
>>> a = u'abc'
>>> a
u'abc'
>>> a = u'\u1234' # 使用 \u 轉(zhuǎn)義字符剪芥,\u 后為十六進(jìn)制
>>> print a
?
4. 基本操作(適用于所有序列對(duì)象)
-
比較操作
字符串進(jìn)行比較操作時(shí)按照在 ASCII 或 Unicode 中的數(shù)值大小進(jìn)行比較
-
連接操作
可以使用 ' +' 操作符對(duì)字符串進(jìn)行連接
a = 'a'
b = 'b'
a + b
'ab'
```
-
重復(fù)操作
使用 '*' 操作符將字符串重復(fù) N 次
a = 'a'
a * 7
'aaaaaaa'
```
-
成員操作
in / not in 可以用于判斷一個(gè)字符或字符串是否出現(xiàn)在另一個(gè)字符串中
'ab' in 'abcd'
True
'ac' in 'abcd'
a = 'string1'
>>> a
'string1'
>>> a = 'string2'
>>> a
'string2'
### 2. 轉(zhuǎn)義字符 一個(gè)反斜線加一個(gè)單一字符,可以表示一些通常情況下不可打印的字符琴许,這種組合稱為轉(zhuǎn)義字符粗俱。
>>> a = 'string1\nstring2' # \n 代表換行符,雖然由兩個(gè)字符組成,但在最終表示中會(huì)被一個(gè)單一字符替代
>>> print a
string1
string2
常用的轉(zhuǎn)義字符包括: | 轉(zhuǎn)義字符 | 代表含義 | | ------------ | ------------ | | \n | 換行 | | \t | 橫向制表符(tab)| | \\\ | 反斜線( \ )| | \' | 單引號(hào) | | \" | 雙引號(hào) | | \u | 后跟四位十六進(jìn)制數(shù)寸认,表示 Unicode 字符串 | 當(dāng)我們不需要對(duì)字符進(jìn)行轉(zhuǎn)義時(shí)签财,可以使用原始字符串操作符 raw 字符串。在原始字符串中偏塞,所有的字符都是直接按照輸入的字符來使用唱蒸,沒有轉(zhuǎn)義或不能打印的字符。使用 raw 只需要在字符串前加 r/R 即可灸叼。
>>> a = r'string1\nstring2'
>>> print a
string1\nstring2 # 輸出的結(jié)果和輸入一樣神汹,沒有進(jìn)行轉(zhuǎn)義
>>> a
'string1\nstring2' # Python 自身在顯示 '' 時(shí)也會(huì)使用轉(zhuǎn)義字符 '\'
- 注:在交互模式下 `print a` 和直接顯示 `a` 的區(qū)別:使用 `print` 可以顯示變量格式化以后的顯示效果,而直接輸入變量名則會(huì)顯示變量的值在 Python 內(nèi)部的表示形式古今。 ### 3. Unicode 字符串 如果需要使用 Unicode 字符串時(shí)屁魏,可以在字符串前加 u/U 即可使用 Unicode 字符串
>>> a = u'abc'
>>> a
u'abc'
>>> a = u'\u1234' # 使用 \u 轉(zhuǎn)義字符,\u 后為十六進(jìn)制
>>> print a
?
### 4. 基本操作(適用于所有序列對(duì)象) - 比較操作 字符串進(jìn)行比較操作時(shí)按照在 ASCII 或 Unicode 中的數(shù)值大小進(jìn)行比較 - 連接操作 可以使用 ' +' 操作符對(duì)字符串進(jìn)行連接
>>> a = 'a'
>>> b = 'b'
>>> a + b
'ab'
- 重復(fù)操作 使用 '*' 操作符將字符串重復(fù) N 次
>>> a = 'a'
>>> a * 7
'aaaaaaa'
- 成員操作 in / not in 可以用于判斷一個(gè)字符或字符串是否出現(xiàn)在另一個(gè)字符串中
>>> 'ab' in 'abcd'
True
>>> 'ac' in 'abcd'
False
'ac' not in 'abcd'
True
```
5. 索引和切片(適用于所有的列表和對(duì)象)
序列對(duì)象從 0 開始進(jìn)行索引捉腥,通過指定元素索引或切片對(duì)序列對(duì)象中的元素進(jìn)行訪問氓拼,語法如下:squence[index]
>>> a = 'string'
>>> a[0]
's' # 序列的索引從 0 開始
>>> a[5]
'g' # 序列索引的最大值比序列的長度小 1
除此之外,還可以使用 負(fù)索引抵碟,范圍是 -1 到序列的負(fù)長度桃漾。正負(fù)索引的區(qū)別在于正索引以序列的開始為起點(diǎn)( 0 ),負(fù)索引以序列的結(jié)束為起點(diǎn)( -1 )拟逮。負(fù)索引 + 序列長度 = 正索引
>>> a[-1]
'g' # 負(fù)索引從 -1 開始
>>> a[-6]
'a' # 負(fù)索引的最大值是序列的負(fù)長度撬统,正索引的最大值是長度 len(squence) - 1
如果在訪問序列的索引越界會(huì)引發(fā)一個(gè)異常:
>>> a[6] # 正索引的最大值應(yīng)該是長度 - 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
通過索引可以訪問指定偏移量的某一個(gè)元素,而切片操作則可用來訪問序列中指定的多個(gè)元素敦迄。切片操作只需要給出切片的開始和結(jié)束的索引值恋追,中間用 ' : ' 分隔開即可: squence [ start_index : end_index ]
>>> a[1:3]
'tr' # 切片會(huì)截取從起始索引到結(jié)束索引,但不包括結(jié)束索引
>>> a[:3]
'str' # 如果不指定起始索引罚屋,默認(rèn)為序列的開始
>>> a[1:]
'tring' # 如果不指定結(jié)束索引几于,默認(rèn)到序列的結(jié)束
>>> a[:]
'string' # 需要指出的是,所有字符串的操作都相當(dāng)于創(chuàng)建了一個(gè)新的字符串沿后,通過這種方法可以對(duì)字符串進(jìn)行拷貝
>>> a[1:-1]
'trin' # 在切片中同樣可以使用負(fù)索引
切片操作還有第三個(gè)參數(shù)沿彭,起到類似步長的作用。不指定時(shí)默認(rèn)為 1
>>> a[::2]
'srn'
>>> a[::-1]
'gnirts' # 可以通過這樣來獲得一個(gè)序列的倒序
切片不同于索引尖滚,不存在越界引起的異常
>>> a[-100:100]
'string' # 在切片中當(dāng)起始或結(jié)束索引越界會(huì)使用默認(rèn)值
在切片中使用 None
>>> a[:0]
'' # 在結(jié)束索引使用 0 時(shí)會(huì)返回空字符串
>>> a[:None]
'string' # 使用 None 則會(huì)返回整個(gè)字符串
>>> a[None:]
'string'
>>> a[None:None]
'string'
6. 序列的一些內(nèi)建函數(shù)
對(duì)序列對(duì)象有一些通用且常用的內(nèi)建函數(shù):
- len():返回序列中元素的長度
>>> len(a)
6 # 返回字符串的長度
- max() 和 min():返回序列中的最大值和最小值
>>> max(a)
't' # 返回字符串元素中的最大值
>>> min(a)
'g' # 返回字符串元素中的最小值
- sorted():對(duì)序列中的對(duì)象進(jìn)行排序
>>> sorted(a)
['g', 'i', 'n', 'r', 's', 't']
- reversed():對(duì)列表中的所有元素反序輸出
>>> for i in reversed(a):
... print i,
g n i r t s
- enumerate():生成一個(gè) enumerate 對(duì)象喉刘,該對(duì)象為每個(gè)元素的索引和值組成的元組
>>> for i in enumerate(a):
... print i
...
(0, 's')
(1, 't')
(2, 'r')
(3, 'i')
(4, 'n')
(5, 'g')
- zip():接受兩個(gè)序列參數(shù),生成一個(gè)列表漆弄,列表中的元素分別為由兩個(gè)參數(shù)按順序的兩個(gè)元素所組成的元組
>>> zip(a, a)
[('s', 's'), ('t', 't'), ('r', 'r'), ('i', 'i'), ('n', 'n'), ('g', 'g')]
7. 字符串類型函數(shù)
- raw_input():可以使用給定的字符串提示用戶輸入并將輸入返回賦值給變量睦裳。
>>> a = raw_input("Please input something: ") # 函數(shù)接受的字符串參數(shù)即為輸出在屏幕上提示用戶輸入的字符串
Please input something: string # 輸入字符串:string
>>>
>>> print a # 上邊的輸入 string 已經(jīng)賦值給變量 a
string
chr() 和 unichr():chr 接受一個(gè)ASCII 碼,即 0-255 之間的整數(shù)撼唾,返回對(duì)應(yīng)的字符廉邑。unichr 則接受一個(gè) Unicode 碼,返回對(duì)應(yīng)的 Unicode 字符
ord():ord 作為 chr 和 unichr 的對(duì)應(yīng)函數(shù),返回一個(gè)字符的 ASCII 或 Unicode 數(shù)值
>>> chr(97)
'a' # 接受一個(gè) 0-255 的整數(shù)蛛蒙,返回對(duì)應(yīng)的ASCII 字符
>>> unichr(1234)
u'\u04d2' # 接受一個(gè) 0-65535 的整數(shù)糙箍,返回對(duì)應(yīng)的Unicode 碼
>>> print unichr(1234)
?
>>> ord('a')
97 # 接受一個(gè) ASCII 字符,返回對(duì)應(yīng)的數(shù)值
>>> ord(u'\u04d2')
1234 # 接受一個(gè) Unicode 字符牵祟,返回對(duì)應(yīng)的數(shù)值
- str() 和 unicode():將參數(shù)轉(zhuǎn)換為字符串或 unicode 字符串
>>> str(123)
'123' # 將數(shù)字 123 轉(zhuǎn)換為字符串
>>> unicode(123)
u'123' # 將數(shù)字轉(zhuǎn)換為 unicode 字符串
8. 字符串內(nèi)建函數(shù)
-
string.strip():刪除 sting 字符串開頭和末尾的空格
a = '\tstring\n'
a.strip()
'string' # 將字符串前后空格都刪除深夯,lstrip() 和 rstrip() 分別刪除開頭和結(jié)尾的空格
```
-
string.split(str):以 str 為分隔符將字符串進(jìn)行分隔
a = 's t r i n g'
a.split(' ')
['s', 't', 'r', 'i', 'n', 'g'] # 以空格為分隔符將字符串進(jìn)行分隔
```
-
string.join(seq):以 string 為分隔符,將 seq 中的所有元素合并為一個(gè)新的字符串
a = ['s', 't', 'r', 'i', 'n', 'g']
' '.join(a)
>>> print a # 上邊的輸入 string 已經(jīng)賦值給變量 a
string
- __chr()__ 和 __unichr()__:chr 接受一個(gè)ASCII 碼诺苹,即 0-255 之間的整數(shù)咕晋,返回對(duì)應(yīng)的字符。unichr 則接受一個(gè) Unicode 碼收奔,返回對(duì)應(yīng)的 Unicode 字符 - __ord()__:ord 作為 chr 和 unichr 的對(duì)應(yīng)函數(shù)掌呜,返回一個(gè)字符的 ASCII 或 Unicode 數(shù)值
>>> chr(97)
'a' # 接受一個(gè) 0-255 的整數(shù),返回對(duì)應(yīng)的ASCII 字符
>>> unichr(1234)
u'\u04d2' # 接受一個(gè) 0-65535 的整數(shù)坪哄,返回對(duì)應(yīng)的Unicode 碼
>>> print unichr(1234)
?
>>> ord('a')
97 # 接受一個(gè) ASCII 字符质蕉,返回對(duì)應(yīng)的數(shù)值
>>> ord(u'\u04d2')
1234 # 接受一個(gè) Unicode 字符,返回對(duì)應(yīng)的數(shù)值
- __str()__ 和 __unicode()__:將參數(shù)轉(zhuǎn)換為字符串或 unicode 字符串
>>> str(123)
'123' # 將數(shù)字 123 轉(zhuǎn)換為字符串
>>> unicode(123)
u'123' # 將數(shù)字轉(zhuǎn)換為 unicode 字符串
### 8. 字符串內(nèi)建函數(shù) - __string.strip()__:刪除 sting 字符串開頭和末尾的空格
>>> a = '\tstring\n'
>>> a.strip()
'string' # 將字符串前后空格都刪除损姜,lstrip() 和 rstrip() 分別刪除開頭和結(jié)尾的空格
- __string.split(str)__:以 str 為分隔符將字符串進(jìn)行分隔
>>> a = 's t r i n g'
>>> a.split(' ')
['s', 't', 'r', 'i', 'n', 'g'] # 以空格為分隔符將字符串進(jìn)行分隔
- __string.join(seq)__:以 string 為分隔符饰剥,將 seq 中的所有元素合并為一個(gè)新的字符串
>>> a = ['s', 't', 'r', 'i', 'n', 'g']
>>> ' '.join(a)
's t r i n g' # 用空格將 a 中的元素合并成新的字符串
''.join(a)
'string' # 當(dāng)不指定 string 時(shí)殊霞,直接合并
```
-
string.find(sr):檢測(cè) str 是否在字符串中摧阅,如果時(shí)返回索引,否則返回 -1
a = 'strings'
a.find('s')
0 # 結(jié)果總是返回第一個(gè)找到的索引
a.find('a')
-1 # 沒有找到時(shí)返回 -1
```
-
string.index(str):與 find 類似绷蹲,但不存在時(shí)引發(fā)一個(gè)異常
a = 'strings'
a.index('s')
0 # 同樣返回第一個(gè) str 的索引
a.index('a') # 與 find 不同棒卷,str 不存在時(shí)引發(fā)一個(gè)異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
```
-
string.count(str):返回 str 在字符串中出現(xiàn)的次數(shù)
a = 'strings'
a.count('s')
2
```
- string.upper() 和 string.lower():分別將字符串字符轉(zhuǎn)換為大寫和小寫
>>> a = 'String123'
>>> a.upper()
'STRING123' # 將字符串 a 中的所有字母大寫,非字母不變
>>> a.lower()
'string123' # 將字符串 a 中的所有字母小寫祝钢,非字母不變
-
string.partition(str):find() 和 split() 的結(jié)合比规,從 str 出現(xiàn)的第一個(gè)位置起,將 string 分成三元組 (string_pre_str, str, string_post_str)拦英, 如果不包含 str蜒什,string_pre_str = string
a = 'string'
a.partition('r')
('st', 'r', 'ing')
a.partition('a')
('string', '', '')
```
-
string.replace(str1,str2) :把 str1 替換為 str2
a = 'strings'
a.replace('s', 'x')
'xtringx' # 把 string 中所有的 str1 替換為 str2,可以指定替換的次數(shù)參數(shù)
a.replace('a', 'x')
'string' # string 中不包含 str1 時(shí)疤估,不做任何操作
```
更多關(guān)于字符串的內(nèi)建函數(shù)參考:String Method
9.字符串格式化
Python 中的字符串格式化操作灾常,類似于 C 語言中的 printf() 函數(shù)的字符串格式化,語法如下:
在 % 操作符的左側(cè)放置一個(gè)需要進(jìn)行格式化的字符串铃拇,這個(gè)字符串帶有一個(gè)或多個(gè)嵌入的轉(zhuǎn)換目標(biāo)钞瀑,都以 % 開頭。
在 % 操作符的右側(cè)放置一個(gè)或多個(gè)(元組)對(duì)象慷荔,這些對(duì)象會(huì)插入到左側(cè)需要進(jìn)行格式化的一個(gè)或多個(gè)轉(zhuǎn)換目標(biāo)的位置上去雕什。
>>> "That is %d %s bird!" % (1, 'little')
That is 1 little bird!
在上邊這個(gè)例子中,整數(shù) 1 替換在格式化字符串左側(cè)的 %d, 字符串 'little' 替換 %s贷岸,從而得到一個(gè)新的格式化了的字符串壹士。
如果不使用格式化字符串,我們可以使用多次字符串的合并和轉(zhuǎn)換來達(dá)到目的凰盔,但十分麻煩墓卦。
>>> "That is " + str(1) + " little " "bird !"
That is 1 little bird!
通常根據(jù)需要轉(zhuǎn)換的目標(biāo)不同,左側(cè) % 操作符后邊的符號(hào)也不相同户敬,常見的格式化代碼如下
代碼 | 意義 |
---|---|
%s | 字符串 |
%r | 使用 repr 的字符串 |
%d | 十進(jìn)制整數(shù) |
%i | 整數(shù) |
%f | 浮點(diǎn)十進(jìn)制數(shù) |
從高級(jí)的應(yīng)用來說落剪,表達(dá)式左側(cè)的轉(zhuǎn)換目標(biāo)有一套完整的語法:
`%[(name)][flag][width][.precision]typecode`
上表中的字符碼出現(xiàn)在目標(biāo)字符串的尾部,在 % 和字符碼之間尿庐,可以有以下操作:
- 放置一個(gè)字典的鍵
[(name)]
- 列出左對(duì)齊
-
忠怖、正號(hào)+
和補(bǔ)零0
的標(biāo)志位[flag]
- 給出數(shù)字的整體長度和小數(shù)點(diǎn)后的位數(shù)等
[width] [.precision]
>>> "***%d***%-6d***%06d***%+d***" % (123, 123, 123, 123)
'***123***123 ***000123***+123***' # %-6d 表示左對(duì)齊抄瑟,%06d 表示補(bǔ)零
>>> "***%.2f***" % (123.456)
***123.46*** # %.2f 表示保留浮點(diǎn)數(shù)小數(shù)點(diǎn)后2位
>>> "That is %(number)d little %(name)s !" % {'number':1, 'name':'bird'}
That is 1 little bird ! # 使用字典進(jìn)行格式化
format() 方法:在 Python 2.6 和 3.0 以后的版本引入了一種新的格式化方法凡泣,format() 函數(shù)
>>> "That is {0} little {1} !".format(1, 'bird')
That is 1 little bird !
格式化總是會(huì)返回新的字符串作為結(jié)果而不是對(duì)左側(cè)的字符串進(jìn)行修改,如果需要的話皮假,必須將格式化字符串賦值給一個(gè)變量來保存結(jié)果鞋拟。
更多關(guān)于字符串格式化的參考:String format
更多關(guān)于字符串的參考:Sequence Type