字串處理是非常常用的技能,但 Python 內建字串方法太多,常常遺忘,為了便於快速參考,特地依據 Python 3.5.1 給每個內建方法寫了示例並進行了歸類,便於大家索引。
概覽
字串大小寫轉換
-
str.capitalize()
-
str.lower()
-
str.casefold()
-
str.swapcase()
-
str.title()
-
str.upper()
字串格式輸出
-
str.center(width[, fillchar])
-
str.ljust(width[, fillchar]); str.rjust(width[, fillchar])
-
str.zfill(width)
-
str.expandtabs(tabsize=8)
-
str.format(^args, ^^kwargs)
-
str.format_map(mapping)
字串搜尋定位與替換
-
str.count(sub[, start[, end]])
-
str.find(sub[, start[, end]]); str.rfind(sub[, start[, end]])
-
str.index(sub[, start[, end]]); str.rindex(sub[, start[, end]])
-
str.replace(old, new[, count])
-
str.lstrip([chars]); str.rstrip([chars]); str.strip([chars])
-
static str.maketrans(x[, y[, z]]); str.translate(table)
字串的聯合與分割
-
str.join(iterable)
-
str.partition(sep); str.rpartition(sep)
-
str.split(sep=None, maxsplit=-1); str.rsplit(sep=None, maxsplit=-1)
-
str.splitlines([keepends])
字串條件判斷
-
str.endswith(suffix[, start[, end]]); str.startswith(prefix[, start[, end]])
-
str.isalnum()
-
str.isalpha()
-
str.isdecimal(); str.isdigit(); str.isnumeric()
-
str.isidentifier()
-
str.islower()
-
str.isprintable()
-
str.isspace()
-
str.istitle()
-
str.isupper()
字串編碼
str.encode(encoding="utf-8", errors="strict")
大小寫轉換
str.capitalize()
將首字母轉換成大寫,需要注意的是如果首字沒有大寫形式,則返回原字串。
1 'adi dog'.capitalize() 2 # 'Adi dog' 3 4 'abcd 徐'.capitalize() 5 # 'Abcd 徐' 6 7 '徐 abcd'.capitalize() 8 # '徐 abcd' 9 10 'ß'.capitalize() 11 # 'SS'
str.lower()
將字串轉換成小寫,其僅對 ASCII
編碼的字母有效。
1 'DOBI'.lower() 2 # 'dobi' 3 4 'ß'.lower() # 'ß' 為德語小寫字母,其有另一種小寫 'ss', lower 方法無法轉換 5 # 'ß' 6 7 '徐 ABCD'.lower() 8 # '徐 abcd'
str.casefold()
將字串轉換成小寫,Unicode 編碼中凡是有對應的小寫形式的,都會轉換。
1 'DOBI'.casefold() 2 # 'dobi' 3 4 'ß'.casefold() #德語中小寫字母 ß 等同於小寫字母 ss, 其大寫為 SS 5 # 'ss'
str.swapcase()
對字串字母的大小寫進行反轉。
1 '徐Dobi a123 ß'.swapcase() 2 #: '徐dOBI A123 SS' 這裡的 ß 被轉成 SS 是一種大寫
但需要注意的是 s.swapcase().swapcase() == s
不一定為真:
1 u'\xb5' 2 # 'µ' 3 4 u'\xb5'.swapcase() 5 # 'Μ' 6 7 u'\xb5'.swapcase().swapcase() 8 # 'μ' 9 10 hex(ord(u'\xb5'.swapcase().swapcase())) 11 Out[154]: '0x3bc'
這裡 'Μ'
(是 mu 不是 M) 的小寫正好與 'μ'
的寫法一致。
1 str.title() 2 將字串中每個“單詞”首字母大寫。其判斷“單詞”的依據則是基於空格和標點,所以應對英文撇好所有格或一些英文大寫的簡寫時,會出錯。
1 'Hello world'.title() 2 # 'Hello World' 3 4 '中文abc def 12gh'.title() 5 # '中文Abc Def 12Gh' 6 7 # 但這個方法並不完美: 8 "they're bill's friends from the UK".title() 9 # "They'Re Bill'S Friends From The Uk"
str.upper()
將字串所有字母變為大寫,會自動忽略不可轉成大寫的字元。
1 '中文abc def 12gh'.upper() 2 # '中文ABC DEF 12GH'
需要注意的是 s.upper().isupper()
不一定為 True
。
字串格式輸出
str.center(width[, fillchar])
將字串按照給定的寬度居中顯示,可以給定特定的字元填充多餘的長度,如果指定的長度小於字串長度,則返回原字串。
1 '12345'.center(10, '*') 2 # '**12345***' 3 4 '12345'.center(10) 5 # ' 12345 '
str.ljust(width[, fillchar]); str.rjust(width[, fillchar])
返回指定長度的字串,字串內容居左(右)如果長度小於字串長度,則返回原始字串,預設填充為 ASCII 空格,可指定填充的字串。
1 'dobi'.ljust(10) 2 # 'dobi ' 3 4 'dobi'.ljust(10, '~') 5 # 'dobi~~~~~~' 6 7 'dobi'.ljust(3, '~') 8 # 'dobi' 9 10 'dobi'.ljust(3) 11 # 'dobi'
str.zfill(width)
用 '0' 填充字串,並返回指定寬度的字串。
1 "42".zfill(5) 2 # '00042' 3 "-42".zfill(5) 4 # '-0042' 5 6 'dd'.zfill(5) 7 # '000dd' 8 9 '--'.zfill(5) 10 # '-000-' 11 12 ' '.zfill(5) 13 # '0000 ' 14 15 ''.zfill(5) 16 # '00000' 17 18 'dddddddd'.zfill(5) 19 # 'dddddddd'
str.expandtabs(tabsize=8)
用指定的空格替代橫向製表符,使得相鄰字串之間的間距保持在指定的空格數以內。
1 tab = '1\t23\t456\t7890\t1112131415\t161718192021' 2 3 tab.expandtabs() 4 # '1 23 456 7890 1112131415 161718192021' 5 # '123456781234567812345678123456781234567812345678' 注意空格的計數與上面輸出位置的關係 6 7 tab.expandtabs(4) 8 # '1 23 456 7890 1112131415 161718192021' 9 # '12341234123412341234123412341234'
str.format(^args, ^^kwargs)
格式化字串的語法比較繁多,官方文件已經有比較詳細的 examples,這裡就不寫例子了。
str.format_map(mapping)
類似 str.format(*args, **kwargs)
,不同的是 mapping
是一個字典物件。
1 People = {'name':'john', 'age':56} 2 3 'My name is {name},i am {age} old'.format_map(People) 4 # 'My name is john,i am 56 old'
字串搜尋定位與替換
str.count(sub[, start[, end]])
1 text = 'outer protective covering' 2 3 text.count('e') 4 # 4 5 6 text.count('e', 5, 11) 7 # 1 8 9 text.count('e', 5, 10) 10 # 0
str.find(sub[, start[, end]]); str.rfind(sub[, start[, end]])
1 text = 'outer protective covering' 2 3 text.find('er') 4 # 3 5 6 text.find('to') 7 # -1 8 9 text.find('er', 3) 10 Out[121]: 3 11 12 text.find('er', 4) 13 Out[122]: 20 14 15 text.find('er', 4, 21) 16 Out[123]: -1 17 18 text.find('er', 4, 22) 19 Out[124]: 20 20 21 text.rfind('er') 22 Out[125]: 20 23 24 text.rfind('er', 20) 25 Out[126]: 20 26 27 text.rfind('er', 20, 21) 28 Out[129]: -1
str.index(sub[, start[, end]]); str.rindex(sub[, start[, end]])
與 find()
rfind()
類似,不同的是如果找不到,就會引發 ValueError
。
str.replace(old, new[, count])
1 'dog wow wow jiao'.replace('wow', 'wang') 2 # 'dog wang wang jiao' 3 4 'dog wow wow jiao'.replace('wow', 'wang', 1) 5 # 'dog wang wow jiao' 6 7 'dog wow wow jiao'.replace('wow', 'wang', 0) 8 # 'dog wow wow jiao' 9 10 'dog wow wow jiao'.replace('wow', 'wang', 2) 11 # 'dog wang wang jiao' 12 13 'dog wow wow jiao'.replace('wow', 'wang', 3) 14 # 'dog wang wang jiao'
str.lstrip([chars]); str.rstrip([chars]); str.strip([chars])
1 ' dobi'.lstrip() 2 # 'dobi' 3 'db.kun.ac.cn'.lstrip('dbk') 4 # '.kun.ac.cn' 5 6 ' dobi '.rstrip() 7 # ' dobi' 8 'db.kun.ac.cn'.rstrip('acn') 9 # 'db.kun.ac.' 10 11 ' dobi '.strip() 12 # 'dobi' 13 'db.kun.ac.cn'.strip('db.c') 14 # 'kun.ac.cn' 15 'db.kun.ac.cn'.strip('cbd.un') 16 # 'kun.a'
static str.maketrans(x[, y[, z]]); str.translate(table)
maktrans
是一個靜態方法,用於生成一個對照表,以供 translate
使用。
如果 maktrans
僅一個引數,則該引數必須是一個字典,字典的 key 要麼是一個 Unicode 編碼(一個整數),要麼是一個長度為 1 的字串,字典的 value 則可以是任意字串、None
或者 Unicode 編碼。
1 a = 'dobi' 2 ord('o') 3 # 111 4 5 ord('a') 6 # 97 7 8 hex(ord('狗')) 9 # '0x72d7' 10 11 b = {'d':'dobi', 111:' is ', 'b':97, 'i':'\u72d7\u72d7'} 12 table = str.maketrans(b) 13 14 a.translate(table) 15 # 'dobi is a狗狗'
如果 maktrans
有兩個引數,則兩個引數形成對映,且兩個字串必須是長度相等;如果有第三個引數,則第三個引數也必須是字串,該字串將自動對映到 None
:
1 a = 'dobi is a dog' 2 3 table = str.maketrans('dobi', 'alph') 4 5 a.translate(table) 6 # 'alph hs a alg' 7 8 table = str.maketrans('dobi', 'alph', 'o') 9 10 a.translate(table) 11 # 'aph hs a ag'
字串的聯合與分割
str.join(iterable)
用指定的字串,連線元素為字串的可迭代物件。
1 '-'.join(['2012', '3', '12']) 2 # '2012-3-12' 3 4 '-'.join([2012, 3, 12]) 5 # TypeError: sequence item 0: expected str instance, int found 6 7 '-'.join(['2012', '3', b'12']) #bytes 為非字串 8 # TypeError: sequence item 2: expected str instance, bytes found 9 10 '-'.join(['2012']) 11 # '2012' 12 13 '-'.join([]) 14 # '' 15 16 '-'.join([None]) 17 # TypeError: sequence item 0: expected str instance, NoneType found 18 19 '-'.join(['']) 20 # '' 21 22 ','.join({'dobi':'dog', 'polly':'bird'}) 23 # 'dobi,polly' 24 25 ','.join({'dobi':'dog', 'polly':'bird'}.values()) 26 # 'dog,bird'
str.partition(sep); str.rpartition(sep)
1 'dog wow wow jiao'.partition('wow') 2 # ('dog ', 'wow', ' wow jiao') 3 4 'dog wow wow jiao'.partition('dog') 5 # ('', 'dog', ' wow wow jiao') 6 7 'dog wow wow jiao'.partition('jiao') 8 # ('dog wow wow ', 'jiao', '') 9 10 'dog wow wow jiao'.partition('ww') 11 # ('dog wow wow jiao', '', '') 12 13 14 15 'dog wow wow jiao'.rpartition('wow') 16 Out[131]: ('dog wow ', 'wow', ' jiao') 17 18 'dog wow wow jiao'.rpartition('dog') 19 Out[132]: ('', 'dog', ' wow wow jiao') 20 21 'dog wow wow jiao'.rpartition('jiao') 22 Out[133]: ('dog wow wow ', 'jiao', '') 23 24 'dog wow wow jiao'.rpartition('ww') 25 Out[135]: ('', '', 'dog wow wow jiao')
str.partition(sep); str.rpartition(sep)
1 'dog wow wow jiao'.partition('wow') 2 # ('dog ', 'wow', ' wow jiao') 3 4 'dog wow wow jiao'.partition('dog') 5 # ('', 'dog', ' wow wow jiao') 6 7 'dog wow wow jiao'.partition('jiao') 8 # ('dog wow wow ', 'jiao', '') 9 10 'dog wow wow jiao'.partition('ww') 11 # ('dog wow wow jiao', '', '') 12 13 14 15 'dog wow wow jiao'.rpartition('wow') 16 Out[131]: ('dog wow ', 'wow', ' jiao') 17 18 'dog wow wow jiao'.rpartition('dog') 19 Out[132]: ('', 'dog', ' wow wow jiao') 20 21 'dog wow wow jiao'.rpartition('jiao') 22 Out[133]: ('dog wow wow ', 'jiao', '') 23 24 'dog wow wow jiao'.rpartition('ww') 25 Out[135]: ('', '', 'dog wow wow jiao')
str.split(sep=None, maxsplit=-1); str.rsplit(sep=None, maxsplit=-1)
1 '1,2,3'.split(','), '1, 2, 3'.rsplit() 2 # (['1', '2', '3'], ['1,', '2,', '3']) 3 4 '1,2,3'.split(',', maxsplit=1), '1,2,3'.rsplit(',', maxsplit=1) 5 # (['1', '2,3'], ['1,2', '3']) 6 7 '1 2 3'.split(), '1 2 3'.rsplit() 8 # (['1', '2', '3'], ['1', '2', '3']) 9 10 '1 2 3'.split(maxsplit=1), '1 2 3'.rsplit(maxsplit=1) 11 # (['1', '2 3'], ['1 2', '3']) 12 13 ' 1 2 3 '.split() 14 # ['1', '2', '3'] 15 16 '1,2,,3,'.split(','), '1,2,,3,'.rsplit(',') 17 # (['1', '2', '', '3', ''], ['1', '2', '', '3', '']) 18 19 ''.split() 20 # [] 21 ''.split('a') 22 # [''] 23 'bcd'.split('a') 24 # ['bcd'] 25 'bcd'.split(None) 26 # ['bcd']
str.splitlines([keepends])
字串以行界符為分隔符拆分為列表;當 keepends
為True
,拆分後保留行界符。
1 'ab c\n\nde fg\rkl\r\n'.splitlines() 2 # ['ab c', '', 'de fg', 'kl'] 3 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) 4 # ['ab c\n', '\n', 'de fg\r', 'kl\r\n'] 5 6 "".splitlines(), ''.split('\n') #注意兩者的區別 7 # ([], ['']) 8 "One line\n".splitlines() 9 # (['One line'], ['Two lines', ''])
字串條件判斷
str.endswith(suffix[, start[, end]]); str.startswith(prefix[, start[, end]])
1 text = 'outer protective covering' 2 3 text.endswith('ing') 4 # True 5 6 text.endswith(('gin', 'ing')) 7 # True 8 text.endswith('ter', 2, 5) 9 # True 10 11 text.endswith('ter', 2, 4) 12 # False
str.isalnum()
字串和數字的任意組合,即為真,簡而言之:
只要 c.isalpha()
, c.isdecimal()
, c.isdigit()
, c.isnumeric()
中任意一個為真,則 c.isalnum()
為真。
1 'dobi'.isalnum() 2 # True 3 4 'dobi123'.isalnum() 5 # True 6 7 '123'.isalnum() 8 # True 9 10 '徐'.isalnum() 11 # True 12 13 'dobi_123'.isalnum() 14 # False 15 16 'dobi 123'.isalnum() 17 # False 18 19 '%'.isalnum() 20 # False
str.isalpha()
Unicode 字元資料庫中作為 “Letter”(這些字元一般具有 “Lm”, “Lt”, “Lu”, “Ll”, or “Lo” 等標識,不同於 Alphabetic) 的,均為真。
1 'dobi'.isalpha() 2 # True 3 4 'do bi'.isalpha() 5 # False 6 7 'dobi123'.isalpha() 8 # False 9 10 '徐'.isalpha() 11 # True
str.isdecimal(); str.isdigit(); str.isnumeric()
三個方法的區別在於對 Unicode 通用標識的真值判斷範圍不同:
isdecimal
: Nd,isdigit
: No, Nd,isnumeric
: No, Nd, Nl
digit
與 decimal
的區別在於有些數值字串,是 digit
卻非 decimal
。
1 num = '\u2155' 2 print(num) 3 # ⅕ 4 num.isdecimal(), num.isdigit(), num.isnumeric() 5 # (False, False, True) 6 7 num = '\u00B2' 8 print(num) 9 # ² 10 num.isdecimal(), num.isdigit(), num.isnumeric() 11 # (False, True, True) 12 13 num = "1" #unicode 14 num.isdecimal(), num.isdigit(), num.isnumeric() 15 # (Ture, True, True) 16 17 num = "'Ⅶ'" 18 num.isdecimal(), num.isdigit(), num.isnumeric() 19 # (False, False, True) 20 21 num = "十" 22 num.isdecimal(), num.isdigit(), num.isnumeric() 23 # (False, False, True) 24 25 num = b"1" # byte 26 num.isdigit() # True 27 num.isdecimal() # AttributeError 'bytes' object has no attribute 'isdecimal' 28 num.isnumeric() # AttributeError 'bytes' object has no attribute 'isnumeric'
str.isidentifier()
判斷字串是否可為合法的識別符號。
1 'def'.isidentifier() 2 # True 3 4 'with'.isidentifier() 5 # True 6 7 'false'.isidentifier() 8 # True 9 10 'dobi_123'.isidentifier() 11 # True 12 13 'dobi 123'.isidentifier() 14 # False 15 16 '123'.isidentifier() 17 # False
str.isidentifier()
判斷字串是否可為合法的識別符號。
1 'def'.isidentifier() 2 # True 3 4 'with'.isidentifier() 5 # True 6 7 'false'.isidentifier() 8 # True 9 10 'dobi_123'.isidentifier() 11 # True 12 13 'dobi 123'.isidentifier() 14 # False 15 16 '123'.isidentifier() 17 # False
str.islower()
1 '徐'.islower() 2 # False 3 4 'ß'.islower() #德語大寫字母 5 # False 6 7 'a徐'.islower() 8 # True 9 10 'ss'.islower() 11 # True 12 13 '23'.islower() 14 # False 15 16 'Ab'.islower() 17 # False
str.isprintable()
判斷字串的所有字元都是可列印字元或字串為空。Unicode 字符集中 “Other” “Separator” 類別的字元為不可列印的字元(但不包括 ASCII 的空格(0x20))。
1 'dobi123'.isprintable() 2 # True 3 4 'dobi123\n'.isprintable() 5 Out[24]: False 6 7 'dobi 123'.isprintable() 8 # True 9 10 'dobi.123'.isprintable() 11 # True 12 13 ''.isprintable() 14 # True
str.isspace()
判斷字串中是否至少有一個字元,並且所有字元都是空白字元。
1 In [29]: '\r\n\t'.isspace() 2 Out[29]: True 3 4 In [30]: ''.isspace() 5 Out[30]: False 6 7 In [31]: ' '.isspace() 8 Out[31]: True
str.istitle()
判斷字串中的字元是否是首字母大寫,其會忽視非字母字元。
1 'How Python Works'.istitle() 2 # True 3 4 'How Python WORKS'.istitle() 5 # False 6 7 'how python works'.istitle() 8 # False 9 10 'How Python Works'.istitle() 11 # True 12 13 ' '.istitle() 14 # False 15 16 ''.istitle() 17 # False 18 19 'A'.istitle() 20 # True 21 22 'a'.istitle() 23 # False 24 25 '甩甩Abc Def 123'.istitle() 26 # True
str.isupper()
1 '徐'.isupper() 2 # False 3 4 'DOBI'.isupper() 5 Out[41]: True 6 7 'Dobi'.isupper() 8 # False 9 10 'DOBI123'.isupper() 11 # True 12 13 'DOBI 123'.isupper() 14 # True 15 16 'DOBI\t 123'.isupper() 17 # True 18 19 'DOBI_123'.isupper() 20 # True 21 22 '_123'.isupper() 23 # False
字串編碼
str.encode(encoding="utf-8", errors="strict")
1 fname = '徐' 2 3 fname.encode('ascii') 4 # UnicodeEncodeError: 'ascii' codec can't encode character '\u5f90'... 5 6 fname.encode('ascii', 'replace') 7 # b'?' 8 9 fname.encode('ascii', 'ignore') 10 # b'' 11 12 fname.encode('ascii', 'xmlcharrefreplace') 13 # b'徐' 14 15 fname.encode('ascii', 'backslashreplace') 16 # b'\\u5f90'
本文轉自:https://segmentfault.com/a/1190000004598007?_ea=663877#articleHeader0