python中字符串的操作方法大全
前言
python中字符串對(duì)象提供了很多方法來操作字符串,功能相當(dāng)豐富。
print(dir(str)) [..........'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
這些方法的使用說明見官方文檔:string methods,本文對(duì)它們進(jìn)行詳細(xì)解釋,各位以后可將本文當(dāng)作手冊(cè)。
這里沒有模式匹配(正則)相關(guān)的功能。python中要使用模式匹配相關(guān)的方法操作字符串,需要import re導(dǎo)入re模塊。關(guān)于正則模式匹配,參見:re Module Contents。
注意,python中字符串是不可變對(duì)象,所以所有修改和生成字符串的操作的實(shí)現(xiàn)方法都是另一個(gè)內(nèi)存片段中新生成一個(gè)字符串對(duì)象。例如,'abc'.upper()將會(huì)在劃分另一個(gè)內(nèi)存片段,并將返回的ABC保存在此內(nèi)存中。
下文出現(xiàn)的"S"表示待操作的字符串。本文沒有對(duì)casefold,encode,format,format_map進(jìn)行介紹,前兩者和unicode有關(guān),后兩者內(nèi)容有點(diǎn)太多。
1.大小寫轉(zhuǎn)換
1.1 lower、upper
S.lower()
S.upper()
返回S字符串的小寫、大寫格式。(注意,這是新生成的字符串,在另一片內(nèi)存片段中,后文將不再解釋這種行為)
例如:
>>> print('ab XY'.lower()) ab xy >>> print('ab XY'.upper()) AB XY
1.2 title、capitalize
S.title()
S.capitalize()
前者返回S字符串中所有單詞首字母大寫且其他字母小寫的格式,后者返回首字母大寫、其他字母全部小寫的新字符串。
例如:
>>> print('ab XY'.title()) Ab Xy >>> print('abc DE'.capitalize()) Abc de
1.3 swapcase
S.swapcase()
swapcase()對(duì)S中的所有字符串做大小寫轉(zhuǎn)換(大寫-->小寫,小寫-->大寫)。
>>> print('abc XYZ'.swapcase()) ABC xyz
2.isXXX判斷
2.1 isalpha,isdecimal,isdigit,isnumeric,isalnum
S.isdecimal()
S.isdigit()
S.isnumeric()
S.isalpha()
S.isalnum()
測(cè)試字符串S是否是數(shù)字、字母、字母或數(shù)字。對(duì)于非Unicode字符串,前3個(gè)方法是等價(jià)的。
例如:
>>> print('34'.isdigit()) True >>> print('abc'.isalpha()) True >>> print('a34'.isalnum()) True
2.2 islower,isupper,istitle
S.islower()
S.isupper()
S.istitle()
判斷是否小寫、大寫、首字母大寫。要求S中至少要包含一個(gè)字符串字符,否則直接返回False。例如不能是純數(shù)字。
注意,istitle()判斷時(shí)會(huì)對(duì)每個(gè)單詞的首字母邊界判斷。例如,word1 Word2、word1_Word2、word1()Word2中都包含兩個(gè)單詞,它們的首字母都是"w"和"W"。因此,如果用istitle()去判斷它們,將返回False,因?yàn)閣是小寫。
例如:
>>> print('a34'.islower()) True >>> print('AB'.isupper()) True >>> print('Aa'.isupper()) False >>> print('Aa Bc'.istitle()) True >>> print('Aa_Bc'.istitle()) True >>> print('Aa bc'.istitle()) False >>> print('Aa_bc'.istitle()) False # 下面的返回False,因?yàn)榉鞘鬃帜窩不是小寫 >>> print('Aa BC'.istitle()) False
2.3 isspace,isprintable,isidentifier
S.isspace()
S.isprintable()
S.isidentifier()
分別判斷字符串是否是空白(空格、制表符、換行符等)字符、是否是可打印字符(例如制表符、換行符就不是可打印字符,但空格是)、是否滿足標(biāo)識(shí)符定義規(guī)則。
例如:
判斷是否為空白。沒有任何字符是不算是空白。
>>> print(' '.isspace()) True >>> print(' \t'.isspace()) True >>> print('\n'.isspace()) True >>> print(''.isspace()) False >>> print('Aa BC'.isspace()) False
判斷是否是可打印字符。
>>> print('\n'.isprintable()) False >>> print('\t'.isprintable()) False >>> print('acd'.isprintable()) True >>> print(' '.isprintable()) True >>> print(''.isprintable()) True
判斷是否滿足標(biāo)識(shí)符定義規(guī)則。
標(biāo)識(shí)符定義規(guī)則為:只能是字母或下劃線開頭、不能包含除數(shù)字、字母和下劃線以外的任意字符。
>>> print('abc'.isidentifier()) True >>> print('2abc'.isidentifier()) False >>> print('abc2'.isidentifier()) True >>> print('_abc2'.isidentifier()) True >>> print('_abc_2'.isidentifier()) True >>> print('_Abc_2'.isidentifier()) True >>> print('Abc_2'.isidentifier()) True
3.填充
3.1 center
S.center(width[, fillchar])
將字符串居中,左右兩邊使用fillchar進(jìn)行填充,使得整個(gè)字符串的長度為width。fillchar默認(rèn)為空格。如果width小于字符串的長度,則無法填充直接返回字符串本身(不會(huì)創(chuàng)建新字符串對(duì)象)。
例如:
使用下劃線填充并居中字符串
>>> print('ab'.center(4,'_')) _ab_ >>> print('ab'.center(5,'_')) __ab_
使用默認(rèn)的空格填充并居中字符串
>>> print('ab'.center(4)) ab >>> print(len('ab'.center(4))) 4
width小于字符串長度
>>> print('abcde'.center(3)) abcde
3.2 ljust和rjust
S.ljust(width[, fillchar])
S.rjust(width[, fillchar])
ljust()使用fillchar填充在字符串S的右邊,使得整體長度為width。rjust()則是填充在左邊。如果不指定fillchar,則默認(rèn)使用空格填充。
如果width小于或等于字符串S的長度,則無法填充,直接返回字符串S(不會(huì)創(chuàng)建新字符串對(duì)象)。
例如:
>>> print('xyz'.ljust(5,'_')) xyz__ >>> print('xyz'.rjust(5,'_')) __xyz
3.3 zfill
S.zfill(width)
用0填充在字符串S的左邊使其長度為width。如果S前右正負(fù)號(hào)+/-,則0填充在這兩個(gè)符號(hào)的后面,且符號(hào)也算入長度。
如果width小于或等于S的長度,則無法填充,直接返回S本身(不會(huì)創(chuàng)建新字符串對(duì)象)。
>>> print('abc'.zfill(5)) 00abc >>> print('-abc'.zfill(5)) -0abc >>> print('+abc'.zfill(5)) +0abc >>> print('42'.zfill(5)) 00042 >>> print('-42'.zfill(5)) -0042 >>> print('+42'.zfill(5)) +0042
4.子串搜索
4.1 count
S.count(sub[, start[, end]])
返回字符串S中子串sub出現(xiàn)的次數(shù),可以指定從哪里開始計(jì)算(start)以及計(jì)算到哪里結(jié)束(end),索引從0開始計(jì)算,不包括end邊界。
例如:
>>> print('xyabxyxy'.count('xy')) 3 # 次數(shù)2,因?yàn)閺膇ndex=1算起,即從'y'開始查找,查找的范圍為'yabxyxy' >>> print('xyabxyxy'.count('xy',1)) 2 # 次數(shù)1,因?yàn)椴话╡nd,所以查找的范圍為'yabxyx' >>> print('xyabxyxy'.count('xy',1,7)) 1 # 次數(shù)2,因?yàn)椴檎业姆秶鸀?yabxyxy' >>> print('xyabxyxy'.count('xy',1,8)) 2
4.2 endswith和startswith
S.endswith(suffix[, start[, end]])
S.startswith(prefix[, start[, end]])
endswith()檢查字符串S是否已suffix結(jié)尾,返回布爾值的True和False。suffix可以是一個(gè)元組(tuple)。可以指定起始start和結(jié)尾end的搜索邊界。
同理startswith()用來判斷字符串S是否是以prefix開頭。
例如:
suffix是普通的字符串時(shí)。
>>> print('abcxyz'.endswith('xyz')) True # False,因?yàn)樗阉鞣秶鸀?yz' >>> print('abcxyz'.endswith('xyz',4)) False # False,因?yàn)樗阉鞣秶鸀?abcxy' >>> print('abcxyz'.endswith('xyz',0,5)) False >>> print('abcxyz'.endswith('xyz',0,6)) True
suffix是元組(tuple)時(shí),只要tuple中任意一個(gè)元素滿足endswith的條件,就返回True。
# tuple中的'xyz'滿足條件 >>> print('abcxyz'.endswith(('ab','xyz'))) True # tuple中'ab'和'xy'都不滿足條件 >>> print('abcxyz'.endswith(('ab','xy'))) False # tuple中的'z'滿足條件 >>> print('abcxyz'.endswith(('ab','xy','z'))) True
4.3 find,rfind和index,rindex
S.find(sub[, start[, end]])
S.rfind(sub[, start[, end]])¶
S.index(sub[, start[, end]])
S.rindex(sub[, start[, end]])
find()搜索字符串S中是否包含子串sub,如果包含,則返回sub的索引位置,否則返回"-1"??梢灾付ㄆ鹗約tart和結(jié)束end的搜索位置。
index()和find()一樣,唯一不同點(diǎn)在于當(dāng)找不到子串時(shí),拋出ValueError錯(cuò)誤。
rfind()則是返回搜索到的最右邊子串的位置,如果只搜索到一個(gè)或沒有搜索到子串,則和find()是等價(jià)的。
同理rindex()。
例如:
>>> print('abcxyzXY'.find('xy')) 3 >>> print('abcxyzXY'.find('Xy')) -1 >>> print('abcxyzXY'.find('xy',4)) -1 >>> print('xyzabcabc'.find('bc')) 4 >>> print('xyzabcabc'.rfind('bc')) 7 >>> print('xyzabcabc'.rindex('bcd')) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: substring not found
可以使用in操作符來判斷字符串S是否包含子串sub,它返回的不是索引位置,而是布爾值。
>>> 'xy' in 'abxycd' True >>> 'xyz' in 'abxycd' False
5.替換
5.1 replace
S.replace(old, new[, count])
將字符串中的子串old替換為new字符串,如果給定count,則表示只替換前count個(gè)old子串。如果S中搜索不到子串old,則無法替換,直接返回字符串S(不創(chuàng)建新字符串對(duì)象)。
>>> print('abcxyzoxy'.replace('xy','XY')) abcXYzoXY >>> print('abcxyzoxy'.replace('xy','XY',1)) abcXYzoxy >>> print('abcxyzoxy'.replace('mn','XY',1)) abcxyzoxy
5.2 expandtabs
S.expandtabs(N)
將字符串S中的\t替換為一定數(shù)量的空格。默認(rèn)N=8。
注意,expandtabs(8)不是將\t直接替換為8個(gè)空格。例如'xyz\tab'.expandtabs()會(huì)將\t替換為5個(gè)空格,因?yàn)?xyz"占用了3個(gè)字符位。
另外,它不會(huì)替換換行符(\n或\r)時(shí)。
例如:
>>> '01\t012\t0123\t01234'.expandtabs(4) '01 012 0123 01234' >>> '01\t012\t0123\t01234'.expandtabs(8) '01 012 0123 01234' >>> '01\t012\t0123\t01234'.expandtabs(7) '01 012 0123 01234' >>> print('012\t0123\n01234'.expandtabs(7)) 012 0123 01234
5.3 translate和maketrans
S.translate(table)
static str.maketrans(x[, y[, z]])
str.maketrans()生成一個(gè)字符一 一映射的table,然后使用translate(table)對(duì)字符串S中的每個(gè)字符進(jìn)行映射。
如果你熟悉Linux,就知道tr命令,translate()實(shí)現(xiàn)的功能和tr是類似的。
例如,現(xiàn)在想要對(duì)"I love fairy"做一個(gè)簡單的加密,將里面部分字符都替換為數(shù)字,這樣別人就不知道轉(zhuǎn)換后的這句話是什么意思。
>>> in_str='abcxyz' >>> out_str='123456' # maketrans()生成映射表 >>> map_table=str.maketrans(in_str,out_str) # 使用translate()進(jìn)行映射 >>> my_love='I love fairy' >>> result=my_love.translate(map_table) >>> print(result) I love f1ir5
注意,maketrans(x[, y[, z]])中的x和y都是字符串,且長度必須相等。
如果maketrans(x[, y[, z]])給定了第三個(gè)參數(shù)z,這這個(gè)參數(shù)字符串中的每個(gè)字符都會(huì)被映射為None。
例如,不替換"o"和"y"。
>>> in_str='abcxyz' >>> out_str='123456' >>> map_table=str.maketrans(in_str,out_str,'ay') >>> my_love='I love fairy' >>> result=my_love.translate(map_table) >>> print(result) I love fir
6.分割
6.1 partition和rpartition
S.partition(sep)
S.rpartition(sep)
搜索字符串S中的子串sep,并從sep處對(duì)S進(jìn)行分割,最后返回一個(gè)包含3元素的元組:sep左邊的部分是元組的第一個(gè)元素,sep自身是元組的二個(gè)元素,sep右邊是元組的第三個(gè)元素。
partition(sep)從左邊第一個(gè)sep進(jìn)行分割,rpartition(sep)從右邊第一個(gè)sep進(jìn)行分割。
如果搜索不到sep,則返回的3元素元組中,有兩個(gè)元素為空。partition()是后兩個(gè)元素為空,rpartition()是前兩個(gè)元素為空。
例如:
# 只搜索到一個(gè)sep時(shí),兩者結(jié)果相同 >>> print('abcxyzopq'.partition('xy')) ('abc', 'xy', 'zopq') >>> print('abcxyzopq'.rpartition('xy')) ('abc', 'xy', 'zopq') # 搜索到多個(gè)sep時(shí),分別從左第一個(gè)、右第一個(gè)sep分割 >>> print('abcxyzxyopq'.partition('xy')) ('abc', 'xy', 'zxyopq') >>> print('abcxyzxyopq'.rpartition('xy')) ('abcxyz', 'xy', 'opq') # 搜索不到sep >>> print('abcxyzxyopq'.partition('xyc')) ('abcxyzxyopq', '', '') >>> print('abcxyzxyopq'.rpartition('xyc')) ('', '', 'abcxyzxyopq')
6.2 split、rsplit和splitlines
S.split(sep=None, maxsplit=-1)
S.rsplit(sep=None, maxsplit=-1)
S.splitlines([keepends=True])
都是用來分割字符串,并生成一個(gè)列表。
split()根據(jù)sep對(duì)S進(jìn)行分割,maxsplit用于指定分割次數(shù),如果不指定maxsplit或者給定值為"-1",則會(huì)從做向右搜索并且每遇到sep一次就分割直到搜索完字符串。如果不指定sep或者指定為None,則改變分割算法:以空格為分隔符,且將連續(xù)的空白壓縮為一個(gè)空格。
rsplit()和split()是一樣的,只不過是從右邊向左邊搜索。
splitlines()用來專門用來分割換行符。雖然它有點(diǎn)像split('\n')或split('\r\n'),但它們有些區(qū)別,見下文解釋。
首先是split()的示例分析(rsplit()示例略)。
# sep為單個(gè)字符時(shí) >>> '1,2,3'.split(',') ['1', '2', '3'] >>> '1,2,3'.split(',',1) ['1', '2,3'] # 只分割了一次 >>> '1,2,,3'.split(',') ['1', '2', '', '3'] # 不會(huì)壓縮連續(xù)的分隔符 >>> '<hello><><world>'.split('<') ['', 'hello>', '>', 'world>'] # sep為多個(gè)字符時(shí) >>> '<hello><><world>'.split('<>') ['<hello>', '<world>'] # 不指定sep時(shí) >>> '1 2 3'.split() ['1', '2', '3'] >>> '1 2 3'.split(maxsplit=1) ['1', '2 3'] >>> ' 1 2 3 '.split() ['1', '2', '3'] >>> ' 1 2 3 \n'.split() ['1', '2', '3'] # 顯式指定sep為空格、制表符、換行符時(shí) >>> ' 1 2 3 \n'.split(' ') ['', '1', '', '2', '', '3', '', '\n'] >>> ' 1 2 3 \n'.split('\t') [' 1 2 3 \n'] >>> ' 1 2\n3 \n'.split('\n') [' 1 2', '3 ', ''] # 注意列表的最后一項(xiàng)'' >>> ''.split('\n') ['']
再是splitlines()的示例分析。
splitlines()中可以指定各種換行符,常見的是\n、\r、\r\n。如果指定keepends為True,則保留所有的換行符。
>>> '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']
將split()和splitlines()相比較一下:
#### split() >>> ''.split('\n') [''] # 因?yàn)闆]換行符可分割 >>> 'One line\n'.split('\n') ['One line', ''] #### splitlines() >>> "".splitlines() [] # 因?yàn)闆]有換行符可分割 >>> 'Two lines\n'.splitlines() ['Two lines']
7.join
S.join(iterable)
將可迭代對(duì)象(iterable)中的字符串使用S連接起來。注意,iterable中必須全部是字符串類型,否則報(bào)錯(cuò)。
如果你還是python的初學(xué)者,還不知道iterable是什么,卻想來看看join的具體語法,那么你可以暫時(shí)將它理解為:字符串string、列表list、元組tuple、字典dict、集合set。
例如:
字符串
>>> L='python' >>> '_'.join(L) 'p_y_t_h_o_n'
元組
>>> L1=('1','2','3') >>> '_'.join(L1) '1_2_3'
集合。注意,集合無序。
>>> L2={'p','y','t','h','o','n'} >>> '_'.join(L2) 'n_o_p_h_y_t'
列表
>>> L2=['py','th','o','n'] >>> '_'.join(L2) 'py_th_o_n'
字典
>>> L3={'name':"malongshuai",'gender':'male','from':'China','age':18} >>> '_'.join(L3) 'name_gender_from_age'
iterable參與迭代的部分必須是字符串類型,不能包含數(shù)字或其他類型。
>>> L1=(1,2,3) >>> '_'.join(L1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: sequence item 0: expected str instance, int found
以下兩種也不能join。
>>> L1=('ab',2) >>> L2=('AB',{'a','cd'})
8.修剪:strip、lstrip和rstrip
S.strip([chars])
S.lstrip([chars])
S.rstrip([chars])
分別是移除左右兩邊、左邊、右邊的字符char。如果不指定chars或者指定為None,則默認(rèn)移除空白(空格、制表符、換行符)。
唯一需要注意的是,chars可以是多個(gè)字符序列。在移除時(shí),只要是這個(gè)序列中的字符,都會(huì)被移除。
例如:
移除單個(gè)字符或空白。
>>> ' spacious '.lstrip() 'spacious ' >>> ' spacious '.rstrip() ' spacious' >>> 'spacious '.lstrip('s') 'pacious ' >>> 'spacious'.rstrip('s') 'spaciou'
2.移除字符中的字符。
>>> print('www.example.com'.lstrip('cmowz.')) example.com >>> print('wwwz.example.com'.lstrip('cmowz.')) example.com >>> print('wwaw.example.com'.lstrip('cmowz.')) aw.example.com >>> print('www.example.com'.strip('cmowz.')) 'example'
由于www.example.com的前4個(gè)字符都是字符序列cmowz.中的字符,所以都被移除,而第五個(gè)字符e不在字符序列中,所以修剪到此結(jié)束。同理wwwz.example.com。
wwaw.example.com中第3個(gè)字符a不是字符序列中的字符,所以修剪到此結(jié)束。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
pyqt5教程QGraphicsScene及QGraphicsView使用基礎(chǔ)
這篇文章主要為大家介紹了pyqt5教程中QGraphicsScene及QGraphicsView使用基礎(chǔ),有序要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10PyTorch中的torch.cat函數(shù)基本用法詳解
在PyTorch中,torch.cat是一個(gè)非常實(shí)用的函數(shù),用于將多個(gè)張量(Tensor)沿指定維度連接起來,本文將詳細(xì)介紹torch.cat函數(shù)的用法,并通過一些示例來說明其應(yīng)用,感興趣的朋友跟隨小編一起看看吧2024-08-08純numpy數(shù)值微分法實(shí)現(xiàn)手寫數(shù)字識(shí)別
本文主要介紹了純numpy數(shù)值微分法實(shí)現(xiàn)手寫數(shù)字識(shí)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08在CMD窗口中調(diào)用python函數(shù)的實(shí)現(xiàn)
本文主要介紹了在CMD窗口中調(diào)用python函數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Python中字典的基礎(chǔ)知識(shí)歸納小結(jié)
這篇文章主要介紹了Python中字典的基礎(chǔ)知識(shí)歸納小結(jié),都是Python入門學(xué)習(xí)中的基本知識(shí),值得反復(fù)鞏固:)需要的朋友可以參考下2015-08-08Linux環(huán)境下的Python打包和部署實(shí)踐
這篇文章主要介紹了Linux環(huán)境下的Python打包和部署實(shí)踐的相關(guān)資料,需要的朋友可以參考下2023-11-11Django ORM判斷查詢結(jié)果是否為空,判斷django中的orm為空實(shí)例
這篇文章主要介紹了Django ORM判斷查詢結(jié)果是否為空,判斷django中的orm為空實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07python中創(chuàng)建一個(gè)包并引用使用的操作方法
python包在開發(fā)中十分常見,一般通過導(dǎo)入包含特定功能的python模塊包進(jìn)行使用。當(dāng)然,也可以自己創(chuàng)建打包模塊,然后發(fā)布,安裝使用,這篇文章主要介紹了python中如何創(chuàng)建一個(gè)包并引用使用,需要的朋友可以參考下2022-08-08