#10 Python字符串

前言

經過上一節可知,Python6個序列的內置類型中,最多見的是列表和元組,但在Python中,最經常使用的數據類型卻不是列表和元組,而是字符串。要想深刻了解字符串,必須先掌握字符編碼問題。所以本篇博文將講解Python字符編碼問題和Python字符串的具體方法!python

1、Python字符編碼

前提:計算機只認識兩個數字:0和1,計算機在處理任何數據時,都要將數據轉換爲這兩個數字的組合。git

1.計算機的單位制

計算機在設計時,最小單位是 位(bit) ,位裏面只能有兩種狀況,0或者1。位太過單調,只有兩種狀況,顯然沒法處理數據,因此引入 字節(byte ,1字節=8位(1B = 8b),也就是說計算機一次能處理8位數據,早期的計算機都是8位的,如今的計算機有32位的,有64位的,顯然如今的計算機相比之前運算能力大大提升。1字節能表示的最大整數爲255(二進制1111 1111 = 十進制255)。對於存儲介質來講,1個字節存儲能力顯然太弱,因而就有了KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB.....的出現:程序員

1TB=1024GB     1GB=1024MB    1MB=1024KB    1KB=1024B    1B=8b編程

2.ASC碼

因爲計算機沒法識別人類使用的語言,因此聰明的人類創造了一種映射關係,即讓某一個數字映射到人類語言的某一個字符,好比:1---> A,這樣計算機就能夠識別人類語言了。由於第一臺計算機是在美國誕生的,最先美國人只將經常使用的符號、大寫英文和小寫英文共127個字符編碼映射到計算機中,這個編碼表就是著名的ASC編碼表,這個ASC碼錶最多隻有8位,也就是說最多隻能表示255個字符。api

3.GB2312

後來計算機推向全球,中國人也要使用,可是早期的電腦裏只有ASC碼,中國人確定不樂意啊,我大中華幾千年的優秀文化,最牛的就是漢字了!然而漢字有好多啊,可不止255個,就算把ASC碼錶從新編一次,也不夠用啊,再說,ASC碼錶誰也不能從新編人家,那怎麼辦呢?聰明的中國程序員對漢字進行了分區,分爲94個區,每一個區裏有94個漢字。查找漢字時,找到它所在的區,再找到它所在區的哪一個位置,就對一個漢字精肯定位了,因此GB2312又稱爲區位碼。GB2312中共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個,同時收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西裏爾字母在內的682個字符。ssh

4.GBK

後來,中國人又出現了新問題,GB2312支持的漢字太少了,隨着國人人取名字愈來愈奇葩( ̄_ ̄|||),GB23132根本就沒法處理,因而GBK就應運而生了。GBK支持的字符那是至關的多,如今中國計算機使用的依舊是GBK,不信你能夠驗證一下,再Windows下的命令行裏輸入 chcp ,應該會顯示Active code page:936 ,這個936就表明GBk。ide

5.Unicode

隨着計算機在各國的普及,每一個國家都有本身獨特的編碼方式,就出現了新的問題,日本人開發的軟件在中國的計算機上運行的時候,會出現亂碼,這樣就會形成溝通障礙,爲了解決相似問題,國際上的計算機頭頭組織決定讓全世界的編碼統一,因而Unicode就出現了,Unicode規定每一個字符最少用16位表示。成功統一的編碼,這就時Unicode。優化

6.UTF-8

Unicode的出現,幾家歡喜幾家愁啊,中國人以爲海星,美國人不樂意了,原來個人全部字符都是用8位(1字節)表示,如今莫名其妙就要用16位(2字節)表示,原本1GB的文件,如今變成2GB了,擱誰也受不了啊!那怎麼辦呢?因而UTF-8便出現了,UTF-8是對Unicode的壓縮和優化,UTF-8再也不規定必須最少用2個字節了,而是將字符進行分類:ASC碼中的字符仍是 1字節,歐洲使用2字節,東亞使用3字節。Perfect~~編碼

7.Python3字符編碼

在Python3中,默認的字符編碼是Unicode。spa

2、Python字符串

介紹完了字符編碼的知識就該進入正題了,字符串做爲Python最經常使用的數據類型,那必定有它獨特的魅力,盤它!

先來看看字符串的具體方法:

In [1]: dir(str)
Out[1]:
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

從上面能夠看到,字符串的方法那是超級多啊⊙﹏⊙∥

注意:字符串同元組同樣,其內部元素不能夠被修改

1.初始化字符串

In [2]: name = 'MinuteSheep'               # 單引號

In [3]: gender = 'M'                       # 一個字符也是字符串

In [4]: introduction = "I'm MinuteSheep"   # 雙引號

In [5]: info = '''                         # 三引號
   ...: i am,
   ...: the,
   ...: best man
   ...: '''

# 前面已經說過他們的區別與用法,這裏就再也不重複了

2.字符串索引

經過索引訪問字符串元素:同列表用法同樣

In [19]: name = 'MinuteSheep'

In [20]: name[0]                   # 同列表用法同樣
Out[20]: 'M'

In [21]: name[5]
Out[21]: 'e'

In [22]: name[-1]
Out[22]: 'p'

In [23]: name[-6]
Out[23]: 'e'

經過元素獲取索引:有兩種方法:str.index()  ,   str.find()

In [24]: name = 'MinuteSheep'

In [25]: name.index('S')           # 查找一個字符在字符串中的索引
Out[25]: 6

In [26]: name.index('te')          # 查找子字符串在字符串中的索引,若是有多個子字符串,則返回第一個的索引
Out[26]: 4

In [31]: name.index('te',3,9)      # 能夠指定查找範圍:第3個字符到第9個字符
Out[31]: 4

In [27]: name.index('Sp')          # 當查找的字符或字符串不存在時,拋出沒找到的異常
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-27-1d8e59855f71> in <module>
----> 1 name.index('Sp')

ValueError: substring not found

In [28]: name.find('S')            # 用法和str.index()相似
Out[28]: 6

In [29]: name.find('te')           # 用法和str.index()相似
Out[29]: 4

In [32]: name.find('te',3,9)       # 用法和str.index()相似
Out[32]: 4 

In [30]: name.find('Sp')           # 當查找的字符或字符串不存在時,返回-1,就這點不同
Out[30]: -1

3.字符串切片

使用方法同列表同樣

In [34]: name = 'MinuteSheep'

In [35]: name[:]                  # 使用方法同列表同樣
Out[35]: 'MinuteSheep'

In [36]: name[:4]
Out[36]: 'Minu'

In [37]: name[5:-1]
Out[37]: 'eShee'

In [38]: name[3:9:2]
Out[38]: 'ueh'

4.字符串組合

字符串相加:直接用 + 號將兩個字符串加起來,效果以下:

In [40]: name1 = 'MinuteSheep'

In [41]: name2 = 'Heenoor'

In [42]: name1 + name2
Out[42]: 'MinuteSheepHeenoor'

字符串拼接:

In [51]: '-'.join('MinuteSheep')                # 將字符串的每一個字符用 - 拼接起來
Out[51]: 'M-i-n-u-t-e-S-h-e-e-p'

In [53]: '-'.join(['MinuteSheep','Heenoor'])    # 將列表的每一個元素用 - 拼接起來
Out[53]: 'MinuteSheep-Heenoor'

In [55]: '-'.join({'a':3,'b':5})                # 將字典的key值用 - 拼接起來
Out[55]: 'a-b'

字符串居中:

In [56]: name = 'MinuteSheep'

In [58]: name.center(20,'*')     # 使用str.center(數量,符號)方法將字符串居中
Out[58]: '****MinuteSheep*****'

字符串乘法:同列表同樣

In [60]: 'MinuteSheep' * 5
Out[60]: 'MinuteSheepMinuteSheepMinuteSheepMinuteSheepMinuteSheep'

5.字符串統計

統計字符串長度:使用len()查看:

In [61]: name
Out[61]: 'MinuteSheep'

In [62]: len(name)
Out[62]: 11

統計指定字符出現次數:使用str.count()方法:

In [61]: name
Out[61]: 'MinuteSheep'

In [63]: name.count('e')
Out[63]: 3

6.字符串轉義

在Python中,有些字符被轉義了,一般字符前面有 \ 表明轉義字符,好比 '\n' 表明換行符,其餘的轉義字符見下表:

\(在行尾時)                # 續行符
\\                        # 反斜槓符號
\'                        # 單引號
\"                        # 雙引號
\a                        # 響鈴
\b                        # 退格(Backspace)
\e                        # 轉義
\000                      #
\n                        # 換行
\v                        # 縱向製表符
\t                        # 橫向製表符
\r                        # 回車
\f                        # 換頁
\oyy                      # 八進制數,yy表明的字符,例如:\o12表明換行
\xyy                      # 十六進制數,yy表明的字符,例如:\x0a表明換行
\other                    # 其它的字符以普通格式輸出

若是字符串須要這些字符又該怎麼辦呢,好比  s = '\n' ,運行代碼後Python就會將 \n 識別爲換行,若是字符串須要出現 \n,那就再轉義便可,如 s = '\\n' 

In [73]: s = '\n'

In [74]: s
Out[74]: '\n'

In [75]: print(s)



In [76]: s = '\\n'

In [77]: print(s)
\n

但若是一個字符串中轉義符過多的話,想要同時讓這些轉義符出現再字符串中,那豈不是要一個一個再轉義,其實,Python中有一個簡單的方法,那就是再建立的字符串前面加一個 r 或者 R ,例如:

In [78]: s = r'\n'

In [79]: print(s)
\n

In [80]: s = R'\n'

In [81]: print(s)
\n

7.字符串格式化

字符串的格式化能夠說是一種動態編程,至關於建立一個模板,填寫內容便可,例如:你好,我叫XXX,我今年XXX歲了,個人電話號碼是XXX。盤它!

使用 % :

In [82]: name = 'MinuteSheep'

In [83]: 'Hello, I am %s' % name    # 只有一個%時,能夠不加括號
Out[83]: 'Hello, I am MinuteSheep'

In [84]: name2 = 'Heenoor'

In [86]: 'Hi, i am %s, I am the friend of %s' % (name2, name)   # 大於一個%時,必須加括號
Out[86]: 'Hi, i am Heenoor, I am the friend of MinuteSheep'

以上代碼就作到了一個動態編程,用%s佔位,以後用其餘內容替換它。

其實,在Python中,%s屬於字符串佔位符,還有其餘的佔位符:

%c     # 格式化字符及其ASCII碼
%s     # 格式化字符串,最經常使用
%d     # 格式化整數,比較經常使用
%u     # 格式化無符號整型
%o     # 格式化無符號八進制數
%x     # 格式化無符號十六進制數
%X     # 格式化無符號十六進制數(大寫)
%f     # 格式化浮點數字,可指定小數點後的精度,比較經常使用
%e     # 用科學計數法格式化浮點數
%E     # 做用同%e,用科學計數法格式化浮點數
%g     # %f和%e的簡寫
%G     # %f 和 %E 的簡寫
%p     # 用十六進制數格式化變量的地址

其中,%d 和 %f 能夠指定整數與小數的位數:

In [87]: '%2d' % 345
Out[87]: '345'

In [88]: '%5d' % 345
Out[88]: '  345'

In [89]: '%.2f' % 3.4567
Out[89]: '3.46'

In [90]: '%5.2f' % 345.5678
Out[90]: '345.57'

使用 format :

Python中還有另一種字符串格式化方法 format,這也是Python官方建議的方式

In [92]: 'I am {0} you are {1} he is {2}'.format('A','B','C')
Out[92]: 'I am A you are B he is C'

In [93]: 'I am {0} you are {0} he is {2}'.format('A','B','C')
Out[93]: 'I am A you are A he is C'

In [94]: 'I am {2} you are {0} he is {1}'.format('A','B','C')
Out[94]: 'I am C you are A he is B'

In [96]: 'I am {name1} you are {name2} he is {name3}'.format(name1='A',name2='B',name3='C')
Out[96]: 'I am A you are B he is C'

In [97]: 'I am {name1} you are {name2} he is {name3}'.format(name3='A',name2='B',name1='C')
Out[97]: 'I am C you are B he is A'

# 懂了哇,弟弟們

8.字符串編碼轉換

上面說了一長串的編碼,到這裏來實際操做一下

使用  str.encode(編碼方式)  進行編碼:

In [98]: name_unicode = '小綿羊'

In [99]: name_utf8 = name_unicode.encode('utf8')    # 將unicode編碼爲utf8,默認爲utf8,能夠省略不寫

In [100]: name_gbk = name_unicode.encode('gbk')     # 將unicode編碼爲gbk

In [101]: name_unicode
Out[101]: '小綿羊'

In [102]: name_utf8                                 # 能夠看到明顯和gbk的編碼方式不同
Out[102]: b'\xe5\xb0\x8f\xe7\xbb\xb5\xe7\xbe\x8a'

In [103]: name_gbk
Out[103]: b'\xd0\xa1\xc3\xe0\xd1\xf2'

使用 bytes.decode(當前字符串編碼) 解碼成 unicode:

In [105]: name_utf8.decode('utf8')    # 將utf8解碼爲unicode,括號裏默認爲utf8,能夠省略不寫
Out[105]: '小綿羊'

In [106]: name_gbk.decode('gbk')      # 將gbk解碼爲unicode
Out[106]: '小綿羊'

9.字符串判斷方法集合

若是仔細去看字符串的方法,發現有好多is開頭的方法,這些方法其實都是判斷方法,一塊兒來看看哇:

In [107]: name = 'MinuteSheep'

In [108]: name.isalnum()     # 若是 string 至少有一個字符而且全部字符都是字母或數字則返回 True,不然返回 False
Out[108]: True

In [109]: name.isalpha()     # 若是 string 至少有一個字符而且全部字符都是字母則返回 True,不然返回 False
Out[109]: True

In [110]: name.isdecimal()   # 若是 string 只包含十進制數字則返回 True 不然返回 False.
Out[110]: False

In [111]: name.isdigit()     # 若是 string 只包含數字則返回 True 不然返回 False.
Out[111]: False

In [112]: name.islower()     # 若是 string 中包含至少一個區分大小寫的字符,而且全部這些(區分大小寫的)字符都是小寫,則返回 True,不然返回 False
Out[112]: False

In [113]: name.isnumeric()   # 若是 string 中只包含數字字符,則返回 True,不然返回 False
Out[113]: False

In [114]: name.isspace()     # 若是 string 中只包含空格,則返回 True,不然返回 False.
Out[114]: False

In [115]: name.istitle()     # 若是 string 是標題化的(見 title())則返回 True,不然返回 False
Out[115]: False

In [116]: name.isupper()     # 若是 string 中包含至少一個區分大小寫的字符,而且全部這些(區分大小寫的)字符都是大寫,則返回 True,不然返回 False
Out[116]: False

還有兩個很重要的判斷方法:

In [117]: name
Out[117]: 'MinuteSheep'

In [119]: name.startswith('mi')   # 判斷開頭,區分大小寫
Out[119]: False

In [120]: name.startswith('Mi')
Out[120]: True

In [122]: name.endswith('ep')     # 判斷結尾,區分大小寫
Out[122]: True

10.字符串其餘方法

In [123]: name = 'minutesheep'

In [124]: name.capitalize()         # 把字符串的第一個字符大寫
Out[124]: 'Minutesheep'

In [129]: name = 'MinuteSheep'

In [130]: name.ljust(20)            # 返回一個原字符串左對齊,並使用空格填充至長度20的新字符串
Out[130]: 'MinuteSheep         '

In [132]: name.rjust(20)            # 返回一個原字符串右對齊,並使用空格填充至長度20的新字符串
Out[132]: '         MinuteSheep'

In [133]: name.lower()              # 轉換 string 中全部大寫字符爲小寫.
Out[133]: 'minutesheep'

In [134]: name = '     MinuteSheep     '

In [135]: name.strip()              # 截掉 string 兩邊邊的空格
Out[135]: 'MinuteSheep'

In [136]: name.lstrip()             # 截掉 string 左邊的空格
Out[136]: 'MinuteSheep     '

In [137]: name.rstrip()             # 截掉 string 右邊的空格
Out[137]: '     MinuteSheep'

In [138]: max(name)                 # 返回字符串 str 中最大的字母。
Out[138]: 'u'

In [139]: min(name)                 # 返回字符串 str 中最小的字母。
Out[139]: ' '

In [140]: name.replace(' ','-')     # 把 string 中的 str1 替換成 str2,若是 num 指定,則替換不超過 num 次.
Out[140]: '-----MinuteSheep-----'

In [141]: name.replace(' ','-',3)
Out[141]: '---  MinuteSheep     '

In [142]: name = 'i am minutesheep' 

In [143]: name.split(' ')           # 把string按照空格分割,默認爲空格
Out[143]: ['i', 'am', 'minutesheep']

In [144]: name.split()
Out[144]: ['i', 'am', 'minutesheep']

In [145]: name.swapcase()           # 翻轉 string 中的大小寫
Out[145]: 'I AM MINUTESHEEP'

In [146]: name.title()              # 返回"標題化"的 string,就是說全部單詞都是以大寫開始,其他字母均爲小寫
Out[146]: 'I Am Minutesheep'

In [147]: name.upper()              # 轉換 string 中的小寫字母爲大寫
Out[147]: 'I AM MINUTESHEEP'

至此,Python字符串方法所有記錄完,卒

相關文章
相關標籤/搜索