Python 文字/字串型別 str 使用說明

閱讀 27:21·字數 8208·更新 
Youtube 頻道
訂閱 133

本節的“字元₁”一詞是指 Unicode 中 Lu,Ll,Lt 分類的字元,“字母字元₁”一詞是指 Unicode 中 Lu,Ll,Lt,Lm,Lo 分類的字元。

Python 文字/字串型別

Python 中的文字/字串型別str繼承自序列型別Sequence,用於表示文字資訊,其常值的書寫需要使用成對的引號,這包括單引號('),雙引號("),三重單引號('''),三重雙引號("""),其中三重引號可接受多行的文字資訊。

將 Python 字串的常值分為多個部分

多個緊密相鄰或使用空白字元(包括空格,換行等)分隔的字串常值,將等同於一個字串常值,這種效果可以讓你為字串的不同部分分別註解,從而使各部分的作用更容易被理解。

需要指出,當被分隔的字串常值可能位於多個運算式中時,應使用()將他們括住。

在下面的程式碼中,我們將用於建置電子郵件規則運算式的字串分成了三行,並使用()括住,否則每一行均會被認定為新的運算式。需要檢測的電子郵件位址被書寫為"xiao_xiao" '@' '''live.com''',他等同於'xiao_xiao@live.com'

concatenate.py
# 一個用於建置電子郵件規則運算式的字串
pattern = (
	'\\b[\\w.%-]+' # 電子郵件中 @ 前面的部分
	'@' # 電子郵件中的 @
	'[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,4}' # 電子郵件中 @ 後面的部分
)

import re print(re.search(pattern, "xiao_xiao" '@' '''live.com'''))
<re.Match object; span=(0, 18), match='xiao_xiao@live.com'>

如何取得 Python 字串的長度?

Python 的len函式可用於取得字串長度,這將呼叫字串物件的__len__方法。比如,len('Hello\tWorld\r\n')的結果為13

如何反轉 Python 字串?

使用 Python 的配量運算式::-1可以反轉字串,比如,'Hello'[::-1]的結果為'olleH'。或者,先使用reversed函式將字串轉換為一個順序反轉的疊代器物件,然後使用str型別的join方法將疊代器物件聯結為字串,比如,''.join(reversed('Hello'))的結果為'olleH'

序列型別

str型別擁有 Python 序列型別的通用功能,你可以檢視Python 序列型別 list,tuple,range 使用說明一節了解相關資訊。

使用 str 建構子建立 Python 字串

除了使用常值,你還可以通過str型別的建構子來建立 Python 字串,他的形式如下。

str(object='')
str(object=b'', encoding=sys.getdefaultencoding(), errors='strict')

object 參數

object參數表示用於建置字串的物件,如果未指定則得到空字串。

encoding 參數

encoding參數表示在解碼類位元組序列(bytes-like)物件時,所采用的編碼格式,預設為sys.getdefaultencoding()的傳回值('utf-8')。

errors 參數

errors參數表示對解碼例外狀況的處理方式,預設為'strict',將擲回UnicodeError。其他的取值包括'ignore''replace'等。

對於第一種形式,str建構子將傳回object物件的__str__方法的傳回值,當__str__方法不存在時,將傳回__repr__方法的傳回值。

對於第二種形式,object一般是一個類位元組序列物件,參數encodingerrors被用於類位元組序列物件的解碼操作,str建構子將傳回解碼產生的字串。具體的解碼任務由類位元組序列物件的decode方法完成。

str(b'\x61\x62\x63')
"b'abc'"
str(b'\x61\x62\x63', 'utf-8')
'abc'

Python 物件的 __str__ 和 __repr__ 方法

Python 物件的__str__方法,傳回物件非正式的字串表達形式,這意味著__str__傳回的內容更有利於非開發人員的閱讀。

Python 物件的__repr__方法,傳回物件正式的字串表達形式,這種形式通常包含了物件中的資料,可用於輔助開發人員的偵錯工作。

在 Python 字串中逸出字元

與大部分程式設計語言一樣,Python 字串同樣將字元\作為逸出字元,比如'\tHello'中的\。以下是 Python 中常見的逸出序列。


逸出序列表示內容
\\反斜線
\'單引號
\"雙引號
\n換行字元
\r歸位字元
\b退格字元
\t水平定位字元
\v垂直定位字元
\f換頁符
\ooo八進位數值 ooo 表示的字元
\xhh十六進位數值 hh 表示的字元
\uxxxx十六進位數值 xxxx 表示的字元
\Uxxxxxxxx十六進位數值 xxxxxxxx 表示的字元
\N{name}Unicode 中名稱為 name 的字元
print('\'你好\'')
'你好'
print("\101\x42\u0043\U00000044")
ABCD
print('\N{TAB}Hello')
Hello

如何禁止 Python 字串中的 \ 成為逸出字元?

使用 Python 原始字串,即以rR為首碼的字串,可以禁止\成為逸出字元。在一些特殊情況下這非常有效,比如包含檔案路徑的字串,因為你不必再將路徑中的每個\逸出為\\

需要指出的是,雖然 Python 原始字串不會將\視為逸出字元,但單個\不能出現在字串的結尾,這意味著如果字串以單個\結束,那麽使用 Python 原始字串將導致錯誤,比如r'C:\python\'

R'C:\python\3.14'
'C:\\python\\3.14'

Python 字串中無法識別的逸出序列將導致例外狀況或警告

在 Python 3.6 或更高的版本中,Python 字串中無法被識別的逸出序列將導致例外狀況或警告,而在之前的版本中,逸出字元\將被保留。

逸出

關於逸出,逸出字元,逸出序列等基本概念,你可以檢視程式設計教學逸出,逸出字元,逸出序列介紹一節了解更多。

格式化 Python 字串

Python 的str型別提供了formatformat_map方法,用於對字串進行格式化。

format方法使用可變參數kwargs取代字串中的可取代項,可取代項使用{}{n}表示,其中n為可變參數kwargs的索引。

format_map方法使用字典參數mapping取代字串中的可取代項,可取代項使用{n}表示,其中n為字典的鍵。

尋找和取代 Python 字串中的內容

對於字串的尋找和取代,Python 的str型別提供了眾多的方法,這些方法一般包含startend參數,他們被用於配量操作,以針對字串中的某一部分進行運算,如果未指定startend參數,則運算會針對整個字串。

Pythonstr型別的count方法用於取得指定字串在目標字串中出現的次數。

count(sub[, start[, end]], /)

sub 參數

sub參數表示需要尋找的字串,如果傳遞空字串,則傳回的次數為字串長度加1

Pythonstr型別的startswith方法用於判斷字串是否以指定的字串開始,如果是則傳回True,否則傳回Falsestr型別的endswith方法用於判斷字串是否以指定的字串結束,如果是則傳回True,否則傳回False

startswith(prefix[, start[, end]], /)
endswith(suffix[, start[, end]], /)

prefix 參數

prefix參數表示目標字串開頭部分需要比對的字串,如果該參數是包含多個字串的元組,那麽目標字串的開頭只需要與其中之一相符。

suffix 參數

suffix參數表示目標字串結尾部分需要比對的字串,如果該參數是包含多個字串的元組,那麽目標字串的結尾只需要與其中之一相符。

Pythonstr型別的find方法用於傳回指定字串在目標字串中第一次出現的位置,如果指定字串沒有出現過,則傳回-1str型別的rfind方法用於傳回指定字串在目標字串中最後一次出現的位置,如果指定字串沒有出現過,則傳回-1str型別的indexrindex方法與findrfind方法類似,但會引發例外狀況ValueError,當指定字串沒有出現時。

find(sub[, start[, end]], /)
rfind(sub[, start[, end]], /)
index(sub[, start[, end]], /)
rindex(sub[, start[, end]], /)

sub 參數

sub參數表示需要尋找的字串,如果傳遞空字串,則findindex傳回的位置為0rfindrindex傳回的位置為字串長度。

Pythonstr型別的replace方法用於取代目標字串中的內容,取代後的結果會作為新的字串傳回。

replace(old, new[, count], /)

old 參數

old參數表示需要被取代的舊內容。如果為空字串,則取代效果相當於在目標字串的每個字元前插入參數new的內容,參數new的內容至少出現一次。

new 參數

new參數表示取代後的新內容。

count 參數

count參數表示取代的次數,如果未指定或小於0,則取代次數不受限製。

Pythonstr型別的strip方法將移除字串開頭和結尾的字元,直到字元未出現在chars參數中,移除後的結果會作為新的字串傳回。str型別的lstriprstrip方法與strip方法類似,不過lstrip僅移除字串開頭的字元,rstrip僅移除字串結尾的字元。

strip([chars], /)
lstrip([chars], /)
rstrip([chars], /)

chars 參數

chars參數表示字串開頭,結尾,或開頭與結尾處需要移除的字元。忽略該參數或設定為None,將移除相應位置的空白字元。

Pythonstr型別的removeprefix方法將移除指定的字串首碼,該運算僅執行一次,移除後的結果會作為新的字串傳回。與removeprefix方法類似,str型別的removesuffix方法可移除指定的字串尾碼。

removeprefix(prefix, /)
removesuffix(suffix, /)

prefix 參數

prefix參數表示需要移除的字串首碼。

suffix 參數

suffix參數表示需要移除的字串尾碼。

'hello'.count('')
6
'hello'.endswith(('h', 'o'))
True
'hello world'.replace('l', 'L', 2)
'heLLo world'
'hello world'.strip('hdel')
'o wor'
'hellohello!'.removeprefix('hello')
'hello!'

分割和聯結 Python 字串

對於字串的分割和聯結,Python 的str型別提供了如下方法。

Pythonstr型別的split方法使用指定的字串分割目標字串,分割的結果將作為一個串列傳回。str型別的rsplit方法與split方法類似,但分割會從字串的末尾開始,需要說明的是,僅當maxsplit參數指定的分割次數,不足以分割所有可分割的內容時,rsplit方法的效果才能有所體現。

split(sep=None, maxsplit=-1)
rsplit(sep=None, maxsplit=-1)

sep 參數

sep參數表示用於分割目標字串的字串,他不能為空字串。如果sep為預設值None,則連續的空白字元(包括空格字元,換行字元,定位字元等)將作為分割的依據,目標字串開始和結尾的空白字元會被忽略,因此,''.split()傳回的結果是[]

maxsplit 參數

maxsplit參數預設為-1,表示分割的最大執行次數,假如maxsplit2,那麽傳回串列的最大長度為3。如果maxsplit未被指定或小於0,則取代次數不受限製。

Pythonstr型別的splitlines方法使用行邊界字元分割目標字串,分割的結果將作為一個串列傳回,行邊界字元包括\n\r\r\n\v\x0b\f\x0c\x1c\x1d\x1e\x85\u2028\u2029。需要指出的是,分割末尾的行邊界字元不會新增一個空字串,因此'hello\r\n'.splitlines()傳回的結果為['hello']

splitlines(keepends=False)

keepends 參數

keepends參數預設為False,表示分割的內容不會包含邊界字元,如果設定為True,則分割內容的結尾處會包含邊界字元。

Pythonstr型別的partition方法使用指定字串將目標字串分割為三部分,並作為元組傳回。其中的三部分分別是,指定字串前面的部分,指定字串,指定字串後面的部分。如果指定字串未被找到,則傳回的元組包含目標字串和兩個空字串。str型別的rpartition方法與partition方法類似,但分割會從字串的末尾開始,如果指定字串未被找到,則傳回的元組包含兩個空字串和目標字串。

partition(sep, /)
rpartition(sep, /)

sep 參數

sep參數表示用於分割目標字串的字串,他不能為空字串。

Pythonstr型別的join方法將使用目標字串聯結iterable參數中的每個字串元素,聯結的結果將作為一個串列傳回。

join(iterable, /)

iterable 參數

iterable參數是一個疊代器物件,物件中的每個字串元素都將被目標字元聯結。

'Hello:World:!'.split(':', 1)
['Hello', 'World:!']
'\tHello World\r\n'.split()
['Hello', 'World']
'你好嗎?\n還好!\r'.splitlines(keepends=True)
['你好嗎?\n', '還好!\r']
'我說:你好嗎?他說:不好'.rpartition('說:')
('我說:你好嗎?他', '說:', '不好')
','.join(('蘋果', '橘子', '還是橘子'))
'蘋果,橘子,還是橘子'

Python 中的字元大小寫操作

對於字元的大小寫,Python 的str型別提供了如下方法。

Pythonstr型別的upper方法將字串中所有字元₁改為大寫,變更後的結果會作為新的字串傳回。str型別的lower方法將字串中所有字元₁改為小寫,變更後的結果會作為新的字串傳回。str型別的casefold方法與lower方法類似,同樣是將字串中所有字元₁改為小寫,但會進行更為徹底的處理,一些具有折疊效果的小寫字母會被展開,比如德語中的ß會被展開為ss

upper()
lower()
casefold()

Pythonstr型別的isupper方法用於判斷字串中的字元₁是否全部為大寫,如果是則傳回True,否則傳回False,字串中不屬於 Unicode Lu,Ll,Lt 分類的字元將被忽略。str型別的islower方法用於判斷字串中的字元₁是否全部為小寫,如果是則傳回True,否則傳回False,字串中不屬於 Unicode Lu,Ll,Lt 分類的字元將被忽略。

isupper()
islower()

Pythonstr型別的capitalize方法將字串中的第一個字元₁(並非每個單詞的第一個字元₁)改為大寫,其余字元₁改為小寫,變更後的結果會作為新的字串傳回。在 Python 3.8 以及之後的版本中,當組合字元位於字串的首位時,只有組合的第一個字元₁才會改為大寫,組合字元的其他字元₁將改為小寫。

capitalize()

Pythonstr型別的title方法用於將字串中每個連續字元₁組合(組合可能並不是一個單詞)改為標題格式,即組合的第一個字元₁為大寫,其余字元₁為小寫,變更後的結果會作為新的字串傳回。str型別的istitle方法用於判斷字串中每個連續字元₁組合是否符合標題格式,如果是則傳回True,否則傳回False

title()
istitle()

Pythonstr型別的swapcase方法用於變更切換字串中所有字元₁的大小寫,變更後的結果會作為新的字串傳回。

swapcase()

Unicode 中的 Lu,Ll,Lt 分類不止包含英文字母字元

Unicode 中的 Lu,Ll,Lt 分類不止包含英文字母字元,還包含其他語種的大小寫字元,比如意大利語。

如何將 Python 字串中的單詞首字母轉換為大寫?

雖然title方法可以將連續字元₁組合的首個字元₁轉換為大寫,但這些組合可能並非真正的單詞,比如字串"i'm john"中的m。這種問題可通過string模組的capwords方法解決,該方法能更有效的識別單詞。

'ÀÇ'.lower()
'àç'
'ß'.casefold()
'ss'
'你好!python'.islower()
True
"i'm john".capitalize()
"I'm john"
"i'm john".title()
"I'M John"
import string
string.capwords("i'm john")
"I'm John"

轉換和填入 Python 字串

對於字串的轉換和填入,Python 的str型別提供了如下方法。

Pythonstr型別的expandtabs方法將字串中的定位字元轉換為一個或多個空格字元,數量根據定位字元在目前行的位置以及定位字元的寬度來決定,轉換後的結果會作為新的字串傳回。

expandtabs(tabsize=8)

tabsize 參數

tabsize參數表示定位字元的寬度,預設為8,如果為負數,則效果等同於設定為0

Pythonstr型別的center方法將使用指定字元填入目標字串的兩邊,並盡可能確保兩邊填入的字元數量相同,填入後的結果會作為新的字串傳回。str型別的ljustrjust方法與center方法類似,但他們僅在目標字串的右邊,左邊填入指定字元,以實作目標字串的左對齊,右對齊效果。str型別的zfill方法與rjust方法類似,但他僅填入字元0,並使0始終位於目標字串首位的+-之後,因此zfill通常用於為數值填入前置0

center(width, fillchar=' ', /)
ljust(width, fillchar=' ', /)
rjust(width, fillchar=' ', /)
zfill(width, /)

width 參數

width參數表示填入後的字串的長度,如果該參數小於等於目標字串的長度,則呼叫方法不會產生任何效果。

fillchar 參數

fillchar參數表示用於填入的內容,他只能是一個字元,預設為空格字元。

'清單\r\n\t蘋果\r\n\t'.expandtabs(tabsize=1)
'清單\r\n 蘋果\r\n '
'快樂'.center(1, '+')
'快樂'
'快樂'.ljust(10, '-')
'快樂--------'
'-12e+3'.zfill(10)
'-000012e+3'

使用轉換表轉換 Python 字串中字元

Pythonstr型別的translate方法將使用一個被稱為轉換表的物件,來轉換 Python 字串中的字元。轉換表一般是一個 Python 對映物件,或者實作了__getitem__方法的物件,他將根據目標字串中某個字元的編碼值,傳回該字元對應的轉換字元(可以是單個字元或多個字元)或對應轉換字元的編碼值,如果傳回空值None,則目標字串中的字元會被刪除,如果在傳回的過程中引發了例外狀況LookupError,則目標字串中的字元保持不變。

translate(table)

table 參數

table參數是一個用於轉換字元的轉換表物件。

'ABCD'.translate({65: 'a', 66: 98, 67: 'cc', 68: None})
'abcc'

如果采用字元的編碼值,那麽translate方法並不容易被使用,而 Pythonstr型別的maketrans靜態方法可方便的為translate方法建置轉換表物件。

str.maketrans(x)

x 參數

x參數是一個用於建置轉換表物件的 Python 字典,字典鍵值組的鍵是某個字元或該字元對應的編碼值,字典鍵值組的值是該字元對應的轉換字元(可以是單個字元或多個字元),或對應轉換字元的編碼值,或空值None(表示字元將被刪除)。

str.maketrans(x, y[, z])

x 參數

x參數是一個 Python 字串,如果一個字元出現在該字串中,那麽該字元應被轉換為參數y所表示的字串中的同位置字元。

y 參數

y參數是x參數所表示的字串對應的轉換字串,這兩個字串的長度必須相同。

z 參數

z參數是一個 Python 字串,如果一個字元出現在該字串中,那麽該字元將被轉換為空值None(表示字元將被刪除)。

'-0.1j'.translate(str.maketrans({'-': '負數 ', '.': ' 小數點 '}))
'負數 0 小數點 1j'
'-0.1j'.translate(str.maketrans('-01', '負零一', 'j'))
'負零.一'

在下面的範例中,我們定義了一個充當轉換表的 Python 類別Trans,在該類別的__getitem__方法中,如果字元是A則引發例外狀況LookupError,這將導致字元A保持不變。

lookup.py
# 一個轉換表類別
class Trans:
	def __getitem__(self, key):
		# 如果是 A,則保持不變
		if key == 65:
			raise LookupError()

# 轉換為編碼值加 1 的字元 return key + 1
print('ABC'.translate(Trans()))
ACD

判斷 Python 字串是否為字母或數值

對於判斷是否為字母或數值字元,Python 的str型別提供了如下方法。

Pythonstr型別的isalpha方法用於判斷字串中的字元是否均為字母字元₁,如果是則傳回True,否則傳回False

isalpha()

Pythonstr型別的isdecimal方法用於判斷字串中的字元是否均為十進位數值字元,即 Unicode 中的 Nd 分類,如果是則傳回True,否則傳回Falsestr型別的isdigit方法用於判斷字串中的字元是否均為數值字元,即 Unicode 中 Numeric_Type 為 Digit 或 Decimal 的字元,如果是則傳回True,否則傳回False。顯然isdigit判斷的範圍要比isdecimal更大,比如對於字串'¹'isdecimal傳回Falseisdigit傳回Truestr型別的isnumeric方法用於判斷字串中的字元是否均為具有數值特征的字元,但該方法的判斷範圍最廣,包含 Unicode 中 Numeric_Type 為 Digit, Decimal 或 Numeric 的字元。

isalpha()
isdigit()
isnumeric()

Pythonstr型別的isalnum方法用於判斷字串中的字元是否均為字母字元₁,或具有數值特征的字元,當isalphaisnumeric之一傳回True時,isalnum方法也會傳回True,否則傳回False

isalnum()

Pythonstr型別的isascii方法用於判斷字串中的字元是否均為 ASCII 字元,如果是則傳回True(包括空字元),否則傳回Falsestr型別的isidentifier方法用於判斷字串是否是一個有效的 Python 識別碼,如果是則傳回True,否則傳回False(包括空字元)。str型別的isprintable方法用於判斷字串中的字元是否均為可列印字元,如果是則傳回True(包括空字元),否則傳回Falsestr型別的isspace方法用於判斷字串中的字元是否均為空白字元,如果是則傳回True,否則傳回False(包括空字元)。

isascii()
isidentifier()
isprintable()
isspace()

Unicode 中的 Nd 分類不止包含 0123456789

Unicode 中的 Nd 分類不止包含0123456789,還包含其他語種的對應形式,比如 Wancho 中的𞋰𞋱𞋲𞋳𞋴𞋵𞋶𞋷𞋸𞋹

Python 的 isdecimal,isdigit,isnumeric 方法只能判斷字串是否為簡單數值

Python 的isdecimalisdigitisnumeric方法只能判斷字串是否為簡單數值,如果包含小數點或正負號,那麽這些方法將傳回False

'Ⅸ'.isnumeric()
True
'Ⅸ'.isdigit()
False
'¹'.isdigit()
True
'¹'.isdecimal()
False
'1234.56'.isnumeric()
False

將 Python 字串型別轉換為 bytes 型別

Pythonstr型別的encode方法,可以將字串轉換為bytes型別。

encode(encoding='utf-8', errors='strict')

encoding 參數

encoding參數表示在編碼str物件時,所采用的編碼格式,預設為'utf-8'

errors 參數

errors參數表示對編碼例外狀況的處理方式,預設為'strict',將擲回UnicodeError。其他的取值包括'ignore''replace'等。

'Hello'.encode()
b'Hello'

內容分類

程式碼

src/zh-hant/data_types/text_types·codebeatme/python·GitHub