字串操作处理
在 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]
微信扫码关注
抖音扫码关注