Python字串

Python字串(string)基礎與20種常見操作

多數的程式設計師,處理字串的次數遠比數字還要多。

程式設計給人的印象通常是會使用到許多數學,也是不少人對學程式語言感到懼怕的原因。

但其實程式設計的實務上,處理文字字串 (string)的頻率遠比數字高出許多,若要說學習程式語言關鍵是什麼,邏輯思維與耐心比你的數學好不好還要重要。

Python字串是什麼?

Python string
Python string

字串是眾多Python資料型態的其中一種,以成對的引號來呈現,單引號、雙引號 、三個單引號、三個雙引號都可以拿來表示字串,代表文字的意思。

下面四個例子都代表Python字串。

下方的範例,>>>代表程式碼,沒有>>>代表程式運作的結果。

>>>'this'
>>>"is"
>>>'''a'''
>>>"""string! """

字串是字元序列,字元又是什麼呢?像是字母、數字、符號、空格或是換行都是字元,一個 a 是一個字元,一個空格也是一個字元,它是文書系統裡頭最小的單位。

如果想表達文字,卻忘了使用引號,Python 會將你輸入的文字視為變數、數字或是保留字。

下方例子可以看出字串與其他資料型態的差異,#符號是註解的符號,Python不會將#後方的文字當作程式碼。

加入註解可以方便理解與閱讀程式碼,下方的例子,使用註解告訴你各個值的類型。

>>>hello    #變數
>>>'hello'  #字串
>>>10       #整數
>>>'10'     #字串

Python 字串是不可變的 (inmmutable),你無法使用方法 (Method)對字串進行修改,但可以透過指派一個新的值給變數,來達到修改的效果。

也就是說,字串屬於不可變的資料型態

用哪一種引號來表示字串比較好?

短字串使用單或雙引號,多行字串使用三重引號。

>>>'hello’
>>>“hello”

這兩種表示短字串的方式都很普遍,你可以隨意地使用,只要確定是成對的就好,不可以前面單引號,後面雙引號,像’hello”,Python會回傳錯誤給你。

要特別注意的是,假如你要建立的值,也就是字串的內容物,裡頭有使用到單引號或雙引號時,要記得錯開,不要同時使用。

例如字串的值是 That’s mine!,因為使用了 ' 這個單引號,為避免Python無法辨識你的字串,建立字串時就建議以雙引號來包住字串的內容物。

>>>"That's mine!"

反過來說,如果字串中的值有用到雙引號,

例如你想印出 "Hi!”, he said.,那就要用單引號來表示字串,'"Hi!”, he said.'

>>>'"Hi!", he said.'

如果你想用單引號或雙引號建立多行字串,不行喔,Python 會顯示語法錯誤(SyntaxError) ,然後就不運作了。

針對多行字串我們可以使用三重引號,多行字串就像下方程式碼,使用三個單引號建立多行字串。

下方我們建立了一個四行的Python字串,並將這個字串指派給 song 這個變數。

>>>song = '''Baby shark, doo doo doo,
>>>Baby shark, doo doo doo doo doo,
>>>Baby shark, doo doo doo doo doo,
>>>Baby shark!'''

= 在Python代表將其右邊的值指派給左邊的變數,如果你還不清楚,可以閱讀〈Python觀念,從 = 開始〉文章。

除了建立多行字串,如果你有多行註釋,不想每一行都打上 #,也可以使用三個引號來表示。

只想用一種引號?轉義字元可以幫你

如果你就只想固定使用單引號來表示Python字串,什麼雙引號、三重引號你都不要!

也可以喔,你可以使用轉義字元(escape character),讓你的字串始終如一,只有單引號。

轉義是什麼呢?它可以讓你轉換字串內某些字元的涵義,你只需要在要轉義的字元前面加上一個\就可以轉義了。

以前面的例子,你只想用單引號製作 That’s mine! 的字串,如果輸入下方程式碼會有語法錯誤。

>>>print('That’s mine!')
    print('That's mine!')
                ^
SyntaxError: invalid syntax

使用 \ 將字串內的 ' 轉義即可正常運作。

>>>the_word = 'That\'s mine!'
>>>print(the_word)
That's mine!

常見轉義字元

常見轉義字元呈現結果
\’單引號’
\”雙引號”
\n換行,\n後的內容會換到下一行
\t定位空格,一個tab鍵的空格
\\反斜線\

字串的20種操作

覺得頭有點暈?看影片學習操作Python字串

使用 Str() 函式來建立字串

除了直接在你要轉變為字串的值兩端加上引號,來建立字串外,你也可以使用str()這個函式,優雅地使用各種資料型態來建立字串。

例如 123 是個整數(int),在 str() 函式的括號內填入你要作為字串的值,就可以建立該字串。

下方的例子中,使用 type() 這個函數顯示資料的型態,使用 str() 函數後,123 成為字串,再使用 print() 函式結果印出來。

str 代表字串, int 代表整數。

>>>str(123)
>>>print(type(str(123)))
<class 'str'>
>>>print(type(123))
<class 'int'>

利用 len() 函式取得字串長度

len()函式的括號中填入要取得長度的字串。

下方的例子中,空格也算一個位元,所以字串長度為12。

>>>word = 'hello python'
>>>print(len(word))
12 

顯示原始字串

在字串的前面加上 r,可以印出字串的全貌,包含轉義符號。在 'That\’s mine!' 這個字串前面加上 r,r'That\’s mine!'

>>>word = r'That\’s mine!'
>>>print(word)
That\’s mine!

取得字串內的部分字元

“that’s mine” 字串指派給變數the_wordthe_word =  “that’s mine”

the_word[0] 可以取得t。

the_word[1] 可以取得h。

the_word[0:5] 可以取得第0個位置到第4個位置的字元,that’。

>>>the_word = "that's mine"
>>>print(the_word[0:5])
that'

使用運算子 +、*、in、not in

+*innot in 運算子都可以結合字串運用。

兩個字串相加使用 +

假如現在有兩個字串,你想將它們連在一起,你可以使用 + 達到這個目的。

>>>line1 = 'Do you like Python?'
>>>line2 = 'Yes, and I am learning it.'
>>>print(line1 + ' ' + line2)
Do you like Python? Yes, and I am learning it.

重複字串使用 *

為了表達想自學成功的決心,打算寫 20 遍  I will success!

只需要打一次 I will success! ,再使用 * 運算子,就可以得到 20 個 I will success!

>>>print('I will success!' * 20)
I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!I will success!

使用 innot in 來檢查是否含有特定子字串

當字串中,存在你要找尋的子字串時,回傳的值會是 True,若無則會回傳 False

>>>print('He' in 'Hello')
True
>>>print('He' not in 'Hello')
False

字串插值 (string interpolation)

使用 %s 作為標記,在字串之後填入要插入的值,以 % (填入要插入內容 )呈現。

%s 的 % 代表初始值,s 代表字串,也可以替換為 d、f 等型態,%d 轉換為十進制整數,%f 轉換為十進制浮點數。

本文只討論 %s,如果你想深入了解,推薦閱讀《精通 Python(第2版)》這本書,在字串的章節,講解得相當清楚,這是一本入門書,不要被精通兩個字嚇到了。

下方例子中,在 'the %s is %s dollars.' 這個字串中放入兩個 %s 標記,在字串後,加上 % (),並在括號內填上要填入兩個變數 productprice,其中product 被指派為 'apple'price被指派為 55,最後印出的 sentence 就是 the apple is 55 dollars.

>>>product = 'apple'
>>>price = 55
>>>sentence = 'the %s is %s dollars.' % (product, price)
>>>print(sentence)
the apple is 55 dollars.

f-strings (Python 3.6後加入的)

與字串插值很像似,但將標記 %s 改為大括號 {},要呈現的內容,就直接填在{} 中,最重要的要在字串前面加上 f。

用與字串插值相同的例子,來看看如何使用 f-strings。

>>>product = 'apple'
>>>price = 55
>>>f_sentence = f'the {product} is {price} dollars.'
>>>print(f_sentence)
the apple is 55 dollars.

利用方法 (Method) 處理字串

函式 (function )與方法(Method)都是一段程式,有它的功能,只是方法(Method)在使用上需要接在要操作的目標之後,並且以一個句點.連接。

例如字串方法 lower(),需要接在字串之後,才可以運作,需要留意 () 是用來讓電腦知道你在呼叫這個方法,不要漏掉了。

>>>print('HOW'.lower())
how

方法並不會改變字串,而是讓字串依照方法的要求呈現。

因為各種資料型態特性不同,有些方法只有字串可以使用,有些則只有串列、字典等其他資料型態可以使用,誤用的話系統會顯示錯誤。

轉換英文字母大小寫

在驗證碼或帳號密碼輸入設計上很常見的觀念,因為英文大寫小對於 Python 而言是不一樣的意思,但若你想讓使用者在輸入 HOW、how、hOw 時,將三個字都視同一個字,便可以使用 lower() 這個方法,讓資料處理時都轉變為小寫,便可以判讀唯一樣的資料。

轉換字串字母大小寫的方法包括:lower()upper()title()capitalize(),請留意這個方法只有轉換,並沒有改變原本的字串。

  • upper() 將所有字母改為大寫
  • lower() 將所有字母改為小寫
  • capitalize() 將字串中的第一個字母大寫,其餘小寫
  • title() 將每個詞第一個字母大寫,其餘小寫
>>>word = 'how are you?'
>>>print(word.upper())       
HOW ARE YOU?
>>>print(word.lower())        
how are you?
>>>print(word.capitalize())   
How are you?
>>>print(word.title())         
How Are You?

islower()isupper() 辨別英文字母大小寫

使用 islower()isupper() 這個兩方法,來辨別字串中的字母是全部大寫或全部小寫,返回的值是布林值,若符合要求,返回 True,否則返回 False

>>>print('123abc'.islower())
True
>>>print('123'.islower())
False
>>>print('AAA'.lower().islower())
True

我們可以在使用方法後再接著使用方法,如例子 print('AAA'.lower().islower()),返回的值會是 True

isXXX 辨別字串內容

除了使用 islower()isupper() 這兩個字串方法外,還有 5 個類似的字串方法:

方法

功能

isalpha()

字串內只含有字母時,且不是空字串時,返回True。

isdecimal()

字串內只含有數字時,且不是空字串時,返回True。

isspace()

字串內只含有空格、定位空格(tab)、換行時,且不是空字串時,返回True。

istitle()

字串內第每個詞的第一個字母為大寫,其餘皆小寫,返回True。

isalnum()

字串內只含有字母或數字時,且不是空字串時,返回True。

>>>print('smile'.isalpha())
True
>>>print('smile666'.isalpha())
False
>>>print('666'.isdecimal())
True
>>>print(' '.isspace())
True
>>>print('You Make Me Smile.'.istitle())
True
>>>print('smile666'.isalnum())
True

startswith()endswith() 辨別開頭與結尾

startswith()endswith() 這兩個字串方法可依照你在 () 內所輸入的引數,辨別字串的起始與結尾是否與引述一致,一致返回值為 True,反之為 False

>>>print('You Make Me Smile.'.startswith('You'))
True
>>>print('You Make Me Smile.'.endswith('mile.'))
True
>>>print('You Make Me Smile.'.endswith('ohoh'))
False

strip() 從兩端移除字元

strip()字串方法會將字串兩端的空白字元刪除,就是把兩端的空格刪除的意思,如果只要刪除右邊的使用 rstrip(),只要刪除左邊的則使用 lstrip()

>>>word = '      Smart      '
>>>print(word.strip())
Smart
>>>print(word.rstrip())
      Smart
>>>print(word.lstrip())
Smart

如果刪除兩端指定的字元,在括號 () 內放入要刪除的字元即可。

>>>learner ='Smart!!!!!'
>>>print(learner.strip('!'))
Smart

這個方法只能從兩端刪除,如果要刪除的字元不在兩端,就無法直接刪除,而且引述的字元順序與是否刪除無關,只要符合 () 內的引數就可以。

以下方例子來說,為了瘦身 dinner 這個變數放了太多 dieT ,有些甚至打成dTie , strip('dieT’) 可以從兩端開始找尋 d、i、e、T,將要求的字元都刪除。

大小寫有差別,但順序沒差,是以字元的角度來查找比對,非針對字串,所以在句尾的dTie也會被刪除。不在句子兩端的 dieT 字元不會被刪除。

>>>dinner = 'dieTdeiTSteak and dieT soupdeiTdTie'
>>>print(dinner.strip('dieT')) 
Steak and dieT soup

對齊文字的字串方法

方法

功能

center()

依照括號內填入的數字,將字串於相對空格中置中對齊

rjust()

依照括號內填入的數字,將字串於相對空格中靠右對齊,r代表right。

ljust()

依照括號內填入的數字,將字串於相對空格中靠左對齊,l代表left。

括號內要填入的引數,相當於字串在多少空格中對齊,可以再填入第二個引數,替代預設了空格,下方第三個例子就是填入 * 取代預設的空格。

rjust(10)代表在10個字元的長度中,將字串靠右對齊。

>>>print('smile'.rjust(10))
     smile
>>>print('smile'.ljust(10))
smile
>>>print('smile'.center(20,'*'))
*******smile********

將字串切三段 partition()

這個字串方法可以將一個字串切割為三個部分,並回傳多元組(Tuple)。

>>>print('You work very hard!'.partition('very')) 
('You work ', 'very', ' hard!')

如果要分隔的字串在目標字串中有許多個,會以第一個出現的為主來分拆。

而若分隔個字串不存在,返回的 Tuple 第一個項目就是目標字串,後面兩的項目為空字串。

>>>print('You work very hard!'.partition('r'))
('You wo', 'r', 'k very hard!')
>>>print('You work very hard!'.partition('smart'))
('You work very hard!', '', '')

split() 拆出多個字串

split() 預設以空白字元來切割,並回傳包含分拆後各個字串的串列(list),回傳的資料型態是串列。

>>>print('You work very hard!'.split())
['You', 'work', 'very', 'hard!']

可以在括號那指定分割的依據,這個分隔字串不會留下。

>>>print('You work very hard!'.split('o'))
['Y', 'u w', 'rk very hard!']

常見的 split() 操作,是以 \n 換行字元作為分隔依據,將多行字串分拆出來。

下方的例子中,letter 這個變數所指派到的字串,使用三重引號,三重引號的換行預設有 \n,所以使用 split(’\n’) 分拆字串時,會將每一行都拆為一個字串,空行也會以空字串放入回傳值的串列中。

>>>letter = '''Hi Phoebe,
>>>The weather recently is great, 
>>>would you like to take a trip with me this weekend?
>>>If this weekend is not available, how about next weekend?
>>>
>>>BR,
>>>M.'''
>>>
>>>print(letter.split('\n'))
['Hi Phoebe,', 'The weather recently is great, ', 'would you like to take a trip with me this weekend?', 'If this weekend is not available, how about next weekend?', '', 'BR,', 'M.']

使用 join() 將字串結合

這個方法會需要字串(string) 與串列(list)這兩個材料,利用字串當膠水,把串列中的各個字串結合起來,回傳的值是串列(list)。

>>>gift_list = ['iphone 12', 'PS5', 'notebook']
>>>print('Christmas gifts: '+', '.join(gift_list))
Christmas gifts: iphone 12, PS5, notebook

replace() 替換

原本的字串值並不會改變,只是加上replace()方法後,指定的部分會被替換,有點類似拿了一個副本做替換,原本的字串不會改變。

replace(要被替換的值, 替換成這個值)

>>>lesson ='the new skill I am learning this year : Python.'
>>>print(lesson.replace('Python', 'playing guitar'))
the new skill I am learning this year : playing guitar.
>>>print(lesson)
the new skill I am learning this year : Python.

index() find() 找尋位置

在字串後加上 .index(要找的子字串) .find(要找的子字串) ,當子字串找的到時,兩個方法的回傳值的是字串首個字母的位置。

如果你困惑為何會出現 0 這個數字,你可以閱讀〈Python觀念〉這篇文章,釐清編寫Python時,位置該怎麼計算。

>>>lesson ='the new skill I am learning this year : Python.'
>>>print(lesson.index('the'))
0
>>print(lesson.find('the'))
0
>>>print(lesson.index('I'))
14
>>>print(lesson.find('I'))
14

預設的找尋的方向是由左至右,如果想從右邊開始找可以在 find() index() 前面加上 r,變成rfind()rindex(),就可以從右邊開始找。

以找尋 e 這個字母為例,會得到不一樣的位置回覆。

lesson ='the new skill I am learning this year : Python.'
>>>print(lesson.find('e'))
2
>>>print(lesson.rfind('e'))
34
>>>print(lesson.index('e'))
2
>>>print(lesson.rindex('e'))
34

當找不到目標時呢?index() 方法會回覆 ValueErrorfind() 則回傳 -1

>>>lesson ='the new skill I am learning this year : Python.'
>>>print(lesson.find('peace'))
-1
>>>print(lesson.index('peace'))
Traceback (most recent call last):
      print(lesson.index('peace'))
ValueError: substring not found

count() 計算出現的次數

利用 count() 計算括號內指定的字串出現的次數,下方的例子計算 e 這個字母在 lesson 這個字串中出現的次數,答案是 4 次。

>>>lesson ='the new skill I am learning this year : Python.'
>>>print(lesson.count('e'))
4

使用Python字串時常見的語法錯誤

使用Python字串時,常見的錯誤大多是因為引號問題而產生的語法錯誤(syntax error)。

語法錯誤(syntax error) 是編寫程式碼時,常見的錯誤。如果程式碼中有Python無法辨識的內容,就會顯示語法錯誤。

SyntaxError: EOL while scanning string literal

以下面的例子來說,因為字串的右邊少了引號,所以 Python 顯示語法錯誤,只要將引號加回去,就可會正常了。

>>>a = 'hi
>>>print(a)
    a = 'hi
          ^
SyntaxError: EOL while scanning string literal

SyntaxError: EOL while scanning string literal 這句話是什麼意思呢?

SyntaxError 是兩個英文單字,syntax 語法、error 錯誤,就是語法錯誤。

在語法錯誤有一個冒號,冒號之後說明錯誤是什麼。

EOL是 End Of Line 的縮寫,意思是:這一行的尾端。

錯誤的原因是 EOL while scanning string literal,Python 檢視字串後,發現尾端有錯誤,這裡的例子就是忘了把引號加上。

Python 除了文字說明外,也有用 ^ 符號指出錯誤的地方,協助你更正。

SyntaxError: invalid syntax

另一個使用Python字串時常見的錯誤是,未將引號與字串的內容作區隔,這個問題點在本文「用哪一種引號來表示字串比較好?」的段落有提到過,現在我們再來看一次。

下方的例子中,已經使用對稱的引號把 that’s mine! 這段文字包起來了,為何還會出現錯誤呢?

>>>b = 'that's mine!'
>>>print(b)
    b = 'that's mine!'
              ^
SyntaxError: invalid syntax

錯誤的原因在於,Python是由左至右在讀取程式碼,對於Python而言對稱的單引號是這樣 'that‘ ,之後的 s mine!' 對 Python 來說是不符合語法的。

 >>>b = 'that'

這個問題有兩個解決方法:

  1. 將建立字串的單引號,改為雙引號,與 that's 的單引號作區別,Python變可以完整讀出字串的內容。
  2. 不調整建立字串的單引號,而是使用轉義字元 \' 來告訴 Python,that\'s的單引號不是建立字串用的那個單引號。 
>>>c = "that's mine!"
>>>d = 'that\'s mine!'
>>>print(c)
>>>print(d)
that's mine!
that's mine!

當然語法錯誤的原因並不只限於這個兩例子,如果想看更多的範例,可以參考下方這篇文章 Invalid Syntax in Python: Common Reasons for SyntaxError 。

Python官方文件查詢字串方法

查找更多Python字串方法,可至官方文件閱讀,若對引數(argument)中的符號有困惑,可見下圖說明。

如果想瞭解更多字串的觀念與操作,可以閱讀《精通 Python》、《Python 自動化的樂趣》這兩本書,都有單獨針對字串做詳細的說明及練習。

延伸閱讀:

在〈Python字串(string)基礎與20種常見操作〉中有 11 則留言

  1. 謝謝這篇文章,更謝謝編寫這篇文章的作者(群)。多篇用 “真中文” 編寫的python文章,而且包含了相關str的必須資訊。彙總了常用的str相關指令/範例,讓我們這些初學者如大旱之望雲霓般得到甘霖。許多時候 “解惑” 是最佳的學習動力。再次謝謝你們。其它篇文章我會繼續研讀,才不會枉費貴單位的用心。

  2. 你好,請教我的song有下列內容,請問我如何給予 doo,請Python輸出2呢?謝謝。
    song = ‘Baby shark’ ,‘1’ ,’doo’, ‘2’

  3. 您好 感謝詳細的教學說明 讓大家可以快速上手
    不過 上方 “isXXX 辨別字串內容” 的圖表中
    第五個 Method 應該是 isalnum() 而不是 isdecimal() 對嗎?
    謝謝

    1. 您好:
      沒有錯誤喔,strip(‘dieT’)會從兩端去找d、i、e、T,找到就刪除,順序不影響,所以dTie也會被刪除。
      您可以複製程式碼到解譯器中,運行程式碼後的結果確實如文中所示。希望有解答到。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *