1. 程式人生 > >Python 的內置字符串方法(收藏專用)

Python 的內置字符串方法(收藏專用)

python3.x ins partition poll math 索引 org docs 依據

Python 的內置字符串方法(收藏專用)
  • method
  • 字符串
  • string
  • python3.x
  • 技術分享圖片 python
4.7k 次閱讀 · 讀完需要 44 分鐘 5

字符串處理是非常常用的技能,但 Python 內置字符串方法太多,常常遺忘,為了便於快速參考,特地依據 Python 3.5.1 給每個內置方法寫了示例並進行了歸類,便於大家索引。
PS: 可以點擊概覽內的綠色標題進入相應分類或者通過右側邊欄文章目錄快速索引相應方法。

概覽

字符串大小寫轉換

  • 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()

將首字母轉換成大寫,需要註意的是如果首字沒有大寫形式,則返回原字符串。

‘adi dog‘.capitalize()
# ‘Adi dog‘

‘abcd 徐‘.capitalize()
# ‘Abcd 徐‘

‘徐 abcd‘.capitalize()
# ‘徐 abcd‘

‘?‘.capitalize()
# ‘SS‘

str.lower()

將字符串轉換成小寫,其僅對 ASCII 編碼的字母有效。

‘DOBI‘.lower()
# ‘dobi‘

‘?‘.lower()   # ‘?‘ 為德語小寫字母,其有另一種小寫 ‘ss‘, lower 方法無法轉換
# ‘?‘

‘徐 ABCD‘.lower()
# ‘徐 abcd‘

str.casefold()

將字符串轉換成小寫,Unicode 編碼中凡是有對應的小寫形式的,都會轉換。

‘DOBI‘.casefold()
# ‘dobi‘

‘?‘.casefold()   #德語中小寫字母 ? 等同於小寫字母 ss, 其大寫為 SS 
# ‘ss‘

str.swapcase()

對字符串字母的大小寫進行反轉。

‘徐Dobi a123 ?‘.swapcase()
#: ‘徐dOBI A123 SS‘    這裏的 ? 被轉成 SS 是一種大寫

但需要註意的是 s.swapcase().swapcase() == s 不一定為真:

u‘\xb5‘
# ‘μ‘

u‘\xb5‘.swapcase()
# ‘Μ‘

u‘\xb5‘.swapcase().swapcase()
# ‘μ‘

hex(ord(u‘\xb5‘.swapcase().swapcase()))
Out[154]: ‘0x3bc‘

這裏 ‘Μ‘(是 mu 不是 M) 的小寫正好與 ‘μ‘ 的寫法一致。

str.title()

將字符串中每個“單詞”首字母大寫。其判斷“單詞”的依據則是基於空格和標點,所以應對英文撇好所有格或一些英文大寫的簡寫時,會出錯。

‘Hello world‘.title()
# ‘Hello World‘

‘中文abc def 12gh‘.title()
# ‘中文Abc Def 12Gh‘

# 但這個方法並不完美:
"they‘re bill‘s friends from the UK".title()
# "They‘Re Bill‘S Friends From The Uk"

str.upper()

將字符串所有字母變為大寫,會自動忽略不可轉成大寫的字符。

‘中文abc def 12gh‘.upper()
# ‘中文ABC DEF 12GH‘

需要註意的是 s.upper().isupper() 不一定為 True

字符串格式輸出

str.center(width[, fillchar])

將字符串按照給定的寬度居中顯示,可以給定特定的字符填充多余的長度,如果指定的長度小於字符串長度,則返回原字符串。

‘12345‘.center(10, ‘*‘)
# ‘**12345***‘

‘12345‘.center(10)
# ‘  12345   ‘

str.ljust(width[, fillchar]); str.rjust(width[, fillchar])

返回指定長度的字符串,字符串內容居左(右)如果長度小於字符串長度,則返回原始字符串,默認填充為 ASCII 空格,可指定填充的字符串。

‘dobi‘.ljust(10)
# ‘dobi      ‘

‘dobi‘.ljust(10, ‘~‘)
# ‘dobi~~~~~~‘

‘dobi‘.ljust(3, ‘~‘)
# ‘dobi‘

‘dobi‘.ljust(3)
# ‘dobi‘

str.zfill(width)

用 ‘0‘ 填充字符串,並返回指定寬度的字符串。

"42".zfill(5)
# ‘00042‘
"-42".zfill(5)
# ‘-0042‘

‘dd‘.zfill(5)
# ‘000dd‘

‘--‘.zfill(5)
# ‘-000-‘

‘ ‘.zfill(5)
# ‘0000 ‘

‘‘.zfill(5)
# ‘00000‘

‘dddddddd‘.zfill(5)
# ‘dddddddd‘

str.expandtabs(tabsize=8)

用指定的空格替代橫向制表符,使得相鄰字符串之間的間距保持在指定的空格數以內。

tab = ‘1\t23\t456\t7890\t1112131415\t161718192021‘

tab.expandtabs()
# ‘1       23      456     7890    1112131415      161718192021‘
# ‘123456781234567812345678123456781234567812345678‘  註意空格的計數與上面輸出位置的關系

tab.expandtabs(4)
# ‘1   23  456 7890    1112131415  161718192021‘
# ‘12341234123412341234123412341234‘  

str.format(^args, ^^kwargs)

格式化字符串的語法比較繁多,官方文檔已經有比較詳細的 examples,這裏就不寫例子了,想了解的童鞋可以直接戳這裏 Format examples.

str.format_map(mapping)

類似 str.format(*args, **kwargs) ,不同的是 mapping 是一個字典對象。

People = {‘name‘:‘john‘, ‘age‘:56}

‘My name is {name},i am {age} old‘.format_map(People)
# ‘My name is john,i am 56 old‘

字符串搜索定位與替換

str.count(sub[, start[, end]])

text = ‘outer protective covering‘

text.count(‘e‘)
# 4

text.count(‘e‘, 5, 11)
# 1

text.count(‘e‘, 5, 10)
# 0

str.find(sub[, start[, end]]); str.rfind(sub[, start[, end]])

text = ‘outer protective covering‘

text.find(‘er‘)
# 3

text.find(‘to‘)
# -1

text.find(‘er‘, 3)
Out[121]: 3

text.find(‘er‘, 4)
Out[122]: 20

text.find(‘er‘, 4, 21)
Out[123]: -1

text.find(‘er‘, 4, 22)
Out[124]: 20

text.rfind(‘er‘)
Out[125]: 20

text.rfind(‘er‘, 20)
Out[126]: 20

text.rfind(‘er‘, 20, 21)
Out[129]: -1

str.index(sub[, start[, end]]); str.rindex(sub[, start[, end]])

find() rfind() 類似,不同的是如果找不到,就會引發 ValueError

str.replace(old, new[, count])

‘dog wow wow jiao‘.replace(‘wow‘, ‘wang‘)
# ‘dog wang wang jiao‘

‘dog wow wow jiao‘.replace(‘wow‘, ‘wang‘, 1)
# ‘dog wang wow jiao‘

‘dog wow wow jiao‘.replace(‘wow‘, ‘wang‘, 0)
# ‘dog wow wow jiao‘

‘dog wow wow jiao‘.replace(‘wow‘, ‘wang‘, 2)
# ‘dog wang wang jiao‘

‘dog wow wow jiao‘.replace(‘wow‘, ‘wang‘, 3)
# ‘dog wang wang jiao‘

str.lstrip([chars]); str.rstrip([chars]); str.strip([chars])

‘  dobi‘.lstrip()
# ‘dobi‘
‘db.kun.ac.cn‘.lstrip(‘dbk‘)
# ‘.kun.ac.cn‘

‘ dobi   ‘.rstrip()
# ‘ dobi‘
‘db.kun.ac.cn‘.rstrip(‘acn‘)
# ‘db.kun.ac.‘

‘   dobi   ‘.strip()
# ‘dobi‘
‘db.kun.ac.cn‘.strip(‘db.c‘)
# ‘kun.ac.cn‘
‘db.kun.ac.cn‘.strip(‘cbd.un‘)
# ‘kun.a‘

static str.maketrans(x[, y[, z]]); str.translate(table)

maktrans 是一個靜態方法,用於生成一個對照表,以供 translate 使用。
如果 maktrans 僅一個參數,則該參數必須是一個字典,字典的 key 要麽是一個 Unicode 編碼(一個整數),要麽是一個長度為 1 的字符串,字典的 value 則可以是任意字符串、None或者 Unicode 編碼。

a = ‘dobi‘
ord(‘o‘)
# 111

ord(‘a‘)
# 97

hex(ord(‘狗‘))
# ‘0x72d7‘

b = {‘d‘:‘dobi‘, 111:‘ is ‘, ‘b‘:97, ‘i‘:‘\u72d7\u72d7‘}
table = str.maketrans(b)

a.translate(table)
# ‘dobi is a狗狗‘

如果 maktrans 有兩個參數,則兩個參數形成映射,且兩個字符串必須是長度相等;如果有第三個參數,則第三個參數也必須是字符串,該字符串將自動映射到 None

a = ‘dobi is a dog‘

table = str.maketrans(‘dobi‘, ‘alph‘)

a.translate(table)
# ‘alph hs a alg‘

table = str.maketrans(‘dobi‘, ‘alph‘, ‘o‘)

a.translate(table)
# ‘aph hs a ag‘

字符串的聯合與分割

str.join(iterable)

用指定的字符串,連接元素為字符串的可叠代對象。

‘-‘.join([‘2012‘, ‘3‘, ‘12‘])
# ‘2012-3-12‘

‘-‘.join([2012, 3, 12])
# TypeError: sequence item 0: expected str instance, int found

‘-‘.join([‘2012‘, ‘3‘, b‘12‘])  #bytes 為非字符串
# TypeError: sequence item 2: expected str instance, bytes found

‘-‘.join([‘2012‘])
# ‘2012‘

‘-‘.join([])
# ‘‘

‘-‘.join([None])
# TypeError: sequence item 0: expected str instance, NoneType found

‘-‘.join([‘‘])
# ‘‘

‘,‘.join({‘dobi‘:‘dog‘, ‘polly‘:‘bird‘})
# ‘dobi,polly‘

‘,‘.join({‘dobi‘:‘dog‘, ‘polly‘:‘bird‘}.values())
# ‘dog,bird‘

str.partition(sep); str.rpartition(sep)

‘dog wow wow jiao‘.partition(‘wow‘)
# (‘dog ‘, ‘wow‘, ‘ wow jiao‘)

‘dog wow wow jiao‘.partition(‘dog‘)
# (‘‘, ‘dog‘, ‘ wow wow jiao‘)

‘dog wow wow jiao‘.partition(‘jiao‘)
# (‘dog wow wow ‘, ‘jiao‘, ‘‘)

‘dog wow wow jiao‘.partition(‘ww‘)
# (‘dog wow wow jiao‘, ‘‘, ‘‘)



‘dog wow wow jiao‘.rpartition(‘wow‘)
Out[131]: (‘dog wow ‘, ‘wow‘, ‘ jiao‘)

‘dog wow wow jiao‘.rpartition(‘dog‘)
Out[132]: (‘‘, ‘dog‘, ‘ wow wow jiao‘)

‘dog wow wow jiao‘.rpartition(‘jiao‘)
Out[133]: (‘dog wow wow ‘, ‘jiao‘, ‘‘)

‘dog wow wow jiao‘.rpartition(‘ww‘)
Out[135]: (‘‘, ‘‘, ‘dog wow wow jiao‘)

str.split(sep=None, maxsplit=-1); str.rsplit(sep=None, maxsplit=-1)

‘1,2,3‘.split(‘,‘), ‘1, 2, 3‘.rsplit()
# ([‘1‘, ‘2‘, ‘3‘], [‘1,‘, ‘2,‘, ‘3‘])

‘1,2,3‘.split(‘,‘, maxsplit=1),  ‘1,2,3‘.rsplit(‘,‘, maxsplit=1)
# ([‘1‘, ‘2,3‘], [‘1,2‘, ‘3‘])

‘1 2 3‘.split(), ‘1 2 3‘.rsplit()
# ([‘1‘, ‘2‘, ‘3‘], [‘1‘, ‘2‘, ‘3‘])

‘1 2 3‘.split(maxsplit=1), ‘1 2 3‘.rsplit(maxsplit=1)
# ([‘1‘, ‘2 3‘], [‘1 2‘, ‘3‘])

‘   1   2   3   ‘.split()
# [‘1‘, ‘2‘, ‘3‘]

‘1,2,,3,‘.split(‘,‘), ‘1,2,,3,‘.rsplit(‘,‘)
# ([‘1‘, ‘2‘, ‘‘, ‘3‘, ‘‘], [‘1‘, ‘2‘, ‘‘, ‘3‘, ‘‘])

‘‘.split()
# []
‘‘.split(‘a‘)
# [‘‘]
‘bcd‘.split(‘a‘)
# [‘bcd‘]
‘bcd‘.split(None)
# [‘bcd‘]

str.splitlines([keepends])

字符串以行界符為分隔符拆分為列表;當 keependsTrue,拆分後保留行界符,能被識別的行界符見官方文檔。

‘ab c\n\nde fg\rkl\r\n‘.splitlines()
# [‘ab c‘, ‘‘, ‘de fg‘, ‘kl‘]
‘ab c\n\nde fg\rkl\r\n‘.splitlines(keepends=True)
# [‘ab c\n‘, ‘\n‘, ‘de fg\r‘, ‘kl\r\n‘]

"".splitlines(), ‘‘.split(‘\n‘)      #註意兩者的區別
# ([], [‘‘])
"One line\n".splitlines()
# ([‘One line‘], [‘Two lines‘, ‘‘])

字符串條件判斷

str.endswith(suffix[, start[, end]]); str.startswith(prefix[, start[, end]])

text = ‘outer protective covering‘

text.endswith(‘ing‘)
# True

text.endswith((‘gin‘, ‘ing‘))
# True
text.endswith(‘ter‘, 2, 5)
# True

text.endswith(‘ter‘, 2, 4)
# False

str.isalnum()

字符串和數字的任意組合,即為真,簡而言之:

只要 c.isalpha(), c.isdecimal(), c.isdigit(), c.isnumeric() 中任意一個為真,則 c.isalnum() 為真。

‘dobi‘.isalnum()
# True

‘dobi123‘.isalnum()
# True

‘123‘.isalnum()
# True

‘徐‘.isalnum()
# True

‘dobi_123‘.isalnum()
# False

‘dobi 123‘.isalnum()
# False

‘%‘.isalnum()
# False

str.isalpha()

Unicode 字符數據庫中作為 “Letter”(這些字符一般具有 “Lm”, “Lt”, “Lu”, “Ll”, or “Lo” 等標識,不同於 Alphabetic) 的,均為真。

‘dobi‘.isalpha()
# True

‘do bi‘.isalpha()
# False

‘dobi123‘.isalpha()
# False

‘徐‘.isalpha()
# True

str.isdecimal(); str.isdigit(); str.isnumeric()

三個方法的區別在於對 Unicode 通用標識的真值判斷範圍不同:

isdecimal: Nd,
isdigit: No, Nd,
isnumeric: No, Nd, Nl

digitdecimal 的區別在於有些數值字符串,是 digit 卻非 decimal ,具體戳 這裏

num = ‘\u2155‘
print(num)
# ?
num.isdecimal(), num.isdigit(), num.isnumeric()
# (False, False, True)

num = ‘\u00B2‘
print(num)
# 2
num.isdecimal(), num.isdigit(), num.isnumeric()
# (False, True, True)

num = "1"  #unicode
num.isdecimal(), num.isdigit(), num.isnumeric()
# (Ture, True, True)

num = "‘Ⅶ‘" 
num.isdecimal(), num.isdigit(), num.isnumeric()
# (False, False, True)

num = "十"
num.isdecimal(), num.isdigit(), num.isnumeric()
# (False, False, True)

num = b"1" # byte
num.isdigit()   # True
num.isdecimal() # AttributeError ‘bytes‘ object has no attribute ‘isdecimal‘
num.isnumeric() # AttributeError ‘bytes‘ object has no attribute ‘isnumeric‘

str.isidentifier()

判斷字符串是否可為合法的標識符。

‘def‘.isidentifier()
# True

‘with‘.isidentifier()
# True

‘false‘.isidentifier()
# True

‘dobi_123‘.isidentifier()
# True

‘dobi 123‘.isidentifier()
# False

‘123‘.isidentifier()
# False

str.islower()

‘徐‘.islower()
# False

‘?‘.islower()   #德語大寫字母
# False

‘a徐‘.islower()
# True

‘ss‘.islower()
# True

‘23‘.islower()
# False

‘Ab‘.islower()
# False

str.isprintable()

判斷字符串的所有字符都是可打印字符或字符串為空。Unicode 字符集中 “Other” “Separator” 類別的字符為不可打印的字符(但不包括 ASCII 的空格(0x20))。

‘dobi123‘.isprintable()
# True

‘dobi123\n‘.isprintable()
Out[24]: False

‘dobi 123‘.isprintable()
# True

‘dobi.123‘.isprintable()
# True

‘‘.isprintable()
# True

str.isspace()

判斷字符串中是否至少有一個字符,並且所有字符都是空白字符。

In [29]: ‘\r\n\t‘.isspace()
Out[29]: True

In [30]: ‘‘.isspace()
Out[30]: False

In [31]: ‘ ‘.isspace()
Out[31]: True

str.istitle()

判斷字符串中的字符是否是首字母大寫,其會忽視非字母字符。

‘How Python Works‘.istitle()
# True

‘How Python WORKS‘.istitle()
# False

‘how python works‘.istitle()
# False

‘How Python  Works‘.istitle()
# True

‘ ‘.istitle()
# False

‘‘.istitle()
# False

‘A‘.istitle()
# True

‘a‘.istitle()
# False

‘甩甩Abc Def 123‘.istitle()
# True

str.isupper()

‘徐‘.isupper()
# False

‘DOBI‘.isupper()
Out[41]: True

‘Dobi‘.isupper()
# False

‘DOBI123‘.isupper()
# True

‘DOBI 123‘.isupper()
# True

‘DOBI\t 123‘.isupper()
# True

‘DOBI_123‘.isupper()
# True

‘_123‘.isupper()
# False

字符串編碼

str.encode(encoding="utf-8", errors="strict")

fname = ‘徐‘

fname.encode(‘ascii‘)
# UnicodeEncodeError: ‘ascii‘ codec can‘t encode character ‘\u5f90‘...

fname.encode(‘ascii‘, ‘replace‘)
# b‘?‘

fname.encode(‘ascii‘, ‘ignore‘)
# b‘‘

fname.encode(‘ascii‘, ‘xmlcharrefreplace‘)
# b‘徐‘

fname.encode(‘ascii‘, ‘backslashreplace‘)
# b‘\\u5f90‘

參考資料

Python 內置類型字符串方法

Python 的內置字符串方法(收藏專用)