Python字符串的拆分與連接詳解
生活中幾乎沒有什么保證:死亡、稅收和需要處理字符串的程序員。字符串可以有多種形式。它們可以是非結(jié)構(gòu)化文本、用戶名、產(chǎn)品描述、數(shù)據(jù)庫列名稱,或者我們使用語言描述的任何其他內(nèi)容。
由于字符串?dāng)?shù)據(jù)幾乎無處不在,因此掌握有關(guān)字符串的交易工具非常重要。幸運的是,Python 使字符串操作變得非常簡單,尤其是與其他語言甚至舊版本的 Python 相比時。
在本文中,您將學(xué)習(xí)一些最基本的字符串操作:拆分、連接和連接。您不僅會學(xué)習(xí)如何使用這些工具,而且會更深入地了解它們的工作原理。
拆分字符串
在 Python 中,字符串表示為str對象,它們是不可變的:這意味著不能直接更改內(nèi)存中表示的對象。這兩個事實可以幫助您學(xué)習(xí)(然后記?。┤绾问褂?split().
您是否已經(jīng)猜到字符串的這兩個特性與 Python 中的拆分功能有何關(guān)系?如果您猜測這.split()是一個實例方法,因為字符串是一種特殊類型,那么您是對的!在其他一些語言(如 Perl)中,原始字符串用作獨立.split()函數(shù)的輸入,而不是對字符串本身調(diào)用的方法。
注意:調(diào)用字符串方法的方法
像這樣的字符串方法.split()在這里主要顯示為在字符串上調(diào)用的實例方法。它們也可以被稱為靜態(tài)方法,但這并不理想,因為它更“冗長”。為了完整起見,這里有一個例子:
# Avoid this: str.split('a,b,c', ',')
當(dāng)您將其與首選用法進行比較時,這既笨重又笨拙:
# Do this instead: 'a,b,c'.split(',')
有關(guān) Python 中的實例、類和靜態(tài)方法的更多信息,請查看我們的深入教程。
字符串不變性怎么樣?這應(yīng)該提醒您字符串方法不是就地操作,但它們會在內(nèi)存中返回一個新對象。
注意:就地操作
就地操作是直接更改調(diào)用它們的對象的操作。一個常見的例子是在列表上使用的.append()方法:當(dāng)你調(diào)用一個列表時,通過將輸入添加到同一個列表來直接更改該列表。.append().append()
無參數(shù)拆分
在深入之前,讓我們看一個簡單的例子:
>>> >>> 'this is my string'.split() ['this', 'is', 'my', 'string']
這實際上是.split()調(diào)用的一個特例,我選擇它是為了它的簡單性。沒有指定任何分隔符,.split()將任何空格都算作分隔符。
裸調(diào)用的另一個特點.split()是它會自動刪除前導(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)或尾隨分隔符時,您將得到一個空字符串,您可以在結(jié)果列表的第一個和最后一個元素中看到該字符串。
如果有多個連續(xù)的分隔符(例如“this”和“is”之間以及“is”和“my”之間),第一個將用作分隔符,隨后的分隔符將進入您的結(jié)果列表作為空字符串。
注意:調(diào)用中的分隔符 .split()
雖然上面的示例使用單個空格字符作為 的分隔符輸入.split(),但用作分隔符的字符類型或字符串長度不受限制。唯一的要求是你的分隔符是一個字符串。你可以使用從"..."到 even 的任何東西"separator"。
使用 Maxsplit 限制拆分
.split()有另一個可選參數(shù)稱為maxsplit. 默認(rèn)情況下,.split()將在調(diào)用時進行所有可能的拆分。maxsplit但是,當(dāng)您為 賦值時,只會進行給定數(shù)量的拆分。使用我們之前的示例字符串,我們可以看到maxsplit:
>>> >>> s = "this is my string" >>> s.split(maxsplit=1) ['this', 'is my string']
如上所示,如果設(shè)置maxsplit為1,則第一個空白區(qū)域?qū)⒂米鞣指舴?,其余的將被忽略。讓我們做一些練?xí)來測試到目前為止我們學(xué)到的一切。
練習(xí):“自己嘗試:Maxsplit”顯示隱藏
當(dāng)你給一個負(fù)數(shù)作為maxsplit參數(shù)時會發(fā)生什么?
解決方案:“自己嘗試:Maxsplit”顯示隱藏
.split()將在所有可用的分隔符上拆分您的字符串,這也是maxsplit未設(shè)置時的默認(rèn)行為。
練習(xí):“部分理解檢查”顯示隱藏
您最近收到了一個格式非常糟糕的逗號分隔值 (CSV) 文件。您的工作是將每一行提取到一個列表中,該列表的每個元素代表該文件的列。是什么讓它格式錯誤?“地址”字段包含多個逗號,但需要在列表中表示為單個元素!
假設(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)該是一個列表列表:
[ ['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'] ]
每個內(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)心!我們將逐步完成它,您會對這些表達式感到滿意。讓我們再看看第一個.split()調(diào)用:unsplit.split('\n')[1:].
第一個元素是unsplit,它只是指向輸入字符串的變量。然后我們有我們的.split()電話:.split('\n')。在這里,我們正在拆分一個稱為換行符的特殊字符。
有什么作用\n?顧名思義,它告訴正在讀取字符串的任何人,它后面的每個字符都應(yīng)該顯示在下一行。在像我們這樣的多行字符串中,每行末尾input_string都有一個隱藏\n。
最后一部分可能是新的:[1:]. 到目前為止的語句給了我們一個內(nèi)存中的新列表,[1:]看起來像一個列表索引符號,它是——有點!這個擴展的索引符號給了我們一個列表 slice。在這種情況下,我們?nèi)?index 處的元素1及其后的所有元素,丟棄 index 處的元素0。
總之,我們遍歷一個字符串列表,其中每個元素代表多行輸入字符串中除了第一行之外的每一行。
在每個字符串中,我們.split()再次調(diào)用using,作為拆分字符,但這次我們只使用maxsplit前兩個逗號進行拆分,而地址保持不變。然后我們將該調(diào)用的結(jié)果附加到恰當(dāng)命名的results數(shù)組并將其返回給調(diào)用者。
連接和連接字符串
另一個基本的字符串操作與拆分字符串相反:字符串連接。如果你沒見過這個詞,別擔(dān)心。這只是說“粘合在一起”的一種奇特方式。
與+運算符連接
有幾種方法可以做到這一點,具體取決于您要實現(xiàn)的目標(biāo)。最簡單和最常用的方法是使用加號 ( +) 將多個字符串相加。只需將 a 放在+您想要連接在一起的任意數(shù)量的字符串之間:
>>> >>> 'a' + 'b' + 'c' 'abc'
為了與數(shù)學(xué)主題保持一致,您還可以將字符串相乘以重復(fù)它:
>>> >>> 'do' * 2 'dodo'
請記住,字符串是不可變的!如果連接或重復(fù)存儲在變量中的字符串,則必須將新字符串分配給另一個變量以保留它。
>>> >>> orig_string = 'Hello' >>> orig_string + ', world' 'Hello, world' >>> orig_string 'Hello' >>> full_sentence = orig_string + ', world' >>> full_sentence 'Hello, world'
如果我們沒有不可變的字符串,full_sentence則會輸出'Hello, world, world'.
另一個注意事項是 Python 不進行隱式字符串轉(zhuǎn)換。如果您嘗試將字符串與非字符串類型連接起來,Python將引發(fā)一個TypeError:
>>> >>> 'Hello' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: must be str, not int
這是因為您只能將字符串與其他字符串連接起來,如果您來自像 JavaScript 這樣試圖進行隱式類型轉(zhuǎn)換的語言,這對您來說可能是一種新行為。
在 Python 中從列表到字符串 .join()
還有另一種更強大的方法可以將字符串連接在一起。您可以使用該join()方法從 Python 中的列表轉(zhuǎn)換為字符串。
這里的常見用例是當(dāng)您有一個由字符串組成的可迭代對象(如列表),并且您希望將這些字符串組合成一個字符串時。就像.split(),.join()是一個字符串實例方法。如果您所有的字符串都在一個可迭代對象中,您會調(diào)用哪一個.join()?
這是一個有點棘手的問題。請記住,當(dāng)您使用 時.split(),您將在要拆分的字符串或字符上調(diào)用它。相反的操作是.join(),因此您可以在要用于將可迭代字符串連接在一起的字符串或字符上調(diào)用它:
>>> >>> strings = ['do', 're', 'mi'] >>> ','.join(strings) 'do,re,mi'
在這里,我們strings用逗號 ( ,)連接列表的每個元素,并調(diào)用.join()它而不是strings列表。
練習(xí):“通過加入提高可讀性”顯示隱藏
如何使輸出文本更具可讀性?
解決方案:“通過加入提高可讀性”顯示隱藏
您可以做的一件事是添加間距:
>>> >>> strings = ['do', 're', 'mi'] >>> ', '.join(strings) 'do, re, mi'
通過在我們的連接字符串中添加一個空格,我們大大提高了輸出的可讀性。在加入字符串以提高可讀性時,您應(yīng)該始終牢記這一點。
.join()很聰明,因為它將您的“joiner”插入到您想要加入的可迭代的字符串之間,而不是僅僅在可迭代的每個字符串的末尾添加您的joiner。這意味著,如果您傳遞 size 的迭代1,您將看不到您的加入者:
>>> >>> 'b'.join(['a']) 'a'
練習(xí):“部分理解檢查”顯示隱藏
使用我們的網(wǎng)頁抓取教程,您已經(jīng)構(gòu)建了一個很棒的天氣抓取工具。但是,它會在列表列表中加載字符串信息,每個列表都包含要寫出到 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)該是如下所示的單個字符串:
""" 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 """
解決方案:“部分理解檢查”顯示隱藏
對于此解決方案,我使用了列表推導(dǎo)式,這是 Python 的一項強大功能,可讓您快速構(gòu)建列表。如果您想了解更多關(guān)于它們的信息,請查看這篇涵蓋 Python 中所有可用推導(dǎo)式的精彩文章。
以下是我的解決方案,以列表列表開始并以單個字符串結(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()不是用一次,而是用了兩次。首先,我們在列表推導(dǎo)中使用它,它將每個內(nèi)部列表中的所有字符串組合成一個字符串。接下來,我們將每個字符串與\n我們之前看到的換行符連接起來。最后,我們簡單地打印結(jié)果,以便我們可以驗證它是否符合我們的預(yù)期。?
到此這篇關(guān)于Python字符串的拆分與連接詳解的文章就介紹到這了,更多相關(guān)Python字符串拆分與連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
將.ipynb文件轉(zhuǎn)換成.py文件詳細(xì)步驟(一看就會)
這篇文章主要給大家介紹了關(guān)于如何將.ipynb文件轉(zhuǎn)換成.py文件的詳細(xì)步驟,文中通過圖文介紹的非常詳細(xì),大家基本一看就會,需要的朋友可以參考下2023-07-07Python的Django中django-userena組件的簡單使用教程
這篇文章主要介紹了Python的Django中django-userena組件的簡單使用教程,包括用戶登陸和注冊等簡單功能的實現(xiàn),需要的朋友可以參考下2015-05-05Python實現(xiàn)平行坐標(biāo)圖的繪制(plotly)方式
今天小編就為大家分享一篇Python實現(xiàn)平行坐標(biāo)圖的繪制(plotly)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11通過Python使用saltstack生成服務(wù)器資產(chǎn)清單
人工去對每一臺服務(wù)器的硬件信息并記錄早已經(jīng)過去了,無論通過腳本還是自動化工具都是可以進行一次編寫到處抓取的,本文主要使用saltstack作為使用工具,然后利用其提供的APi編寫所需的Python腳本2016-03-03