Python的內建字串方法分析

高洛峰
發布: 2017-03-07 15:48:23
原創
1501 人瀏覽過

本文主要介紹了下Python的一些內建字串的方法,包括概覽,字串大小寫轉換,字串格式輸出,字串搜尋定位與替換,字串的聯合與分割,字串條件判斷,字串編碼

字串處理是非常常用的技能,但Python 內建字串方法太多,常常遺忘,為了方便快速參考,特地依據Python 3.5.1 給每個內建方法寫了範例並進行了歸類,便於大家索引。

PS: 可以點選概覽內的綠色標題進入對應分類或透過右側邊欄文章目錄快速索引對應方法。

大小寫轉換

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)

# '00000'

'dddddddd'.zfill(5)
# ''dddddddd str.expandtabs(tabsize=8)

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

tab = '1\t23\t456\t7890\t1112131415\t161718192021'###

tab.expandtabs()
# '1       23      456     7890    1112131415    345678123456781234567812345678'  注意空格的計數與上方輸出位置的關係

tab.expandtabs(4)

# '1   23  456 7890    1112131415  161718192021'
# '123412341234123412341234123412342##ad格式化字串的語法比較繁多,官方文件已經有比較詳細的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: 序列項目0: 預期的str 實例,找不到NoneType

'-'.join([''])

# ''

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

# 'dobi,polly'

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

# 'dog,bird'
str.partition(sep); str.rpartition(sep)
'狗哇哇嬌'.partition('哇')
# ('狗', '哇', '哇嬌')

'狗哇哇jiao' .partition('狗')

# ('', '狗', '哇哇嬌')

#'狗哇哇嬌'.partition('jiao')

# ('狗哇哇', 'jiao', '')

'狗哇哇嬌'.partition('ww')

# ('狗哇哇嬌', '', '' )


##'狗哇哇嬌'.rpartition('哇')

Out[131]: ('狗哇', '哇', 'jiao' )


'狗哇哇嬌'.rpartition('狗')

Out[132]: ('', '狗', '哇哇嬌')


'狗哇哇嬌'.rpartition('jiao')

Out[133]: ('狗哇哇', 'jiao', '')


'狗哇哇嬌'.rpartition('ww ')

Out[135]: ('', '', '狗哇哇嬌')

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])


#字串以行界符分割成清單;當keepends為True ,分割後保留行界符,能被辨識的行界符見官方文件。 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')      #注意兩者的區別
# ([], [''])
"一行\n".splitlines()
# (['一行'], ['兩行', ''])



字串條件判斷

str.endswith(suffix[, start[, end]]); str.startswith(prefix[, start[, end]])text = '外保護層'
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()為真。 ( )
# 真

'徐'.isalnum()

# 真

'dobi_123'.isalnum()

# False

' dobi 123'.isalnum()

# False

'%'.isalnum()

# False
str.isalpha()

Unicode字元資料庫中作為「字母」(這些字元一般帶有「Lm」、「Lt」、「Lu」、「Ll」或「Lo」等標識,而非字母)的,其為真。

# True

'do bi'.isalpha()

# False

'dobi123'.isalpha()

# False

'徐' .isalpha()

# 真
str.isdecimal(); str.isdigit(); str.isnumeric()
三個方法的差異在於針對 Unicode 通用標識的真值判斷範圍不同:

isdecimal: Nd,

isdigit: No, Nd,
isnumeric: No 、Nd、Nl

digit 與decimal 的差別在於有些數值字串,是digit 卻非decimal ,具體戳這裡

num = '\u2155'
print(num)
# ⅕
num.isdecimal(), num.isdigit(), num.isnumeric()
# (False, False, True)

num = '\u00B2'
print(num)
# ²
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, 真)

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

# 真


'with'.isidentifier()

# 真


'false'.isidentifier ()

# 真


'dobi_123'.isidentifier()

# 真


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

# 真

##' '.istitle()
# False

''.istitle()
# False

'A'.istitle()
# True

'a'.istitle()
# False

'甩甩Abc Def 123'.istitle()
# 真

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的內建字串方法分析相關文章請關注PHP中文網! ###
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板