06 - Python 中的字串

MR_LP發表於2018-08-13

一、前言

大家好,我是更新看緣分的李鵬李先生。

本次課程主講 Python 中的字串,閒話少說,直接開始。

本文約3500字,閱讀需15分鐘左右,祝大家閱讀愉快。

06 - Python 中的字串

二、字串

在學習今天的內容之前,我們要首先了解一下到底什麼是字串。

我們平常說的話,和別人溝通交流的語言其實就是字串。

只不過在 Python 當中,字串演變成了一種資料型別,但是我們雖然知道了字串演變成了一種資料型別,

可是這種型別在計算機當中是如何來使用的呢?我想在計算機中使用中文行不行呢?

接下來我們首先來探究一下 Python 中編碼格式的問題。

2.1 ASCII 編碼

首先宣告,計算機底層當中不能接收中文,甚至連文字都無法處理。

必須要轉換成數字來進行表示,也就是我們常說的位元組。

需要注意:

  • 1 位元組(byte) = 8 位元(bit)
  • 一個位元組能表示的最大的整數就是255(即二進位制11111111)
  • 兩個位元組可以表示的最大整數是65 535
  • 四個位元組可以表示的最大整數是4 294 967 295

最開始的計算機,就只儲存了127個字元在計算機裡面,其中包含了數字、字母、特殊符號等等。

而這個表則統稱為 ASCII編碼

其中我們需要注意的就是我們需要記住的就只有其中三個。

十進位制表示 內容 含義
48 0 數字 0
65 A 字母 A (大寫)
97 a 字母 a (小寫)

通過記住這三個內容,我們可以分別推出 0 ~ 9A ~ Za ~ z 的 ASCII 編碼數字。

2.2 Unicode

既然有了 ASCII 編碼,那是不是就完事大吉了呢?

當然不是,如果中國有自己的編碼表(GB2312編碼),日本也有自己的編碼表(Shift_JIS),韓國也有韓文編碼表(Euc-kr),那豈不是天下大亂?

你在中國寫的東西,到日本,到韓國就直接變成了一堆亂碼,那我相信,我們的工作生活將會受到極大的影響。

那麼這時候我們該怎麼辦呢?

這時候國際標準化組織(ISO)多語言軟體製造商組成的統一碼聯盟站了出來,他們聯合其他機構進行了統一化的工作,而統一化的結果就是我們熟知的 Unicode 編碼

通過 Unicode,就可以實現在不同國家之間,可以將文字和語言相通啦。

但是部分國家使用的都是漢字,而某些國家日常通訊使用的都是英文,這裡面其實有很大的差別。

要知道漢字已經超出了ASCII編碼的範圍,並且大部分需要使用兩個位元組來表示,有些甚至需要四個四節,而英文只需要一個位元組即可。

字母A用ASCII編碼是十進位制的65,二進位制的01000001

字元0用ASCII編碼是十進位制的48,二進位制的00110000,注意字元'0'和整數0是不同的;

漢字已經超出了ASCII編碼的範圍,用Unicode編碼是十進位制的20013,二進位制的01001110 00101101

那我們是不是就應該在書寫中文相關的內容時,需要使用 Unicode 編碼,

書寫通篇是英文或者數字的時候,應該優先使用 ASCII 編碼。

這時候我們就要講到一個新的標準,UTF-8啦。

2.3 UTF-8

由於為了要節省空間,應該使用ASCII 編碼的內容就不應該去使用 Unicode 編碼。

A 的 ASCII 	編碼:01000001
A 的 Unicode 編碼:00000000 01000001
複製程式碼

那計算機怎麼區分什麼時候應該使用Unicode 編碼,什麼時候使用 ASCII 編碼呢?

為了解決這個問題,出現了一種中間格式的字符集,即UTF(Unicode Transformation Format)。

常見的UTF格式有:

  • UTF-7
  • UTF-7.5
  • UTF-8
  • UTF-16
  • UTF-32

其中我們需要重點了解的就是 UTF-8編碼,即“可變長的編碼”。

UTF-8編碼把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,

常用的英文字母被編碼成1個位元組,漢字通常是3個位元組,很生僻的字元會被編碼成4-6個位元組。

這裡需要注意一點:

Python的誕生比Unicode標準釋出的時間還要早,所以最早的Python只支援ASCII編碼,

普通的字串'ABC'在Python內部都是ASCII編碼的。

而使用UTF-8編碼還有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分,

所以,大量只支援ASCII編碼的歷史遺留軟體可以在UTF-8編碼下繼續工作。

這也就是為什麼我們每次在使用中文的時候都需要在檔案開頭宣告 UTF-8 啦。

2.4 字串的“切片”

當我們弄明白程式設計中令人苦惱的編碼格式之後,我們就可以去使用我們的字串啦。

例如我現在宣告一個變數 name。

name = "lipeng"
複製程式碼

那有一天我的學生霏姐想惡搞一下我,想把我名字中的一部分抽出來,這時候其實就要用到“切片”啦。

需要注意,字串、列表、元組都支援切片操作。

首先先來說一下切片的語法:

切片的語法:[起始:結束:步長]

注意: 選取的區間屬於左閉右開型,即從"起始"位開始,到"結束"位的前一位結束(不包含結束位本身)。
複製程式碼

那接下來來一個實際例子。

Last login: Tue Aug  7 09:27:48 on ttys000
➜  ~ python

>>> name = "lipeng"
>>> print(name[0:3])
lip
>>> 
複製程式碼

我們取到了下標0~2 的字元,那接下來我們測試一下0~4的字元。

Last login: Tue Aug  7 09:27:48 on ttys000
➜  ~ python

>>> name = "lipeng"
>>> print(name[0:5])
lipen
>>> 
複製程式碼

再來一個3~4的字元。

Last login: Tue Aug  7 09:27:48 on ttys000
➜  ~ python

>>> name = "lipeng"
>>> print(name[3:5])
en
>>> 
複製程式碼

那如果我們需要從某一個位置之後所有的資料呢?

Last login: Tue Aug  7 09:27:48 on ttys000
➜  ~ python

>>> name = "lipeng"
>>> print(name[2:])
peng
>>> 
複製程式碼

再假設,我們現在不知道總共內容有多長,但是知道需要擷取到末尾的第幾個,這時候應該怎麼辦呢?

Last login: Tue Aug  7 09:27:48 on ttys000
➜  ~ python

>>> name = "lipeng"
>>> print(name[1:-1])
ipen
>>> 
複製程式碼

如果你覺得自己已經明白切片的用法的話,可以自己試試以下題目:

>>> print(name[:3])
lip
>>> print(name[::2])
lpn
>>> print(name[5:1:2])
"" # 空
>>> print(name[1:5:2])
ie
>>> print(name[::-2])
gei
>>> print(name[5:1:-2])
ge
>>> 
複製程式碼

2.5 字串中常用的方法

2.5.1 ord( ) : 獲取字元的整數表示

➜  ~ python

>>> ord('a')
97
>>> ord('A')
65
>>> ord('0')
48
>>> 

複製程式碼

2.5.2 chr( ):編碼轉換為對應的字元

>>> chr(69)
'E'
>>> chr(103)
'g'
>>> 
複製程式碼

2.5.3 find( ):查詢是否有對應文字

檢測 str 是否包含在 mystr中,如果是返回開始的索引值,否則返回-1。

標準語法:mystr.find(str, start=0, end=len(mystr))

>>> name = "my name is MR_LP"
>>> name.find("MR_LP")
11
>>> 
複製程式碼

2.5.4 index( ):查詢是否有對應文字

檢測 str 是否包含在 mystr中,如果是返回開始的索引值,否則報錯

標準語法:mystr.index(str, start=0, end=len(mystr))

>>> name = "my name is MR_LP"
>>> name.index("MR_LP")
11
>>> name.index("ZZZ")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found
>>> 
複製程式碼

2.5.5 count( ):返回字元出現的次數

返回 str在start和end之間 在 mystr裡面出現的次數

標準語法:mystr.count(str, start=0, end=len(mystr))

>>> name = "my name is MR_LP"
>>> name.count('m')
2
>>> 
複製程式碼

2.5.6 replace( ):替換文字,替換不超過 count 次

把 mystr 中的 str1 替換成 str2,如果 count 指定,則替換不超過 count 次.

標準語法:mystr.replace(str1, str2, mystr.count(str1))

>>> name = "my name is MR_LP"

>>> name.replace("MR_LP","233")
'my name is 233'

>>> name.replace("m","233",1)
'233y name is MR_LP'
>>> 
複製程式碼

2.5.7 split( ):按照分隔符將字串切片

以 str 為分隔符切片 mystr,如果 maxsplit有指定值,則僅分隔 maxsplit 個子字串

標準語法:mystr.split(str=" ", 2)

>>> name = "my name is MR_LP"

>>> name.split(' ')
['my', 'name', 'is', 'MR_LP']

>>> name.split(' ',2)
['my', 'name', 'is MR_LP']
>>> 
複製程式碼

2.5.8 capitalize( ):字串首字母大寫

把字串的第一個字元大寫

標準語法:mystr.capitalize()

>>> name = "my name is MR_LP"

>>> name.capitalize()
'My name is mr_lp'
>>> 
複製程式碼

2.5.9 title( ):字串中每個單詞首字母大寫

把字串的每個單詞首字母大寫

標準語法:name.title()

>>> name = "my name is MR_LP"

>>> name.title()
'My Name Is Mr_Lp'
>>> 
複製程式碼

2.5.10 startswith( ):檢測字串是否以某內容開頭

檢查字串是否是以 obj 開頭, 是則返回 True,否則返回 False

標準語法:mystr.startswith(obj)

>>> name = "my name is MR_LP"

>>> name.startswith('my')
True
>>> name.startswith('My')
False
>>> 
複製程式碼

2.5.11 endswith( ):檢測字串是否以某內容結尾

檢查字串是否是以 obj 結尾, 是則返回 True,否則返回 False

標準語法:mystr.endswith(obj)

>>> name = "my name is MR_LP"

>>> name.endswith('LP')
True
>>> name.endswith('lp')
False
>>> 
複製程式碼

2.5.12 lower( ):大寫字元為小寫

轉換 mystr 中所有大寫字元為小寫

標準語法:mystr.lower()

>>> name = "my name is MR_LP"

>>> name.lower()
'my name is mr_lp'
>>> 
複製程式碼

2.5.13 所有大寫字元為大寫

轉換 mystr 中所有大寫字元為大寫

標準語法:mystr.upper()

>>> name = "my name is MR_LP"

>>> name.upper()
'MY NAME IS MR_LP'
>>> 
複製程式碼

2.5.14 ljust( ):左對齊並填充字串

返回一個原字串左對齊,並使用空格填充至長度 width 的新字串

標準語法:mystr.ljust(width)

>>> s = "lipeng"

>>> s.ljust(10)
'lipeng    '
>>> 
複製程式碼

2.5.15 rjust( ):右對齊並填充字串

返回一個原字串右對齊,並使用空格填充至長度 width 的新字串

標準語法:mystr.rjust(width)

>>> s = "lipeng"

>>> s.rjust(10)
'    lipeng'
>>> 
複製程式碼

2.5.16 center( ):居中對齊並填充字串

返回一個原字串居中,並使用空格填充至長度 width 的新字串

標準語法:mystr.center(width)

>>> s = "lipeng"

>>> s.center(20)
'       lipeng       '
>>> 
複製程式碼

2.5.17 lstrip( ):清除左側空白字元

刪除 mystr 左邊的空白字元

標準語法:mystr.lstrip()

>>> str = '        lipeng        '

>>> str.lstrip()
'lipeng        '
>>> 
複製程式碼

2.5.18 rstrip( ):清除右側空白字元

刪除 mystr 右邊的空白字元

標準語法:mystr.rstrip()

>>> str = '        lipeng        '

>>> str.rstrip()
'        lipeng'
>>> 
複製程式碼

2.5.19 strip( ):清除左右兩側空白字元

刪除 mystr 兩側的空白字元

標準語法:mystr.strip()

>>> str = '        lipeng        '

>>> str.strip()
'lipeng'
>>> 
複製程式碼

2.5.20 rfind( ):從右側查詢是否有對應文字

從右側查詢是否有對應文字

標準語法:mystr.rfind(str, start=0,end=len(mystr) )

>>> name = "lipeng"

>>> name.rfind("p")
2
>>> 
複製程式碼

2.5.21 rindex( ):從右側查詢是否有對應文字

和 index( ) 相同,但是是從右側開始

標準語法:mystr.rindex( str, start=0,end=len(mystr))

>>> name = "lipeng"

>>> name.rindex("e")
3
>>> name.rindex("LI")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found
>>> 
複製程式碼

2.5.22 partition( ):以對應文字將字串分割成三部分

把mystr以str分割成三部分,str前,str和str後

標準語法:mystr.partition(str)

>>> s = "i'm lipeng, you can call me MR_LP"

>>> s.partition("can")
("i'm lipeng, you ", 'can', ' call me MR_LP')
>>> 

複製程式碼

2.5.23 rpartition( ):從右側以對應文字將字串分割成三部分

從右側把mystr以str分割成三部分,str前,str和str後

標準語法:mystr.rpartition(str)

>>> s = "i'm lipeng, you can call me MR_LP"

>>> s.rpartition("can")
("i'm lipeng, you ", 'can', ' call me MR_LP')
>>> 

複製程式碼

2.5.24 splitlines( ):按行分割

按照行分隔,返回一個包含各行作為元素的列表

標準語法:mystr.splitlines()

>>> s = "MR_LP.\nmr_lp"

>>> print(s)
MR_LP.
mr_lp

>>> s.splitlines()
['MR_LP.', 'mr_lp']
>>> 
複製程式碼

2.5.25 isalpha( ):判斷是否全部是字母

如果 mystr 所有字元都是字母 則返回 True,否則返回 False

標準語法:mystr.isalpha()

>>> s = "abc"
>>> s.isalpha()
True

>>> s = "123"
>>> s.isalpha()
False

>>> s = "abc 123"
>>> s.isalpha()
False
複製程式碼

2.5.26 isdigit( ):判斷是否全部是數字

如果 mystr 只包含數字則返回 True 否則返回 False.

標準語法:mystr.isdigit()

>>> s = "abc"
>>> s.isdigit()
False

>>> s = "123"
>>> s.isdigit()
True

>>> s = "abc123"
>>> s.isdigit()
False
複製程式碼

2.5.27 isalnum( ):判斷是否全部是數字或字母

如果 mystr 所有字元都是字母或數字則返回 True,否則返回 False

標準語法:mystr.isalnum()

>>> s = "123"
>>> s.isalnum()
True

>>> s = "abc"
>>> s.isalnum()
True

>>> s = "abc123"
>>> s.isalnum()
True

>>> s = "abc 123"
>>> s.isalnum()
False
複製程式碼

2.5.28 isspace( ):判斷是否只包含空格

如果 mystr 中只包含空格,則返回 True,否則返回 False.

標準語法:mystr.isspace()

>>> s = "abc123"
>>> s.isspace()
False

>>> s = ""
>>> s.isspace()
False

>>> s = " " 		# 空格
>>> s.isspace()
True

>>> s = "       "	# tab 鍵
>>> s.isspace()
True
複製程式碼

2.5.28 join( ):判斷是否只包含空格

如果 mystr 中只包含空格,則返回 True,否則返回 False.

標準語法:mystr.isspace()

>>> s = " "
>>> li = ["my","name","is","LIPENG"]
>>> s.join(li)
'my name is LIPENG'

>>> s = "_"
>>> li = ["my","name","is","LIPENG"]
>>> s.join(li)
'my_name_is_LIPENG'
複製程式碼

相關文章