Python字符串的拆分與連接詳解

生活中幾乎沒有什麼保證:死亡、稅收和需要處理字符串的程序員。字符串可以有多種形式。它們可以是非結構化文本、用戶名、產品描述、數據庫列名稱,或者我們使用語言描述的任何其他內容。

由於字符串數據幾乎無處不在,因此掌握有關字符串的交易工具非常重要。幸運的是,Python 使字符串操作變得非常簡單,尤其是與其他語言甚至舊版本的 Python 相比時。

在本文中,您將學習一些最基本的字符串操作:拆分、連接和連接。您不僅會學習如何使用這些工具,而且會更深入地瞭解它們的工作原理。

拆分字符串

在 Python 中,字符串表示為str對象,它們是不可變的:這意味著不能直接更改內存中表示的對象。這兩個事實可以幫助您學習(然後記住)如何使用.split().

您是否已經猜到字符串的這兩個特性與 Python 中的拆分功能有何關系?如果您猜測這.split()是一個實例方法,因為字符串是一種特殊類型,那麼您是對的!在其他一些語言(如 Perl)中,原始字符串用作獨立.split()函數的輸入,而不是對字符串本身調用的方法。

註意:調用字符串方法的方法

像這樣的字符串方法.split()在這裡主要顯示為在字符串上調用的實例方法。它們也可以被稱為靜態方法,但這並不理想,因為它更“冗長”。為瞭完整起見,這裡有一個例子:

# Avoid this:
str.split('a,b,c', ',')

當您將其與首選用法進行比較時,這既笨重又笨拙:

# Do this instead:
'a,b,c'.split(',')

有關 Python 中的實例、類和靜態方法的更多信息,請查看我們的深入教程。

字符串不變性怎麼樣?這應該提醒您字符串方法不是就地操作,但它們會在內存中返回一個新對象。

註意:就地操作

就地操作是直接更改調用它們的對象的操作。一個常見的例子是在列表上使用的.append()方法:當你調用一個列表時,通過將輸入添加到同一個列表來直接更改該列表。.append().append()

無參數拆分

在深入之前,讓我們看一個簡單的例子:

>>>
>>> 'this is my string'.split()
['this', 'is', 'my', 'string']

這實際上是.split()調用的一個特例,我選擇它是為瞭它的簡單性。沒有指定任何分隔符,.split()將任何空格都算作分隔符。

裸調用的另一個特點.split()是它會自動刪除前導和尾隨空格,以及連續的空格。比較.split()在沒有分隔符參數的情況下調用以下字符串和有’ ‘作為分隔符參數的調用:

>>>
>>> s = ' this   is  my string '
>>> s.split()
['this', 'is', 'my', 'string']
>>> s.split(' ')
['', 'this', '', '', 'is', '', 'my', 'string', '']

首先要註意的是,這展示瞭 Python 中字符串的不變性:後續調用.split()處理原始字符串,而不是第一次調用.split().

您應該看到的第二件事也是主要的事情是,bare .split()call 提取句子中的單詞並丟棄任何空格。

指定分隔符

.split(‘ ‘),另一方面,更字面意思。當有前導或尾隨分隔符時,您將得到一個空字符串,您可以在結果列表的第一個和最後一個元素中看到該字符串。

如果有多個連續的分隔符(例如“this”和“is”之間以及“is”和“my”之間),第一個將用作分隔符,隨後的分隔符將進入您的結果列表作為空字符串。

註意:調用中的分隔符 .split()

雖然上面的示例使用單個空格字符作為 的分隔符輸入.split(),但用作分隔符的字符類型或字符串長度不受限制。唯一的要求是你的分隔符是一個字符串。你可以使用從”…”到 even 的任何東西”separator”。

使用 Maxsplit 限制拆分

.split()有另一個可選參數稱為maxsplit. 默認情況下,.split()將在調用時進行所有可能的拆分。maxsplit但是,當您為 賦值時,隻會進行給定數量的拆分。使用我們之前的示例字符串,我們可以看到maxsplit:

>>>
>>> s = "this is my string"
>>> s.split(maxsplit=1)
['this', 'is my string']

如上所示,如果設置maxsplit為1,則第一個空白區域將用作分隔符,其餘的將被忽略。讓我們做一些練習來測試到目前為止我們學到的一切。

練習:“自己嘗試:Maxsplit”顯示隱藏

當你給一個負數作為maxsplit參數時會發生什麼?

解決方案:“自己嘗試:Maxsplit”顯示隱藏

.split()將在所有可用的分隔符上拆分您的字符串,這也是maxsplit未設置時的默認行為。

練習:“部分理解檢查”顯示隱藏

您最近收到瞭一個格式非常糟糕的逗號分隔值 (CSV) 文件。您的工作是將每一行提取到一個列表中,該列表的每個元素代表該文件的列。是什麼讓它格式錯誤?“地址”字段包含多個逗號,但需要在列表中表示為單個元素!

假設您的文件已作為以下多行字符串加載到內存中:

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

您的輸出應該是一個列表列表:

[
    ['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']
]

每個內部列表代表我們感興趣的 CSV 行,而外部列表將它們保存在一起。

解決方案:“部分理解檢查”顯示隱藏

這是我的解決方案。有幾種方法可以攻擊它。重要的是您使用.split()瞭它的所有可選參數並獲得瞭預期的輸出:

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()在這裡打瞭兩次電話。第一次使用可能看起來很嚇人,但別擔心!我們將逐步完成它,您會對這些表達式感到滿意。讓我們再看看第一個.split()調用:unsplit.split(‘\n’)[1:].

第一個元素是unsplit,它隻是指向輸入字符串的變量。然後我們有我們的.split()電話:.split(‘\n’)。在這裡,我們正在拆分一個稱為換行符的特殊字符。

有什麼作用\n?顧名思義,它告訴正在讀取字符串的任何人,它後面的每個字符都應該顯示在下一行。在像我們這樣的多行字符串中,每行末尾input_string都有一個隱藏\n。

最後一部分可能是新的:[1:]. 到目前為止的語句給瞭我們一個內存中的新列表,[1:]看起來像一個列表索引符號,它是——有點!這個擴展的索引符號給瞭我們一個列表 slice。在這種情況下,我們取 index 處的元素1及其後的所有元素,丟棄 index 處的元素0。

總之,我們遍歷一個字符串列表,其中每個元素代表多行輸入字符串中除瞭第一行之外的每一行。

在每個字符串中,我們.split()再次調用using,作為拆分字符,但這次我們隻使用maxsplit前兩個逗號進行拆分,而地址保持不變。然後我們將該調用的結果附加到恰當命名的results數組並將其返回給調用者。

連接和連接字符串

另一個基本的字符串操作與拆分字符串相反:字符串連接。如果你沒見過這個詞,別擔心。這隻是說“粘合在一起”的一種奇特方式。

與+運算符連接

有幾種方法可以做到這一點,具體取決於您要實現的目標。最簡單和最常用的方法是使用加號 ( +) 將多個字符串相加。隻需將 a 放在+您想要連接在一起的任意數量的字符串之間:

>>>
>>> 'a' + 'b' + 'c'
'abc'

為瞭與數學主題保持一致,您還可以將字符串相乘以重復它:

>>>
>>> 'do' * 2
'dodo'

請記住,字符串是不可變的!如果連接或重復存儲在變量中的字符串,則必須將新字符串分配給另一個變量以保留它。

>>>
>>> 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 不進行隱式字符串轉換。如果您嘗試將字符串與非字符串類型連接起來,Python將引發一個TypeError:

>>>
>>> 'Hello' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be str, not int

這是因為您隻能將字符串與其他字符串連接起來,如果您來自像 JavaScript 這樣試圖進行隱式類型轉換的語言,這對您來說可能是一種新行為。

在 Python 中從列表到字符串 .join()

還有另一種更強大的方法可以將字符串連接在一起。您可以使用該join()方法從 Python 中的列表轉換為字符串。

這裡的常見用例是當您有一個由字符串組成的可迭代對象(如列表),並且您希望將這些字符串組合成一個字符串時。就像.split(),.join()是一個字符串實例方法。如果您所有的字符串都在一個可迭代對象中,您會調用哪一個.join()?

這是一個有點棘手的問題。請記住,當您使用 時.split(),您將在要拆分的字符串或字符上調用它。相反的操作是.join(),因此您可以在要用於將可迭代字符串連接在一起的字符串或字符上調用它:

>>>
>>> strings = ['do', 're', 'mi']
>>> ','.join(strings)
'do,re,mi'

在這裡,我們strings用逗號 ( ,)連接列表的每個元素,並調用.join()它而不是strings列表。

練習:“通過加入提高可讀性”顯示隱藏

如何使輸出文本更具可讀性?

解決方案:“通過加入提高可讀性”顯示隱藏

您可以做的一件事是添加間距:

>>>
>>> strings = ['do', 're', 'mi']
>>> ', '.join(strings)
'do, re, mi'

通過在我們的連接字符串中添加一個空格,我們大大提高瞭輸出的可讀性。在加入字符串以提高可讀性時,您應該始終牢記這一點。

.join()很聰明,因為它將您的“joiner”插入到您想要加入的可迭代的字符串之間,而不是僅僅在可迭代的每個字符串的末尾添加您的joiner。這意味著,如果您傳遞 size 的迭代1,您將看不到您的加入者:

>>>
>>> 'b'.join(['a'])
'a'

練習:“部分理解檢查”顯示隱藏

使用我們的網頁抓取教程,您已經構建瞭一個很棒的天氣抓取工具。但是,它會在列表列表中加載字符串信息,每個列表都包含要寫出到 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']
]

您的輸出應該是如下所示的單個字符串:

"""
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
"""

解決方案:“部分理解檢查”顯示隱藏

對於此解決方案,我使用瞭列表推導式,這是 Python 的一項強大功能,可讓您快速構建列表。如果您想瞭解更多關於它們的信息,請查看這篇涵蓋 Python 中所有可用推導式的精彩文章。

以下是我的解決方案,以列表列表開始並以單個字符串結尾:

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()不是用一次,而是用瞭兩次。首先,我們在列表推導中使用它,它將每個內部列表中的所有字符串組合成一個字符串。接下來,我們將每個字符串與\n我們之前看到的換行符連接起來。最後,我們簡單地打印結果,以便我們可以驗證它是否符合我們的預期。 

到此這篇關於Python字符串的拆分與連接詳解的文章就介紹到這瞭,更多相關Python字符串拆分與連接內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: