本節來講一下文本處理相關的庫
- str
字符串定義:
在 Python 中處理文本數據是使用 str 對象,也稱為 字符串。 字符串是由 Unicode 碼位構成的不可變序列。
字符串字面值有多種不同的寫法:
單引號: '允許包含有 "雙" 引號’
雙引號: "允許包含有 '單' 引號”
三重引號: '''三重單引號''', """三重雙引號"""
使用三重引號的字符串可以跨越多行 —— 其中所有的空白字符都將包含在該字符串字面值中。
class str(object='')
class str(object=b'', encoding='utf-8', errors='strict')
返回 object 的 字符串 版本。 如果未提供 object 則返回空字符串。 在其他情況下 str() 的行為取決於 encoding 或 errors 是否有給出。
-r 表示字符串中所有的字符表示其本身,比如,反斜槓就是反斜槓,不是用來轉義的,'\n' 表示換行符,是一個字符,而 r'\n' 則是兩個字符:一個反斜槓、一個小寫n。
-u 表示字符串是Unicode字符串,在Python 3中保留是為了兼容Python 2,而Python 3中的字符串默認都是Unicode字符串,在Python 3中,不需要添加,而且不能和 r 一起使用。
字符串方法:
str.capitalize()
返回原字符串的副本,其首個字符大寫,其餘為小寫。
示例:
print(str.capitalize('a我是個字符串’))
輸出:
A我是個字符串
str.casefold()
返回原字符串消除大小寫的副本。 消除大小寫的字符串可用於忽略大小寫的匹配。
消除大小寫類似於轉為小寫,但是更加徹底一些,因為它會移除字符串中的所有大小寫變化形式。
例如,德語小寫字母 'ß' 相當於 "ss"。 由於它已經是小寫了,lower() 不會對 'ß' 做任何改變;而 casefold() 則會將其轉換為 "ss"。
示例:
print(str.casefold('ABGQ我是個字符串'))
輸出:
abgq我是個字符串
str.center(width[, fillchar])
返回長度為 width 的字符串,原字符串在其正中。
使用指定的 fillchar 填充兩邊的空位(默認使用 ASCII 空格符)。 如果 width 小於等於 len(s) 則返回原字符串的副本。
示例:
test_str = str('ABGQ我是個字符串')
print(test_str.center(20, 'M'))
輸出:
MMMMMABGQ我是個字符串MMMMM
str.count(sub[, start[, end]])
反回子字符串 sub 在 [start, end] 範圍內非重疊出現的次數。 可選參數 start 與 end 會被解讀為切片表示法。
示例:
test_str = str('ABGQ我是個字符串ABGQ')
print(test_str.count('A’)) # 統計A在test_str中出現的次數
print(test_str[0:5]) # 0到5位置的字符串是“ABGQ我”
print(test_str.count('A', 0, 5)) # 統計A在test_str字符串,[0,5]範圍內出現的次數,[0,5]範圍是‘ABGQ我’,所以統計出來的個數是1個
輸出:
2
ABGQ我
1
str.encode(encoding="utf-8", errors="strict")
返回原字符串編碼為字節串對象的版本。 默認編碼為 'utf-8’。
可以給出 errors 來設置不同的錯誤處理方案。 errors 的默認值為 'strict',表示編碼錯誤會引發 UnicodeError。
其他可用的值為 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及任何其他通過 codecs.register_error() 註冊的值。
示例:
test_str = str('ABGQ我是個字符串ABGQ')
print(test_str.encode()) # 默認編碼 ‘utf-8’
print(test_str) # 說明encode操作不會改變test_str
輸出:
b'ABGQ\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xaa\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2ABGQ'
ABGQ我是個字符串ABGQ
str.endswith(suffix[, start[, end]])
如果字符串以指定的 suffix 結束返回 True,否則返回 False。 suffix 也可以為由多個供查找的後綴構成的元組。
如果有可選項 start,將從所指定位置開始檢查。 如果有可選項 end,將在所指定位置停止比較。
示例:
test_str = str('ABGQ我是個字符串ABGQ')
print(test_str.endswith('BGQ'))
print(test_str.endswith('BG'))
print(test_str.endswith('BGQ', 0, 4)) #比較[0:4]就是‘ABGQ’字符串的結尾是否是’BGQ’,所以這裡是True
print(test_str.endswith('BGQ', 0, 5)) #比較[0:5]就是’ABGQ我’字符串的結尾是否是’BGQ’,所以這裡是False
輸出:
True
False
True
False
str.expandtabs(tabsize=8)
返回字符串的副本,其中所有的製表符會由一個或多個空格替換,具體取決於當前列位置和給定的製表符寬度。 每 tabsize 個字符設為一個製表位(默認值 8 時設定的製表位在列 0, 8, 16 依次類推)。 要展開字符串,當前列將被設為零並逐一檢查字符串中的每個字符。 如果字符為製表符 (\t),則會在結果中插入一個或多個空格符,直到當前列等於下一個製表位。 (製表符本身不會被複制。) 如果字符為換行符 (\n) 或回車符 (\r),它會被複制並將當前列重設為零。 任何其他字符會被不加修改地複製並將當前列加一,不論該字符在被打印時會如何顯示。
>>> '01\t012\t0123\t01234'.expandtabs()
'01 012 0123 01234'
>>> '01\t012\t0123\t01234'.expandtabs(4)
'01 012 0123 01234'
str.find(sub[, start[, end]])
返回子字符串 sub 在 s[start:end] 切片內被找到的最小索引。 可選參數 start 與 end 會被解讀為切片表示法。 如果 sub 未被找到則返回 -1。
示例:
test_str = str('ABGQ我是個字符串ABGQ')
print(test_str.find('A’)) # 從頭開始找第一個A所在的位置索引,所以是0
print(test_str.find('Q’)) # 從頭開始找第一個Q所在的位置索引,所以是3
print(test_str.find('個’)) # 從頭開始找第一個“個”所在的位置索引,所以是6
print(test_str.find('B', 5)) # 從位置索引是5的地方開始找第一個B所在的位置索引,所以是11
print(test_str.find('K’)) # 從頭開始找第一個K所在的位置索引,因為沒找到,所以返回-1
輸出:
0
3
6
11
-1
str.format(*args, **kwargs)
執行字符串格式化操作。
調用此方法的字符串可以包含字符串字面值或者以花括號 {} 括起來的替換域。
每個替換域可以包含一個位置參數的數字索引,或者一個關鍵字參數的名稱。
返回的字符串副本中每個替換域都會被替換為對應參數的字符串值。
示例:
addend1 = 3
addend2 = 6
sum = addend1 + addend2
# format 以位置參數做替換域
print('the sum is {0} + {1} = {2}'.format(addend1, addend2, sum))
# format 以關鍵字參數做替換域
print('the sum is {addend1_name} + {addend2_name} = {sum_name}'.format(addend1_name=addend1, addend2_name=addend2, sum_name=sum))
輸出:
the sum is 3 + 6 = 9
the sum is 3 + 6 = 9
str.index(sub[, start[, end]])
類似於 find(),但在找不到子類時會引發 ValueError。
示例:
test_str = str('ABGQ我是個字符串ABGQ')
test_str.index('H’)
輸出:
test_str.index('H')
ValueError: substring not found
str.isalnum()
如果字符串中的所有字符都是字母數字,並且至少有一個字符,則返回true,否則為false。
如果下面其中一個返回True,則字符c是字母數字:c.isalpha()、c.isdecimal()、c.isdigit()或c.isnumeric()。
示例:
test_str1 = str('99ABGQ我是個字符串ABGQ33')
print(test_str1.isalnum())
test_str2 = str('#99ABGQ我是個字符串ABGQ33%')
print(test_str2.isalnum())
輸出:
True
False
str.isalpha()
如果字符串中的所有字符都是字母順序的,並且至少有一個字符,則返回true,否則返回false。
字母字符是在Unicode字符數據庫中定義為“字母”的字符,即,一般類別屬性為“Lm”、“Lt”、“Lu”、“Ll”或“Lo”的。
注意,這與Unicode標準中定義的“Alphabetic”屬性不同。
示例:
test_str1 = str('99ABGQ我是個字符串ABGQ33’) #包含數字,所以返回False
print(test_str1.isalpha())
test_str2 = str('ABGQ我是個字符串ABGQ’) #純Unicode字符,所以返回True。中文漢字也是Unicode字符。
print(test_str2.isalpha())
輸出:
False
True
str.isdecimal()
如果字符串中的所有字符都是十進制字符,並且至少有一個字符,則返回true,否則返回false。
十進制字符是那些可以用來形成以10為基數的數字的字符,例如U+0660,阿拉伯-印度數字0。在形式上,十進制字符是Unicode通用類別“Nd”中的字符。
示例:
test_str1 = str('99ABGQ我是個字符串ABGQ33')
print(test_str1.isdecimal())
test_str2 = str('01234567890’) #十進制基數的字符“0123456789”
print(test_str2.isdecimal())
輸出:
False
True
str.isdigit()
如果字符串中的所有字符都是數字,並且至少有一個字符,則返回true,否則返回false。
數字包括十進制字符和需要特殊處理的數字,如兼容性上標數字。這包括不能用於以10為基數形成數字的數字,如Kharosthi數字。
在形式上,數字是具有屬性值Numeric_Type= digit或Numeric_Type=Decimal的字符。
str.isidentifier()
如果字符串是一個有效的標識符,則返回true,否則返回false。
示例:
test_str = str('school’) # 有效的標識符
print(test_str.isidentifier())
test_str = str('1school’) # 無效的標識符,因為是數字開頭的字符串
print(test_str.isidentifier())
輸出:
True
False
str.islower()
如果字符串中都是小寫字母,並且至少有一個字符,則返回true,否則返回false。
示例:
test_str = str('99school我@#¥’) #都是小寫字母,返回true
print(test_str.islower())
test_str = str('99我是誰@#¥’) #沒有字母,返回false
print(test_str.islower())
test_str = str('Who am I?’) #包含大寫字母,返回false
print(test_str.islower())
輸出:
True
False
False
str.isupper()
如果字符串中都是大寫字母,並且至少有一個字符,則返回true,否則返回false。
示例:
test_str = str('i am shanhai')
print(test_str.isupper()) #包含了小寫字母,所以返回false
test_str = str('I Am Shanhai')
print(test_str.isupper()) #包含了小寫字母,所以返回false
test_str = str('I AM SHANHAI')
print(test_str.isupper()) #全部是大寫字母,所以返回true
輸出:
False
False
True
str.isnumeric()
如果字符串中的所有字符都是數字字符,並且至少有一個字符,則返回true,否則為false。
數字字符包括數字字符,以及所有具有Unicode數值屬性的字符。
在形式上,數字字符是那些具有屬性值Numeric_Type=Digit、Numeric_Type=Decimal或Numeric_Type= numeric的字符。
str.isprintable()
如果字符串中的所有字符都可打印或字符串為空,則返回true,否則返回false。
不可打印字符是Unicode字符數據庫中定義為“其他”或“分隔符”的字符,ASCII空格(0x20)除外,它被認為是可打印的。
注意,在這個上下文中,可打印字符是在字符串上調用repr()時不應該轉義的字符。它與向sys寫入的字符串的處理無關。stdout或sys.stderr。
str.isspace()
如果字符串中只有空白字符並且至少有一個字符,則返回true,否則返回false。
空白字符是Unicode字符數據庫中定義為“其他”或“分隔符”的字符,而具有雙向屬性的字符是“WS”、“B”或“S”之一。
str.istitle()
如果字符串是有標題的字符串,並且至少有一個字符,則返回true。
例如大寫字符只能跟在無大小寫字符後面,小寫字符只能跟在大小寫字符後面。否則返回假。
str.join(iterable)
返回一個由 iterable 中的字符串拼接而成的字符串。
如果 iterable 中存在任何非字符串值包括 bytes 對象則會引發 TypeError。 調用該方法的字符串將作為元素之間的分隔。
str.ljust(width[, fillchar])
返回長度為 width 的字符串,原字符串在其中靠左對齊。
使用指定的 fillchar 填充空位 (默認使用 ASCII 空格符)。 如果 width 小於等於 len(s) 則返回原字符串的副本。
str.rjust(width[, fillchar])
返回長度為 width 的字符串,原字符串在其中靠右對齊。
使用指定的 fillchar 填充空位 (默認使用 ASCII 空格符)。 如果 width 小於等於 len(s) 則返回原字符串的副本。
str.lstrip([chars])
返回原字符串的副本,移除其中的前導字符。 chars 參數為指定要移除字符的字符串。
如果省略或為 None,則 chars 參數默認移除空格符。 實際上 chars 參數並非指定單個前綴;而是會移除參數值的所有組合。
str.rstrip([chars])
返回原字符串的副本,移除其中的末尾字符。 chars 參數為指定要移除字符的字符串。
如果省略或為 None,則 chars 參數默認移除空格符。 實際上 chars 參數並非指定單個後綴;而是會移除參數值的所有組合。
str.partition(sep)
在 sep 首次出現的位置拆分字符串,返回一個 3 元組,其中包含分隔符之前的部分、分隔符本身,以及分隔符之後的部分。
如果分隔符未找到,則返回的 3 元組中包含字符本身以及兩個空字符串。
str.replace(old, new[, count])
返回字符串的副本,其中出現的所有子字符串 old 都將被替換為 new。 如果給出了可選參數 count,則只替換前 count 次出現。
str.rfind(sub[, start[, end]])
返回子字符串 sub 在字符串內被找到的最大(最右)索引,這樣 sub 將包含在 s[start:end] 當中。
可選參數 start 與 end 會被解讀為切片表示法。 如果未找到則返回 -1。
str.rindex(sub[, start[, end]])
類似於 rfind(),但在子字符串 sub 未找到時會引發 ValueError。
str.rpartition(sep)
在 sep 最後一次出現的位置拆分字符串,返回一個 3 元組,其中包含分隔符之前的部分、分隔符本身,以及分隔符之後的部分。
如果分隔符未找到,則返回的 3 元組中包含兩個空字符串以及字符串本身。
str.rsplit(sep=None, maxsplit=-1)
返回一個由字符串內單詞組成的列表,使用 sep 作為分隔字符串。 如果給出了 maxsplit,則最多進行 maxsplit 次拆分,從 最右邊 開始。
如果 sep 未指定或為 None,任何空白字符串都會被作為分隔符。 除了從右邊開始拆分,rsplit() 的其他行為都類似於下文所述的 split()。
str.split(sep=None, maxsplit=-1)
返回一個由字符串內單詞組成的列表,使用 sep 作為分隔字符串。
如果給出了 maxsplit,則最多進行 maxsplit 次拆分(因此,列表最多會有 maxsplit+1 個元素)。
如果 maxsplit 未指定或為 -1,則不限制拆分次數(進行所有可能的拆分)。
如果給出了 sep,則連續的分隔符不會被組合在一起而是被視為分隔空字符串 (例如 '1,,2'.split(',') 將返回 ['1', '', '2'])。
sep 參數可能由多個字符組成 (例如 '1<>2<>3'.split('<>') 將返回 ['1', '2', '3'])。 使用指定的分隔符拆分空字符串將返回 ['']。
str.splitlines([keepends])
返回由原字符串中各行組成的列表,在行邊界的位置拆分。 結果列表中不包含行邊界,除非給出了 keepends 且為真值。
此方法會以下列行邊界進行拆分。 特別地,行邊界是 universal newlines 的一個超集。
str.startswith(prefix[, start[, end]])
如果字符串以指定的 prefix 開始則返回 True,否則返回 False。 prefix 也可以為由多個供查找的前綴構成的元組。
如果有可選項 start,將從所指定位置開始檢查。 如果有可選項 end,將在所指定位置停止比較。
str.strip([chars])
返回原字符串的副本,移除其中的前導和末尾字符。 chars 參數為指定要移除字符的字符串。
如果省略或為 None,則 chars 參數默認移除空格符。 實際上 chars 參數並非指定單個前綴或後綴;而是會移除參數值的所有組合。
示例:
test_str = str(' i am shanhai ')
print(test_str.strip()) #移除了字符串前後的空格符
test_str = str('i am shanhai')
print(test_str.strip('i’)) #移除字符串前後的’i’
輸出:
i am shanhai
am shanha
str.swapcase()
返回原字符串的副本,其中大寫字符轉換為小寫,反之亦然。
請注意 s.swapcase().swapcase() == s 並不一定為真值。
示例:
test_str = str('I Am Shanhai')
print(test_str.swapcase())
輸出:
i aM sHANHAI
str.title()
返回原字符串的標題版本,其中每個單詞第一個字母為大寫,其餘字母為小寫。
示例:
test_str = str('i am shanhai')
print(test_str.title())
輸出:
I Am Shanhai
static str.maketrans(x[, y[, z]])
此靜態方法返回一個可供 str.translate() 使用的轉換對照表。
如果只有一個參數,則它必須是一個將 Unicode 碼位序號(整數)或字符(長度為 1 的字符串)映射到 Unicode 碼位序號、(任意長度的)字符串或 None 的字典。
字符鍵將會被轉換為碼位序號。
如果有兩個參數,則它們必須是兩個長度相等的字符串,並且在結果字典中,x 中每個字符將被映射到 y 中相同位置的字符。
如果有第三個參數,它必須是一個字符串,其中的字符將在結果中被映射到 None。
str.translate(table)
返回原字符串的副本,其中每個字符按給定的轉換表進行映射。 轉換表必須是一個使用 __getitem__() 來實現索引操作的對象,通常為 mapping 或 sequence。
當以 Unicode 碼位序號(整數)為索引時,轉換表對象可以做以下任何一種操作:返回 Unicode 序號或字符串,將字符映射為一個或多個字符;
返回 None,將字符從結果字符串中刪除;或引發 LookupError 異常,將字符映射為其自身。
你可以使用 str.maketrans() 基於不同格式的字符到字符映射來創建一個轉換映射表。
示例:
transverter_before = 'abcde'
transverter_after = '12345'
transverter_table = str.maketrans(transverter_before, transverter_after) # 建立轉換表
test_str = str('+@AB我是個字符串abgq')
print(test_str.translate(transverter_table)) #把’abcde'用'12345’替換,所以這裡a替換成1,b替換成2,其他字符不變。
輸出:
+@AB我是個字符串12gq
str.lower()
返回原字符串的副本,其所有區分大小寫的字符均轉換為小寫。
示例:
test_str = str('ABGQ我是個字符串ABGQ')
print(test_str.lower())
輸出:
abgq我是個字符串abgq
str.upper()
返回原字符串的副本,其中所有區分大小寫的字符 4 均轉換為大寫。
請注意如果 s 包含不區分大小寫的字符或者如果結果字符的 Unicode 類別不是 “Lu” (Letter, uppercase) 而是 “Lt” (Letter, titlecase) 則 s.upper().isupper() 有可能為 False。
示例:
test_str = str('+@AB我是個字符串abgq')
print(test_str.upper())
輸出:
+@AB我是個字符串ABGQ
str.zfill(width)
返回原字符串的副本,在左邊填充 ASCII '0' 數碼使其長度變為 width。 正負值前綴 ('+'/'-') 的處理方式是在正負符號 之後 填充而非在之前。
如果 width 小於等於 len(s) 則返回原字符串的副本。
示例:
test_str = str('ABGQ我是個字符串ABGQ')
print(test_str.zfill(5))
print(test_str.zfill(25)) # 左邊補0
test_str = str('+ABGQ我是個字符串ABGQ’) # 在+之後填充0
print(test_str.zfill(25))
test_str = str('-ABGQ我是個字符串ABGQ’) # 在-之後填充0
print(test_str.zfill(25))
輸出:
ABGQ我是個字符串ABGQ
00000000000ABGQ我是個字符串ABGQ
+0000000000ABGQ我是個字符串ABGQ
-0000000000ABGQ我是個字符串ABGQ