Python字符串的拆分與連接詳解
生活中幾乎沒有什么保證:死亡、稅收和需要處理字符串的程序員。字符串可以有多種形式。它們可以是非結(jié)構(gòu)化文本、用戶名、產(chǎn)品描述、數(shù)據(jù)庫(kù)列名稱,或者我們使用語(yǔ)言描述的任何其他內(nèi)容。
由于字符串?dāng)?shù)據(jù)幾乎無處不在,因此掌握有關(guān)字符串的交易工具非常重要。幸運(yùn)的是,Python 使字符串操作變得非常簡(jiǎn)單,尤其是與其他語(yǔ)言甚至舊版本的 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)系?如果您猜測(cè)這.split()是一個(gè)實(shí)例方法,因?yàn)樽址且环N特殊類型,那么您是對(duì)的!在其他一些語(yǔ)言(如 Perl)中,原始字符串用作獨(dú)立.split()函數(shù)的輸入,而不是對(duì)字符串本身調(diào)用的方法。
注意:調(diào)用字符串方法的方法
像這樣的字符串方法.split()在這里主要顯示為在字符串上調(diào)用的實(shí)例方法。它們也可以被稱為靜態(tài)方法,但這并不理想,因?yàn)樗叭唛L(zhǎng)”。為了完整起見,這里有一個(gè)例子:
# Avoid this: str.split('a,b,c', ',')
當(dāng)您將其與首選用法進(jìn)行比較時(shí),這既笨重又笨拙:
# Do this instead: '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è)簡(jiǎn)單的例子:
>>> >>> 'this is my string'.split() ['this', 'is', 'my', 'string']
這實(shí)際上是.split()調(diào)用的一個(gè)特例,我選擇它是為了它的簡(jiǎn)單性。沒有指定任何分隔符,.split()將任何空格都算作分隔符。
裸調(diào)用的另一個(gè)特點(diǎn).split()是它會(huì)自動(dòng)刪除前導(dǎo)和尾隨空格,以及連續(xù)的空格。比較.split()在沒有分隔符參數(shù)的情況下調(diào)用以下字符串和有' '作為分隔符參數(shù)的調(diào)用:
>>> >>> s = ' this is my string ' >>> 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(),但用作分隔符的字符類型或字符串長(zhǎng)度不受限制。唯一的要求是你的分隔符是一個(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 = "this is my string" >>> s.split(maxsplit=1) ['this', 'is my string']
如上所示,如果設(shè)置maxsplit為1,則第一個(gè)空白區(qū)域?qū)⒂米鞣指舴?,其余的將被忽略。讓我們做一些練?xí)來測(cè)試到目前為止我們學(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 Mike Smith,15554218841,123 Nice St, Roy, NM, USA Anita Hernandez,15557789941,425 Sunny St, New York, NY, USA Guido van Rossum,315558730,Science Park 123, 1098 XG Amsterdam, NL
您的輸出應(yīng)該是一個(gè)列表列表:
[ ['Mike Smith', '15554218841', '123 Nice St, Roy, NM, USA'], ['Anita Hernandez', '15557789941', '425 Sunny St, New York, NY, USA'], ['Guido van Rossum', '315558730', 'Science Park 123, 1098 XG Amsterdam, NL'] ]
每個(gè)內(nèi)部列表代表我們感興趣的 CSV 行,而外部列表將它們保存在一起。
解決方案:“部分理解檢查”顯示隱藏
這是我的解決方案。有幾種方法可以攻擊它。重要的是您使用.split()了它的所有可選參數(shù)并獲得了預(yù)期的輸出:
input_string = """Name,Phone,Address Mike Smith,15554218841,123 Nice St, Roy, NM, USA Anita Hernandez,15557789941,425 Sunny St, New York, NY, USA Guido van Rossum,315558730,Science Park 123, 1098 XG Amsterdam, NL""" def string_split_ex(unsplit): results = [] # Bonus points for using splitlines() here instead, # which will be more readable for line in unsplit.split('\n')[1:]: results.append(line.split(',', maxsplit=2)) return results 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:]. 到目前為止的語(yǔ)句給了我們一個(gè)內(nèi)存中的新列表,[1:]看起來像一個(gè)列表索引符號(hào),它是——有點(diǎn)!這個(gè)擴(kuò)展的索引符號(hào)給了我們一個(gè)列表 slice。在這種情況下,我們?nèi)?index 處的元素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)。最簡(jiǎn)單和最常用的方法是使用加號(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 (most recent call last): File "<stdin>", line 1, in <module> TypeError: must be str, not int
這是因?yàn)槟荒軐⒆址c其他字符串連接起來,如果您來自像 JavaScript 這樣試圖進(jìn)行隱式類型轉(zhuǎn)換的語(yǔ)言,這對(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)頁(yè)抓取教程,您已經(jīng)構(gòu)建了一個(gè)很棒的天氣抓取工具。但是,它會(huì)在列表列表中加載字符串信息,每個(gè)列表都包含要寫出到 CSV 文件的唯一信息行:
[ ['Boston', 'MA', '76F', '65% Precip', '0.15 in'], ['San Francisco', 'CA', '62F', '20% Precip', '0.00 in'], ['Washington', 'DC', '82F', '80% Precip', '0.19 in'], ['Miami', 'FL', '79F', '50% Precip', '0.70 in'] ]
您的輸出應(yīng)該是如下所示的單個(gè)字符串:
""" Boston,MA,76F,65% Precip,0.15in San Francisco,CA,62F,20% Precip,0.00 in Washington,DC,82F,80% Precip,0.19 in Miami,FL,79F,50% Precip,0.70 in """
解決方案:“部分理解檢查”顯示隱藏
對(duì)于此解決方案,我使用了列表推導(dǎo)式,這是 Python 的一項(xiàng)強(qiáng)大功能,可讓您快速構(gòu)建列表。如果您想了解更多關(guān)于它們的信息,請(qǐng)查看這篇涵蓋 Python 中所有可用推導(dǎo)式的精彩文章。
以下是我的解決方案,以列表列表開始并以單個(gè)字符串結(jié)尾:
input_list = [ ['Boston', 'MA', '76F', '65% Precip', '0.15 in'], ['San Francisco', 'CA', '62F', '20% Precip', '0.00 in'], ['Washington', 'DC', '82F', '80% Precip', '0.19 in'], ['Miami', 'FL', '79F', '50% Precip', '0.70 in'] ] # We start with joining each inner list into a single string joined = [','.join(row) for row in input_list] # Now we transform the list of strings into a single string output = '\n'.join(joined) print(output)
這里我們.join()不是用一次,而是用了兩次。首先,我們?cè)诹斜硗茖?dǎo)中使用它,它將每個(gè)內(nèi)部列表中的所有字符串組合成一個(gè)字符串。接下來,我們將每個(gè)字符串與\n我們之前看到的換行符連接起來。最后,我們簡(jiǎn)單地打印結(jié)果,以便我們可以驗(yàn)證它是否符合我們的預(yù)期。?
到此這篇關(guān)于Python字符串的拆分與連接詳解的文章就介紹到這了,更多相關(guān)Python字符串拆分與連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
將.ipynb文件轉(zhuǎn)換成.py文件詳細(xì)步驟(一看就會(huì))
這篇文章主要給大家介紹了關(guān)于如何將.ipynb文件轉(zhuǎn)換成.py文件的詳細(xì)步驟,文中通過圖文介紹的非常詳細(xì),大家基本一看就會(huì),需要的朋友可以參考下2023-07-07Python的Django中django-userena組件的簡(jiǎn)單使用教程
這篇文章主要介紹了Python的Django中django-userena組件的簡(jiǎn)單使用教程,包括用戶登陸和注冊(cè)等簡(jiǎn)單功能的實(shí)現(xiàn),需要的朋友可以參考下2015-05-05Python實(shí)現(xiàn)平行坐標(biāo)圖的繪制(plotly)方式
今天小編就為大家分享一篇Python實(shí)現(xiàn)平行坐標(biāo)圖的繪制(plotly)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11通過Python使用saltstack生成服務(wù)器資產(chǎn)清單
人工去對(duì)每一臺(tái)服務(wù)器的硬件信息并記錄早已經(jīng)過去了,無論通過腳本還是自動(dòng)化工具都是可以進(jìn)行一次編寫到處抓取的,本文主要使用saltstack作為使用工具,然后利用其提供的APi編寫所需的Python腳本2016-03-03基于pytorch實(shí)現(xiàn)運(yùn)動(dòng)鞋品牌識(shí)別功能
這篇文章主要給大家介紹了關(guān)于如何基于pytorch實(shí)現(xiàn)運(yùn)動(dòng)鞋品牌識(shí)別功能,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PyTorch具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2024-02-02