如何在 Python 中基於多個定界符分割字串

Dasun Nirmitha 2023年1月30日 2020年6月9日
  1. 具有兩個定界符的 Python 分割字串
  2. 具有多個定界符的 Python 拆分字串
如何在 Python 中基於多個定界符分割字串

Python 字串 split() 方法允許根據分隔符將字串輕鬆拆分為列表。儘管在某些情況下,你可能需要不僅基於一個分隔符值,而且還要基於多個定界符值進行分隔。這篇文章介紹了可以在 Python 中實現的兩種便捷方法。

具有兩個定界符的 Python 分割字串

假設以下字串。

text = "python is, an easy;language; to, learn."

對於我們的示例,我們需要用分號,空格 (; ) 或逗號和空格 (, ) 進行拆分。在這種情況下,不應該考慮出現任何奇數的分號或逗號,即沒有尾部空格的 ,;

正規表示式

儘管正規表示式的使用由於字串解析的昂貴特性而不被推薦使用,但是在這種情況下可以放心使用正規表示式。

使用正規表示式

Python 的內建模組 re 具有一種可用於這種情況的 split() 方法。

讓我們使用基本的 a 或 b 正規表示式(a|b)來分隔多個定界符。

import re

text = "python is, an easy;language; to, learn."
print(re.split('; |, ', text))

輸出:

['python is', 'an easy;language', 'to', 'learn.']

Wikipedia 頁面所述,正規表示式使用 IEEE POSIX 作為其語法的標準。通過引用此標準,我們可以管理幾種其他方式來編寫符合用例的正規表示式。

無需使用豎線分隔符(|)來定義分隔符,我們可以使用正規表示式中提供的 Range([])語法實現相同的結果。你可以通過在方括號內提供正規表示式可以匹配的字元範圍。

因此,當指定正規表示式的模式時,我們可以簡單地在方括號內提供分號和逗號,以及一個額外的空格 [[;,]),這將導致正規表示式與具有[分號或逗號]和尾隨空格。

import re

text = "python is, an easy;language; to, learn."
print(re.split("[;,] ", text))

建立一個函式

前面提到的正規表示式僅限於硬編碼的分隔符集。稍後在進行定界符修改時,這可能會帶來麻煩,並且還會限制其在程式碼其他部分的可重用性。因此,最好使用最佳實踐來考慮使程式碼更加通用和可重用。因此,為了安全起見,讓我們將該邏輯編碼到 Python 函式中。

import re
text = "python is, an easy;language; to, learn."
separators = "; ", ", "

def custom_split(sepr_list, str_to_split):
    # create regular expression dynamically
    regular_exp = '|'.join(map(re.escape, sepr_list))
    return re.split(regular_exp, str_to_split)

print(custom_split(separators, text))

使用字串函式

如果你想避免使用正規表示式,或者不必為了拆分字串而在專案中引入新模組,則可以使用 replace()split() 方法出現在字串模組中本身達到相同的結果。

text = "python is, an easy;language; to, learn."

# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = text.replace("; ", ", ")

print(text_one_delimiter.split(", "))

首先,我們用其他定界符替換逗號中所有出現的分號,後跟空格 (; ),該分隔符是逗號,後跟空格 (, )。這樣,我們可以將字串拆分限制為一個定界符,在這種情況下,它是一個逗號,後跟一個空格 (, )

現在,我們可以使用 Python 字串模組內建的簡單 split() 函式安全地拆分修改後的字串,以得到相同的結果。

請注意,這次我們尚未將任何新模組匯入程式碼中以實現結果。

具有多個定界符的 Python 拆分字串

參考下面提到的文字。

text = "python is# an% easy;language- to, learn."

對於此示例,我們需要在所有例項上將其分割為文字具有任何字元 # % ; - ,,後跟一個空格。

正規表示式

在這種情況下,我們可以在定義正規表示式時輕鬆新增其他分隔符。

import re

text = "python is# an% easy;language- to, learn."
print(re.split('; |, |# |% |- ', text))

輸出:

['python is', 'an', 'easy;language', 'to', 'learn.']

作為一個函式

同樣在這種情況下,我們可以簡單地使用我們之前使用的帶有兩個定界符的程式碼,只需將所有其他分隔符新增到 separators 變數中即可。

import re
text = "python is# an% easy;language- to, learn."
separators = "; ", ", ", "# ", "% ", "- "

def custom_split(sepr_list, str_to_split):
    # create regular expression dynamically
    regular_exp = '|'.join(map(re.escape, sepr_list))
    return re.split(regular_exp, str_to_split)

print(custom_split(separators, text))

使用字串函式

與我們之前使用兩個定界符處理它的方式類似,我們可以使用 replace()split() 函式也可以解決此問題。

text = "python is, an easy;language; to, learn."

# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = text.replace("# ", ", ").replace("% ", ", ").replace("; ", ", ").replace("- ", ", ")

print(text_one_delimiter.split(", "))

輸出:

['python is', 'an easy;language', 'to', 'learn.']

應該注意的是,在這種情況下,當用於更高的定界符計數時,不建議使用此方法。由於在這種情況下,必須多次使用字串 replace() 方法才能對字串進行多次遍歷,因此最終將導致不希望的效能峰值,使用正規表示式可以輕鬆避免。

相關文章 - Python String