Python 文字/字串型別 str 使用說明
本節的“字元₁”一詞是指 Unicode 中 Lu,Ll,Lt 分類的字元,“字母字元₁”一詞是指 Unicode 中 Lu,Ll,Lt,Lm,Lo 分類的字元。
Python 文字/字串型別
Python 中的文字/字串型別str
繼承自序列型別Sequence
,用於表示文字資訊,其常值的書寫需要使用成對的引號,這包括單引號('
),雙引號("
),三重單引號('''
),三重雙引號("""
),其中三重引號可接受多行的文字資訊。
將 Python 字串的常值分為多個部分
多個緊密相鄰或使用空白字元(包括空格,換行等)分隔的字串常值,將等同於一個字串常值,這種效果可以讓你為字串的不同部分分別註解,從而使各部分的作用更容易被理解。
需要指出,當被分隔的字串常值可能位於多個運算式中時,應使用()
將他們括住。
在下面的程式碼中,我們將用於建置電子郵件規則運算式的字串分成了三行,並使用()
括住,否則每一行均會被認定為新的運算式。需要檢測的電子郵件位址被書寫為"xiao_xiao" '@' '''live.com'''
,他等同於'xiao_xiao@live.com'
。
# 一個用於建置電子郵件規則運算式的字串
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
一般是一個類位元組序列物件,參數encoding
和errors
被用於類位元組序列物件的解碼操作,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 原始字串,即以r
或R
為首碼的字串,可以禁止\
成為逸出字元。在一些特殊情況下這非常有效,比如包含檔案路徑的字串,因為你不必再將路徑中的每個\
逸出為\\
。
需要指出的是,雖然 Python 原始字串不會將\
視為逸出字元,但單個\
不能出現在字串的結尾,這意味著如果字串以單個\
結束,那麽使用 Python 原始字串將導致錯誤,比如r'C:\python\'
。
R'C:\python\3.14'
'C:\\python\\3.14'
Python 字串中無法識別的逸出序列將導致例外狀況或警告
在 Python 3.6 或更高的版本中,Python 字串中無法被識別的逸出序列將導致例外狀況或警告,而在之前的版本中,逸出字元\
將被保留。
逸出
關於逸出,逸出字元,逸出序列等基本概念,你可以檢視程式設計教學的逸出,逸出字元,逸出序列介紹一節了解更多。
格式化 Python 字串
Python 的str
型別提供了format
和format_map
方法,用於對字串進行格式化。
format
方法使用可變參數kwargs
取代字串中的可取代項,可取代項使用{}
或{n}
表示,其中n
為可變參數kwargs
的索引。
format_map
方法使用字典參數mapping
取代字串中的可取代項,可取代項使用{n}
表示,其中n
為字典的鍵。
尋找和取代 Python 字串中的內容
對於字串的尋找和取代,Python 的str
型別提供了眾多的方法,這些方法一般包含start
和end
參數,他們被用於配量操作,以針對字串中的某一部分進行運算,如果未指定start
和end
參數,則運算會針對整個字串。
Pythonstr
型別的count
方法用於取得指定字串在目標字串中出現的次數。
count(sub[, start[, end]], /)
- sub 參數
sub
參數表示需要尋找的字串,如果傳遞空字串,則傳回的次數為字串長度加1
。
Pythonstr
型別的startswith
方法用於判斷字串是否以指定的字串開始,如果是則傳回True
,否則傳回False
。str
型別的endswith
方法用於判斷字串是否以指定的字串結束,如果是則傳回True
,否則傳回False
。
startswith(prefix[, start[, end]], /)
endswith(suffix[, start[, end]], /)
- prefix 參數
prefix
參數表示目標字串開頭部分需要比對的字串,如果該參數是包含多個字串的元組,那麽目標字串的開頭只需要與其中之一相符。- suffix 參數
suffix
參數表示目標字串結尾部分需要比對的字串,如果該參數是包含多個字串的元組,那麽目標字串的結尾只需要與其中之一相符。
Pythonstr
型別的find
方法用於傳回指定字串在目標字串中第一次出現的位置,如果指定字串沒有出現過,則傳回-1
。str
型別的rfind
方法用於傳回指定字串在目標字串中最後一次出現的位置,如果指定字串沒有出現過,則傳回-1
。str
型別的index
和rindex
方法與find
和rfind
方法類似,但會引發例外狀況ValueError
,當指定字串沒有出現時。
find(sub[, start[, end]], /)
rfind(sub[, start[, end]], /)
index(sub[, start[, end]], /)
rindex(sub[, start[, end]], /)
- sub 參數
sub
參數表示需要尋找的字串,如果傳遞空字串,則find
和index
傳回的位置為0
,rfind
和rindex
傳回的位置為字串長度。
Pythonstr
型別的replace
方法用於取代目標字串中的內容,取代後的結果會作為新的字串傳回。
replace(old, new[, count], /)
- old 參數
old
參數表示需要被取代的舊內容。如果為空字串,則取代效果相當於在目標字串的每個字元前插入參數new
的內容,參數new
的內容至少出現一次。- new 參數
new
參數表示取代後的新內容。- count 參數
count
參數表示取代的次數,如果未指定或小於0
,則取代次數不受限製。
Pythonstr
型別的strip
方法將移除字串開頭和結尾的字元,直到字元未出現在chars
參數中,移除後的結果會作為新的字串傳回。str
型別的lstrip
和rstrip
方法與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
,表示分割的最大執行次數,假如maxsplit
為2
,那麽傳回串列的最大長度為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
型別的ljust
,rjust
方法與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
保持不變。
# 一個轉換表類別
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
,否則傳回False
。str
型別的isdigit
方法用於判斷字串中的字元是否均為數值字元,即 Unicode 中 Numeric_Type 為 Digit 或 Decimal 的字元,如果是則傳回True
,否則傳回False
。顯然isdigit
判斷的範圍要比isdecimal
更大,比如對於字串'¹'
,isdecimal
傳回False
,isdigit
傳回True
。str
型別的isnumeric
方法用於判斷字串中的字元是否均為具有數值特征的字元,但該方法的判斷範圍最廣,包含 Unicode 中 Numeric_Type 為 Digit, Decimal 或 Numeric 的字元。
isalpha()
isdigit()
isnumeric()
Pythonstr
型別的isalnum
方法用於判斷字串中的字元是否均為字母字元₁,或具有數值特征的字元,當isalpha
或isnumeric
之一傳回True
時,isalnum
方法也會傳回True
,否則傳回False
。
isalnum()
Pythonstr
型別的isascii
方法用於判斷字串中的字元是否均為 ASCII 字元,如果是則傳回True
(包括空字元),否則傳回False
。str
型別的isidentifier
方法用於判斷字串是否是一個有效的 Python 識別碼,如果是則傳回True
,否則傳回False
(包括空字元)。str
型別的isprintable
方法用於判斷字串中的字元是否均為可列印字元,如果是則傳回True
(包括空字元),否則傳回False
。str
型別的isspace
方法用於判斷字串中的字元是否均為空白字元,如果是則傳回True
,否則傳回False
(包括空字元)。
isascii()
isidentifier()
isprintable()
isspace()
Unicode 中的 Nd 分類不止包含 0123456789
Unicode 中的 Nd 分類不止包含0123456789
,還包含其他語種的對應形式,比如 Wancho 中的𞋰𞋱𞋲𞋳𞋴𞋵𞋶𞋷𞋸𞋹
。
Python 的 isdecimal,isdigit,isnumeric 方法只能判斷字串是否為簡單數值
Python 的isdecimal
,isdigit
和isnumeric
方法只能判斷字串是否為簡單數值,如果包含小數點或正負號,那麽這些方法將傳回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'