字串操作處理
在 Python 裡如果遇到資料中的文字處理狀況,通常會使用迴圈的方式慢慢處理,然而 NumPy 提供許多處理與操作陣列裡文字的方法,能夠很簡單的進行分割、合併、置換...等字串處理,也能夠快速地進行內容判斷並回傳布林值,這篇教學會介紹 NumPy 操作與處理字串的方法。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
NumPy 字串操作方法
下方列出 NumPy 的字串操作方法 ( 完整函式可參考 NumPy 官方文件:String operations ):
分類 | 說明 |
---|---|
建立字串陣列 | 建立由字串所組成的新陣列。 |
組合、重複字串 | 組合不同的字串陣列,或重複字串內容。 |
對齊、補齊字串 | 對齊字串內容,或使用特定字元補齊內容。 |
移除、分割字串 | 移除字串內特定文字,或根據特定字元分割字串。 |
替換、轉換字串 | 替換字串內的特定文字,或進行大小寫的轉換。 |
尋找字串、計算字串長度 | 尋找字串內的特定文字,或計算字串長度。 |
判斷字串 | 判斷字串的內容、大小寫、開頭或結尾,並回傳布林值。 |
建立字串陣列
透過 NumPy 建立字串陣列的方法,可以建立由字串所組成的新陣列。
方法 | 參數 | 說明 |
---|---|---|
numpy.char.array() | a | 根據現有串列資料,去除換行符號和結尾空白,產生文字陣列。 |
numpy.char.asarray() | a | 根據現有串列資料,去除換行符號和結尾空白,產生文字陣列。 |
numpy.char.chararray() | size, unicode | 產生指定形狀的 unicode 或 String 文字陣列,參數 unicode 預設 False 表示 String。 |
from numpy import char
a = char.array(['a','b','c. \n', 1]) # 換行符號和空白會被取代,數字轉換成文字
b = char.asarray(['a','b','c. \n',1]) # 換行符號和空白會被取代,數字轉換成文字
print(a) # ['a' 'b' 'c.' '1']
print(b) # ['a' 'b' 'c.' '1']
c1 = char.chararray((3,3)) # 產生一個 3x3 的文字陣列,內容放入 string
c2 = char.chararray((3,3), unicode=True) # 產生一個 3x3 的文字陣列,內容放入 unicode 字串
print(c1) # [[b'\xa0' b'\x10' ''] [b'\xe6' b'!' b'V'] ['' '' '']]
print(c2) # [['' '' ''] ['' '' ''] ['' '' '']]
d = char.chararray((3,3), unicode=True) # 產生一個 3x3 的文字陣列,內容放入 unicode 字串
d[:] = 'a' # 將內容全換成字母 a
print(d) # [['a' 'a' 'a'] ['a' 'a' 'a'] ['a' 'a' 'a']]
組合、重複字串
透過 NumPy 組合、重複字串的方法,可以組合不同的字串陣列,或重複字串內容,成為新的陣列。
方法 | 參數 | 說明 |
---|---|---|
numpy.char.add() | a, b | 將同樣形狀的 a 陣列和 b 陣列內容,合併為新的陣列。 |
numpy.char.multiply() | a, n | 重複 a 陣列的內容 n 次,成為新的陣列。 |
from numpy import char
a = np.array(['a','b','c','d']) # 1x4 一維陣列
b = np.array(['w','x','y','z']) # 1x4 一維陣列
print(char.add(a,b)) # ['aw' 'bx' 'cy' 'dz']
print(char.multiply(a,3)) # ['aaa' 'bbb' 'ccc' 'ddd']
c = np.array([['a','b'],['c','d']]) # 2x2 二維陣列
d = np.array([['w','x'],['y','z']]) # 2x2 二維陣列
print(char.add(c,d)) # [['aw' 'bx'] ['cy' 'dz']]
print(char.multiply(c,3)) # [['aaa' 'bbb'] ['ccc' 'ddd']]
對齊、補齊字串
透過 NumPy 對齊、補齊字串的方法,可以對齊字串內容,或使用特定字元補齊內容,成為新的陣列。
方法 | 參數 | 說明 |
---|---|---|
numpy.char.center() | a, n, s | 設定陣列 a 每個項目的寬度 n,並將內容文字置中對齊,缺少的部分補上指定文字 s。 |
numpy.char.ljust() | a, n, s | 設定陣列 a 每個項目的寬度 n,並將內容文字靠左對齊,缺少的部分補上指定文字 s。 |
numpy.char.rjust() | a, n, s | 設定陣列 a 每個項目的寬度 n,並將內容文字靠右對齊,缺少的部分補上指定文字 s。 |
numpy.char.zfill() | a, n | 設定陣列 a 每個項目的寬度 n,並將內容文字靠右對齊,缺少的部分補上 0。 |
from numpy import char
a = np.array(['a','bb','ccc','dddd'])
print(char.center(a, 10, '+')) # 置中對齊,空白補 +
# ['++++a+++++' '++++bb++++' '+++ccc++++' '+++dddd+++']
print(char.ljust(a, 10, '+')) # 置左對齊,空白補 +
# ['a+++++++++' 'bb++++++++' 'ccc+++++++' 'dddd++++++']
print(char.rjust(a, 10, '+')) # 置右對齊,空白補 +
# ['+++++++++a' '++++++++bb' '+++++++ccc' '++++++dddd']
print(char.zfill(a, 10)) # 置右對齊,空白補 0
# ['000000000a' '00000000bb' '0000000ccc' '000000dddd']
移除、分割字串
透過 NumPy 移除、分割字串的方法,可以移除字串內特定文字,或根據特定字元分割字串,成為新的陣列。
方法 | 參數 | 說明 |
---|---|---|
numpy.lstrip() | a, s | 移除陣列 a 左側所有指定字串 s ( 遇到不是指定字串就停止 )。 |
numpy.rstrip() | a, s | 移除陣列 a 右側所有指定字串 s ( 遇到不是指定字串就停止 )。 |
numpy.strip() | a, s | 移除陣列 a 左右側所有指定字串 s ( 遇到不是指定字串就停止 )。 |
numpy.partition() | a, s | 以指定字串 s 的左側分割陣列 a 的元素 ( 分割後會包含指定的字串 )。 |
numpy.rpartition() | a, s | 以指定字串 s 的右側分割陣列 a 的元素 ( 分割後會包含指定的字串 )。 |
numpy.split() | a, s | 以指定字串 s 的左側分割陣列 a 的元素 ( 分割後會不包含指定的字串 )。 |
numpy.rsplit() | a, s | 以指定字串 s 的右側分割陣列 a 的元素 ( 分割後會不包含指定的字串 )。 |
numpy.splitlines() | a | 根據換行符號分割陣列 a 的元素 ( 分割後會不包含換行符號 )。 |
from numpy import char
a = np.array(['aaa','aa\nbb','bb\naa','abab'])
print(char.lstrip(a,'a')) # 移除左側所有 a ( 遇到不是 a 就停止 )
# ['' '\nbb' 'bb\naa' 'bab']
print(char.rstrip(a,'a')) # 移除右側所有 a ( 遇到不是 a 就停止 )
# ['' 'aa\nbb' 'bb\n' 'abab']
print(char.strip(a,'a')) # 移除左右所有 a ( 遇到不是 a 就停止 )
# ['' '\nbb' 'bb\n' 'bab']
print(char.partition(a,'a')) # 以 b 的左側分割元素 ( 分割後會包含 b )
# [['' 'a' 'aa'] ['' 'a' 'a\nbb'] ['bb\n' 'a' 'a'] ['' 'a' 'bab']]
print(char.rpartition(a,'a')) # 以 b 的右側分割元素 ( 分割後會包含 b )
# [['aa' 'a' ''] ['a' 'a' '\nbb'] ['bb\na' 'a' ''] ['ab' 'a' 'b']]
print(char.split(a,'a')) # 以 b 的左側分割元素 ( 分割後會不包含 b )
# [list(['', '', '', '']) list(['', '', '\nbb']) list(['bb\n', '', '']) list(['', 'b', 'b'])]
print(char.rsplit(a,'a')) # 以 b 的右側分割元素 ( 分割後會不包含 b )
# [list(['', '', '', '']) list(['', '', '\nbb']) list(['bb\n', '', '']) list(['', 'b', 'b'])]
print(char.splitlines(a)) # 根據換行符號分割元素
# [list(['aaa']) list(['aa', 'bb']) list(['bb', 'aa']) list(['abab'])]
替換、轉換字串
透過 NumPy 替換、轉換字串的方法,可以替換字串內的特定文字,或進行大小寫的轉換,成為新的陣列。
方法 | 參數 | 說明 |
---|---|---|
numpy.char.capitalize() | a | 將 a 陣列中一段文字的字首字母轉成大寫,成為新的陣列。 |
numpy.char.lower() | a | 將 a 陣列中的字母全部轉小寫,成為新的陣列。 |
numpy.char.upper() | a | 將 a 陣列中的字母全部轉大寫,成為新的陣列。 |
numpy.char.swapcase() | a | 將 a 陣列中的字母大小寫互換,成為新的陣列。 |
numpy.char.title() | a | 將 a 陣列中的所有單字字首轉大寫,成為新的陣列。 |
numpy.char.join() | s,a | 將 a 陣列中的所有字母之間加上字元 s 內容,成為新的陣列。 |
numpy.char.replace() | a,s1,s2 | 將 a 陣列中的所有 s1 的字母換成 s2,成為新的陣列。 |
numpy.char.encode() | a | 將 a 陣列中的所有文字換成 unicode。 |
numpy.char.decode() | a | 將 a 陣列中的所有文字換成 utf8。 |
from numpy import char
a = np.array(['abc','ABC','abc xyz'])
print(char.capitalize(a)) # 一段文字的字首字母轉大寫
# ['Abc' 'Abc' 'Abc xyz']
print(char.lower(a)) # 字母全部轉小寫
# ['abc' 'abc' 'abc xyz']
print(char.upper(a)) # 字母全部轉大寫
# ['ABC' 'ABC' 'ABC XYZ']
print(char.swapcase(a)) # 字母大小寫互換
# ['ABC' 'abc' 'ABC XYZ']
print(char.title(a)) # 所有單字字首轉大寫
# ['Abc' 'Abc' 'Abc Xyz']
print(char.join('-',a)) # 所有字母之間加上 -
# ['a-b-c' 'A-B-C' 'a-b-c- -x-y-z']
print(char.join(['-',':','+'],a)) # 在不同項目裡,所有字母間加上對應的符號
# ['a-b-c' 'A:B:C' 'a+b+c+ +x+y+z']
print(char.replace(a,'abc','mno')) # 置換 abc 為 mno
# ['mno' 'ABC' 'mno xyz']
c = char.encode(a) # 換成 unicode
print(c) # [b'abc' b'ABC' b'abc xyz']
print(char.decode(c)) # 換成 utf8
# ['abc' 'ABC' 'abc xyz']
尋找字串、計算字串長度
透過 NumPy 尋找字串、計算字串長度的方法,可以尋找字串內的特定文字,或計算字串長度,成為新的陣列。
方法 | 參數 | 說明 |
---|---|---|
numpy.char.find() | a, s | 從左邊開始找到字串 s 的位置 ( 第一個位置為 0 ),找不到回傳 -1。 |
numpy.char.rfind() | a, s | 從右邊開始找到字串 s 的位置 ( 第一個位置為 0 ),找不到回傳 -1。 |
numpy.char.count() | a, s, start, end | 計算陣列 a 的每個元素,出現幾次字串 s,後方為字串開始與結束的位置。 |
numpy.char.str_len() | a | 計算 a 陣列中每個項目裡字串的長度。 |
from numpy import char
a = np.array(['abab','aabb','bbaa','xyz'])
print(char.find(a,'a')) # 從左邊開始找到字母 a 的位置
# [ 0 0 2 -1]
print(char.rfind(a,'a')) # 從右邊開始找到字母 a 的位置
# [ 2 1 3 -1]
print(char.count(a,'a',0,2)) # 計算出現幾次字母 a
# [1 2 0 0]
print(char.count(a,'a',1,3)) # [1 1 1 0]
print(char.str_len(a)) # [4 4 4 3]
判斷字串
透過 NumPy 判斷字串的方法,可以判斷字串的內容、大小寫、開頭或結尾,並回傳布林值所組成的新陣列。
方法 | 參數 | 說明 |
---|---|---|
numpy.char.isalpha() | a | 只有字母 True,有包含數字或其他符號 False。 |
numpy.char.isalnum() | a | 只有字母和數字 True,有包含其它符號 False。 |
numpy.char.sdecimal() | a | 只有十進位數字 True,有包含其它符號或字母 False。 |
numpy.char.isdigit() | a | 只有純數字 True,有包含其它符號或字母 False。 |
numpy.char.isnumeric() | a | 只有純數字 True,有包含其它符號或字母 False。 |
numpy.char.isspace() | a | 只有空白符號 True,有包含字母、數字或其它符號 False。 |
numpy.char.islower() | a | 至少有一個字母且都小寫 True,有包含大寫 False。 |
numpy.char.isupper() | a | 至少有一個字母且都大寫 True,有包含小寫 False。 |
numpy.char.istitle() | a | 字串是 title ( 每個單字的字首都大寫 ) True,否則 False。 |
numpy.char.startswith() | a,s | 開頭的字串為 s 則 True,否則 False。 |
numpy.char.endswith() | a,s | 結尾的字串為 s 則 True,否則 False。 |
numpy.char.equal() | a,b | a 陣列和 b 陣列元素相等 True,否則 False。 |
numpy.char.not_equal() | a,b | a 陣列和 b 陣列元素不相等 True,否則 False。 |
numpy.char.greater_equal() | a,b | a 陣列和 b 陣列元素 的 unicode 大於且相等 True,否則 False。 |
numpy.char.less_equal() | a,b | a 陣列和 b 陣列元素 的 unicode 小於且相等 True,否則 False。 |
numpy.char.greater() | a,b | a 陣列和 b 陣列元素 的 unicode 大於 True,否則 False。 |
numpy.char.less() | a,b | a 陣列和 b 陣列元素 的 unicode 小於 True,否則 False。 |
numpy.char.compare_chararrays() | a,b,cmp,bool | a 陣列和 b 陣列元素 的 unicode 滿足邏輯公式 True,否則 False。 |
from numpy import char
a = np.array(['abc','ABC','Abc Cba','abc123','123',''])
b = np.array(['abc','123','xyz','abc123','123',''])
print(char.isalpha(a)) # 只有字母 True,有包含數字或其他符號 False
# [ True True False False False False]
print(char.isalnum(a)) # 只有字母和數字 True,有包含其它符號 False
# [ True True False True True False]
print(char.isdecimal(a)) # 只有十進位數字 True,有包含其它符號或字母 False
# [False False False False True False]
print(char.isdigit(a)) # 只有純數字 True,有包含其它符號或字母 False
# [False False False False True False]
print(char.isnumeric(a)) # 只有純數字 True,有包含其它符號或字母 False
# [False False False False True False]
print(char.isspace(a)) # 只有空白符號 True,有包含字母、數字或其它符號 False
# [False False False False False False]
print(char.islower(a)) # 至少有一個字母且都小寫 True,有包含大寫 False
# [ True False False True False False]
print(char.isupper(a)) # 至少有一個字母且都大寫 True,有包含小寫 False
# [False True False False False False]
print(char.istitle(a)) # 字串是 title ( 每個單字的字首都大寫 ) True,否則 False
# [False False True False False False]
print(char.startswith(a,'a')) # a 開頭的字串 True,否則 False
# [ True False False True False False]
print(char.endswith(a,'a')) # a 結尾的字串 True,否則 False
# [False False True False False False]
print(char.equal(a,b)) # a 陣列和 b 陣列元素相等 True,否則 False
# [ True False False True True True]
print(char.not_equal(a,b)) # a 陣列和 b 陣列元素不相等 True,否則 False
# [False True True False False False]
print(char.greater_equal(a,b)) # a 陣列和 b 陣列元素 的 unicode 大於且相等 True,否則 False
# [ True True False True True True]
print(char.less_equal(a,b)) # a 陣列和 b 陣列元素 的 unicode 小於且相等 True,否則 False
# [ True False True True True True]
print(char.greater(a,b)) # a 陣列和 b 陣列元素 的 unicode 大於 True,否則 False
# [False True False False False False]
print(char.less(a,b)) # a 陣列和 b 陣列元素 的 unicode 小於 True,否則 False
# [False False True False False False]
print(char.compare_chararrays(a,b,'>=',True)) # a 陣列和 b 陣列元素 的 unicode 大於等於 True,否則 False
# [ True True False True True True]
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~