版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第Python字符串的拆分與連接詳解目錄拆分字符串無參數(shù)拆分指定分隔符使用Maxsplit限制拆分連接和連接字符串與+運(yùn)算符連接在Python中從列表到字符串.join()生活中幾乎沒有什么保證:死亡、稅收和需要處理字符串的程序員。字符串可以有多種形式。它們可以是非結(jié)構(gòu)化文本、用戶名、產(chǎn)品描述、數(shù)據(jù)庫列名稱,或者我們使用語言描述的任何其他內(nèi)容。
由于字符串?dāng)?shù)據(jù)幾乎無處不在,因此掌握有關(guān)字符串的交易工具非常重要。幸運(yùn)的是,Python使字符串操作變得非常簡單,尤其是與其他語言甚至舊版本的Python相比時(shí)。
在本文中,您將學(xué)習(xí)一些最基本的字符串操作:拆分、連接和連接。您不僅會(huì)學(xué)習(xí)如何使用這些工具,而且會(huì)更深入地了解它們的工作原理。
拆分字符串
在Python中,字符串表示為str對(duì)象,它們是不可變的:這意味著不能直接更改內(nèi)存中表示的對(duì)象。這兩個(gè)事實(shí)可以幫助您學(xué)習(xí)(然后記住)如何使用.split().
您是否已經(jīng)猜到字符串的這兩個(gè)特性與Python中的拆分功能有何關(guān)系?如果您猜測這.split()是一個(gè)實(shí)例方法,因?yàn)樽址且环N特殊類型,那么您是對(duì)的!在其他一些語言(如Perl)中,原始字符串用作獨(dú)立.split()函數(shù)的輸入,而不是對(duì)字符串本身調(diào)用的方法。
注意:調(diào)用字符串方法的方法
像這樣的字符串方法.split()在這里主要顯示為在字符串上調(diào)用的實(shí)例方法。它們也可以被稱為靜態(tài)方法,但這并不理想,因?yàn)樗叭唛L”。為了完整起見,這里有一個(gè)例子:
#Avoidthis:
str.split('a,b,c',',')
當(dāng)您將其與首選用法進(jìn)行比較時(shí),這既笨重又笨拙:
#Dothisinstead:
'a,b,c'.split(',')
有關(guān)Python中的實(shí)例、類和靜態(tài)方法的更多信息,請(qǐng)查看我們的深入教程。
字符串不變性怎么樣?這應(yīng)該提醒您字符串方法不是就地操作,但它們會(huì)在內(nèi)存中返回一個(gè)新對(duì)象。
注意:就地操作
就地操作是直接更改調(diào)用它們的對(duì)象的操作。一個(gè)常見的例子是在列表上使用的.append()方法:當(dāng)你調(diào)用一個(gè)列表時(shí),通過將輸入添加到同一個(gè)列表來直接更改該列表。.append().append()
無參數(shù)拆分
在深入之前,讓我們看一個(gè)簡單的例子:
'thisismystring'.split()
['this','is','my','string']
這實(shí)際上是.split()調(diào)用的一個(gè)特例,我選擇它是為了它的簡單性。沒有指定任何分隔符,.split()將任何空格都算作分隔符。
裸調(diào)用的另一個(gè)特點(diǎn).split()是它會(huì)自動(dòng)刪除前導(dǎo)和尾隨空格,以及連續(xù)的空格。比較.split()在沒有分隔符參數(shù)的情況下調(diào)用以下字符串和有''作為分隔符參數(shù)的調(diào)用:
s='thisismystring'
s.split()
['this','is','my','string']
s.split('')
['','this','','','is','','my','string','']
首先要注意的是,這展示了Python中字符串的不變性:后續(xù)調(diào)用.split()處理原始字符串,而不是第一次調(diào)用.split().
您應(yīng)該看到的第二件事也是主要的事情是,bare.split()call提取句子中的單詞并丟棄任何空格。
指定分隔符
.split(''),另一方面,更字面意思。當(dāng)有前導(dǎo)或尾隨分隔符時(shí),您將得到一個(gè)空字符串,您可以在結(jié)果列表的第一個(gè)和最后一個(gè)元素中看到該字符串。
如果有多個(gè)連續(xù)的分隔符(例如“this”和“is”之間以及“is”和“my”之間),第一個(gè)將用作分隔符,隨后的分隔符將進(jìn)入您的結(jié)果列表作為空字符串。
注意:調(diào)用中的分隔符.split()
雖然上面的示例使用單個(gè)空格字符作為的分隔符輸入.split(),但用作分隔符的字符類型或字符串長度不受限制。唯一的要求是你的分隔符是一個(gè)字符串。你可以使用從"..."到even的任何東西"separator"。
使用Maxsplit限制拆分
.split()有另一個(gè)可選參數(shù)稱為maxsplit.默認(rèn)情況下,.split()將在調(diào)用時(shí)進(jìn)行所有可能的拆分。maxsplit但是,當(dāng)您為賦值時(shí),只會(huì)進(jìn)行給定數(shù)量的拆分。使用我們之前的示例字符串,我們可以看到maxsplit:
s="thisismystring"
s.split(maxsplit=1)
['this','ismystring']
如上所示,如果設(shè)置maxsplit為1,則第一個(gè)空白區(qū)域?qū)⒂米鞣指舴溆嗟膶⒈缓雎?。讓我們做一些練?xí)來測試到目前為止我們學(xué)到的一切。
練習(xí):“自己嘗試:Maxsplit”顯示隱藏
當(dāng)你給一個(gè)負(fù)數(shù)作為maxsplit參數(shù)時(shí)會(huì)發(fā)生什么?
解決方案:“自己嘗試:Maxsplit”顯示隱藏
.split()將在所有可用的分隔符上拆分您的字符串,這也是maxsplit未設(shè)置時(shí)的默認(rèn)行為。
練習(xí):“部分理解檢查”顯示隱藏
您最近收到了一個(gè)格式非常糟糕的逗號(hào)分隔值(CSV)文件。您的工作是將每一行提取到一個(gè)列表中,該列表的每個(gè)元素代表該文件的列。是什么讓它格式錯(cuò)誤?“地址”字段包含多個(gè)逗號(hào),但需要在列表中表示為單個(gè)元素!
假設(shè)您的文件已作為以下多行字符串加載到內(nèi)存中:
Name,Phone,Address
MikeSmith123NiceSt,Roy,NM,USA
AnitaHernandez425SunnySt,NewYork,NY,USA
GuidovanRossum,315558730,SciencePark123,1098XGAmsterdam,NL
您的輸出應(yīng)該是一個(gè)列表列表:
['MikeSmith',,'123NiceSt,Roy,NM,USA'],
['AnitaHernandez',,'425SunnySt,NewYork,NY,USA'],
['GuidovanRossum','315558730','SciencePark123,1098XGAmsterdam,NL']
]
每個(gè)內(nèi)部列表代表我們感興趣的CSV行,而外部列表將它們保存在一起。
解決方案:“部分理解檢查”顯示隱藏
這是我的解決方案。有幾種方法可以攻擊它。重要的是您使用.split()了它的所有可選參數(shù)并獲得了預(yù)期的輸出:
input_string="""Name,Phone,Address
MikeSmith123NiceSt,Roy,NM,USA
AnitaHernandez425SunnySt,NewYork,NY,USA
GuidovanRossum,315558730,SciencePark123,1098XGAmsterdam,NL"""
defstring_split_ex(unsplit):
results=[]
#Bonuspointsforusingsplitlines()hereinstead,
#whichwillbemorereadable
forlineinunsplit.split('\n')[1:]:
results.append(line.split(',',maxsplit=2))
returnresults
print(string_split_ex(input_string))
我們.split()在這里打了兩次電話。第一次使用可能看起來很嚇人,但別擔(dān)心!我們將逐步完成它,您會(huì)對(duì)這些表達(dá)式感到滿意。讓我們?cè)倏纯吹谝粋€(gè).split()調(diào)用:unsplit.split('\n')[1:].
第一個(gè)元素是unsplit,它只是指向輸入字符串的變量。然后我們有我們的.split()電話:.split('\n')。在這里,我們正在拆分一個(gè)稱為換行符的特殊字符。
有什么作用\n?顧名思義,它告訴正在讀取字符串的任何人,它后面的每個(gè)字符都應(yīng)該顯示在下一行。在像我們這樣的多行字符串中,每行末尾input_string都有一個(gè)隱藏\n。
最后一部分可能是新的:[1:].到目前為止的語句給了我們一個(gè)內(nèi)存中的新列表,[1:]看起來像一個(gè)列表索引符號(hào),它是——有點(diǎn)!這個(gè)擴(kuò)展的索引符號(hào)給了我們一個(gè)列表slice。在這種情況下,我們?nèi)ndex處的元素1及其后的所有元素,丟棄index處的元素0。
總之,我們遍歷一個(gè)字符串列表,其中每個(gè)元素代表多行輸入字符串中除了第一行之外的每一行。
在每個(gè)字符串中,我們.split()再次調(diào)用using,作為拆分字符,但這次我們只使用maxsplit前兩個(gè)逗號(hào)進(jìn)行拆分,而地址保持不變。然后我們將該調(diào)用的結(jié)果附加到恰當(dāng)命名的results數(shù)組并將其返回給調(diào)用者。
連接和連接字符串
另一個(gè)基本的字符串操作與拆分字符串相反:字符串連接。如果你沒見過這個(gè)詞,別擔(dān)心。這只是說“粘合在一起”的一種奇特方式。
與+運(yùn)算符連接
有幾種方法可以做到這一點(diǎn),具體取決于您要實(shí)現(xiàn)的目標(biāo)。最簡單和最常用的方法是使用加號(hào)(+)將多個(gè)字符串相加。只需將a放在+您想要連接在一起的任意數(shù)量的字符串之間:
'a'+'b'+'c'
'abc'
為了與數(shù)學(xué)主題保持一致,您還可以將字符串相乘以重復(fù)它:
'do'*2
'dodo'
請(qǐng)記住,字符串是不可變的!如果連接或重復(fù)存儲(chǔ)在變量中的字符串,則必須將新字符串分配給另一個(gè)變量以保留它。
orig_string='Hello'
orig_string+',world'
'Hello,world'
orig_string
'Hello'
full_sentence=orig_string+',world'
full_sentence
'Hello,world'
如果我們沒有不可變的字符串,full_sentence則會(huì)輸出'Hello,world,world'.
另一個(gè)注意事項(xiàng)是Python不進(jìn)行隱式字符串轉(zhuǎn)換。如果您嘗試將字符串與非字符串類型連接起來,Python將引發(fā)一個(gè)TypeError:
'Hello'+2
Traceback(mostrecentcalllast):
File"stdin",line1,inmodule
TypeError:mustbestr,notint
這是因?yàn)槟荒軐⒆址c其他字符串連接起來,如果您來自像JavaScript這樣試圖進(jìn)行隱式類型轉(zhuǎn)換的語言,這對(duì)您來說可能是一種新行為。
在Python中從列表到字符串.join()
還有另一種更強(qiáng)大的方法可以將字符串連接在一起。您可以使用該join()方法從Python中的列表轉(zhuǎn)換為字符串。
這里的常見用例是當(dāng)您有一個(gè)由字符串組成的可迭代對(duì)象(如列表),并且您希望將這些字符串組合成一個(gè)字符串時(shí)。就像.split(),.join()是一個(gè)字符串實(shí)例方法。如果您所有的字符串都在一個(gè)可迭代對(duì)象中,您會(huì)調(diào)用哪一個(gè).join()?
這是一個(gè)有點(diǎn)棘手的問題。請(qǐng)記住,當(dāng)您使用時(shí).split(),您將在要拆分的字符串或字符上調(diào)用它。相反的操作是.join(),因此您可以在要用于將可迭代字符串連接在一起的字符串或字符上調(diào)用它:
strings=['do','re','mi']
','.join(strings)
'do,re,mi'
在這里,我們strings用逗號(hào)(,)連接列表的每個(gè)元素,并調(diào)用.join()它而不是strings列表。
練習(xí):“通過加入提高可讀性”顯示隱藏
如何使輸出文本更具可讀性?
解決方案:“通過加入提高可讀性”顯示隱藏
您可以做的一件事是添加間距:
strings=['do','re','mi']
','.join(strings)
'do,re,mi'
通過在我們的連接字符串中添加一個(gè)空格,我們大大提高了輸出的可讀性。在加入字符串以提高可讀性時(shí),您應(yīng)該始終牢記這一點(diǎn)。
.join()很聰明,因?yàn)樗鼘⒛摹癹oiner”插入到您想要加入的可迭代的字符串之間,而不是僅僅在可迭代的每個(gè)字符串的末尾添加您的joiner。這意味著,如果您傳遞size的迭代1,您將看不到您的加入者:
'b'.join(['a'])
'a'
練習(xí):“部分理解檢查”顯示隱藏
使用我們的網(wǎng)頁抓取教程,您已經(jīng)構(gòu)建了一個(gè)很棒的天氣抓取工具。但是,它會(huì)在列表列表中加載字符串信息,每個(gè)列表都包含要寫出到CSV文件的唯一信息行:
['Boston','MA','76F','65%Precip','0.15in'],
['SanFrancisco','CA','62F','20%Precip','0.00in'],
['Washington','DC','82F','80%Precip','0.19in'],
['Miami','FL','79F','50%Precip','0.70in']
]
您的輸出應(yīng)該是如下所示的單個(gè)字符串:
Boston,MA,76F,65%Precip,0.15in
SanFrancisco,CA,62F,20%Precip,0.00in
Washington,DC,82F,80%Precip,0.19in
Miami,FL,79F,50%Precip,0.70in
"""
解決方案:“部分理解檢查”顯示隱藏
對(duì)于此解決方案,我使用了列表
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 水果種植合作社財(cái)務(wù)制度
- 分支機(jī)構(gòu)財(cái)務(wù)制度
- 美國私立學(xué)校財(cái)務(wù)制度
- 公司喝酒制度
- 瀝青支路施工方案(3篇)
- 活動(dòng)型新聞策劃方案(3篇)
- 施工現(xiàn)場施工防污染制度
- 教職工休息休假制度
- 罕見腫瘤的個(gè)體化治療長期生存數(shù)據(jù)分析與策略優(yōu)化-1-1
- 遼寧省重點(diǎn)協(xié)作校2026屆高三生物第一學(xué)期期末調(diào)研試題含解析
- 2025年強(qiáng)指向性揚(yáng)聲器項(xiàng)目市場調(diào)查研究報(bào)告
- 大廈無償劃轉(zhuǎn)協(xié)議書
- 復(fù)墾施工合同協(xié)議
- 2024年四川省考公務(wù)員考試結(jié)構(gòu)化面試鄉(xiāng)鎮(zhèn)崗真題試題試卷答案解析
- 貿(mào)易公司組織架構(gòu)與部門職責(zé)一覽表
- 《電梯基本結(jié)構(gòu)》課件
- 供水管道緊急搶修工程合同
- DL∕T 1993-2019 電氣設(shè)備用六氟化硫氣體回收、再生及再利用技術(shù)規(guī)范
- (正式版)HGT 20593-2024 鋼制化工設(shè)備焊接與檢驗(yàn)工程技術(shù)規(guī)范
- 肘關(guān)節(jié)恐怖三聯(lián)征
- 刀模管理制度
評(píng)論
0/150
提交評(píng)論