URLhttps://learnscript.net/zh-hant/python/data-types/text-types/
    複製連結移至說明  範例

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

    閱讀 28:08·字數 8441·更新 
    Youtube 頻道
    訂閱 375

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

    Python 文字/字串型別

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

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

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

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

    在下面的程式碼中,我們將用於建置電子郵件正規表達式的字串分成了三行,並使用()括住,否則每一行均會被認定為新的運算式。需要檢測的電子郵件位址被書寫為"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 的len函式可用於取得字串長度,這將呼叫字串物件的__len__方法。比如,len('Hello\tWorld\r\n')的結果為13

    Python 取得字串長度
    影片示範 YouTube

    如何反轉字串?

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

    序列型別

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

    建立 Python 字串

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

    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__ 方法

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

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

    跳脫 Python 字串中的字元

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

    
    
    跳脫序列表示內容
    \\反斜線
    \'單引號
    \"雙引號
    \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

    如何禁止字串中的 \ 成為跳脫字元?

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

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

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

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

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

    跳脫

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

    格式化 Python 字串

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

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

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

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

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

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

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

    sub 參數

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

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

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

    prefix 參數

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

    suffix 參數

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

    str型別的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傳回的位置為字串長度。

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

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

    old 參數

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

    new 參數

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

    count 參數

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

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

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

    chars 參數

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

    str型別的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 字串

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

    str型別的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,則取代次數不受限製。

    str型別的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,則分割內容的結尾處會包含界限字元。

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

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

    sep 參數

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

    str型別的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 中的字元大小寫操作

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

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

    upper()
    lower()
    casefold()

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

    isupper()
    islower()

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

    capitalize()

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

    title()
    istitle()

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

    swapcase()

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

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

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

    雖然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 字串

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

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

    expandtabs(tabsize=8)

    tabsize 參數

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

    str型別的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 字串中字元

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

    translate(table)

    table 參數

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

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

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

    str.maketrans(x)

    x 參數

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

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

    x 參數

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

    y 參數

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

    z 參數

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

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

    在下面的範例中,我們定義了一個充當轉換表的類別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 字串是否為字母或數值

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

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

    isalpha()

    str型別的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()

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

    isalnum()

    str型別的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 中的𞋰𞋱𞋲𞋳𞋴𞋵𞋶𞋷𞋸𞋹

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

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

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

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

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

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

    encoding 參數

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

    errors 參數

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

    'Hello'.encode()
    b'Hello'

    內容分類

    常見問題

    如何將 Python str 字串型別轉換為 int 整數,float 浮點數,complex 複數型別?

    使用intfloatcomplex型別的建構子,可以將表示數值的字串轉換為整數,浮點數,複數,你可以檢視轉換 Python 數值型別與字串型別一段來了解相關資訊。

    當然,在使用數值型別的建構子時,需要確保字串所表示的數值是合理的,否則可能會引發例外狀況,比如,在使用int整數型別的建構子時,傳遞字串'1.23'

    此外,intfloatcomplex型別的建構子不能轉換空字串''或空值None

    int('123')
    123
    float('123.456')
    123.456
    complex('1+2.3j')
    (1+2.3j)
    # ERROR 不能轉換空字串
    int('')

    ValueError: invalid literal for int() with base 10: ''

    原始碼

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

    講解影片

    Python 取得字串長度·YouTube
    Python 反轉字串順序,配量運算式簡介·YouTube
    Python 字串轉換 int、float、complex·YouTube