用於 Python 3 的 Re 模塊的文檔。 正則表達式的 Re 模塊

正則表達式是幾乎所有編程語言中非常流行的組件。 它們可幫助您快速訪問所需的信息。 特別是在需要處理文本時使用它們。 Python 默認帶有一個特殊的模塊。 re,它負責處理正則表達式。

今天我們將詳細討論它一般是什麼,如何使用它們以及如何使用模塊 re 會有所幫助。

正則表達式:簡介

正則表達式的用途是什麼? 幾乎所有的。 例如,這些:

  1. 需要文本驗證的 Web 應用程序。 一個典型的例子是在線郵件客戶端。
  2. 任何其他與文本、數據庫等相關的項目。

在開始解析語法之前,我們應該更詳細地了解庫運行的基本原理 re 總的來說,它通常有什麼好處。 我們還將提供來自實際實踐的示例,其中我們將描述它們的使用機制。 您可以創建這樣一個模板,適合您對文本執行各種操作。

Re 庫中的模板是什麼?

有了它,您可以搜索各種類型的信息,獲取對應的信息,以使其他功能更具適應性。 當然,還要處理這些數據。

例如,採用以下模板: s+. 它表示任何空格字符。 如果給它添加一個加號,則這意味著該模式包含多個空格。 它甚至可以匹配被調用的製表符 t+.

在使用它們之前,您需要導入庫 Re. 之後,我們使用一個特殊的命令來編譯模板。 這分兩步完成。

>>> 進口重新

>>> 正則表達式 = re.compile('s+')

具體來說,這段代碼執行編譯一個可以使用的模板的操作。 例如,搜索空格(一個或多個)。

使用正則表達式從不同的字符串中獲取單獨的信息

假設我們有一個包含以下信息的變量。

>>> text = “””100 INF 信息學

213 MAT數學  

156 ENG 英語»»»

它包含三個培訓課程。 它們中的每一個都由三個部分組成——編號、代碼和名稱。 我們看到這些詞之間的間隔是不同的。 怎麼做才能把這條線分成單獨的數字和單詞? 有兩種方法可以實現這一目標:

  1. 調用函數 重新分裂.
  2. 應用函數 分裂 對於 正則表達式.

這是一個使用我們變量的每個方法的語法的示例。

>>> re.split('s+', 文本)  

# 要么

>>> 正則表達式.split(文本)

輸出:['100', 'INF', 'Computer Science', '213', 'MAT', 'Math', '156', 'ENG', 'English']

一般來說,兩種方法都可以使用。 但實際上使用正則表達式比多次使用函數要容易得多。 重新分裂.

使用三個函數查找匹配項

假設我們只需要從字符串中提取數字。 為此需要做些什麼?

重新查找()

這是該功能的用例 找到所有(),它與正則表達式一起,允許您從文本變量中提取一個或多個數字的出現。

>>> 打印(文本)  

100 INF 信息學

213 MAT數學  

156 ENG 英語

>>> regex_num = re.compile('d+')  

>>> regex_num.findall(文本)  

['100', '213', '156']

與 d 符號一起,我們使用了一個模板,該模板絕對指示位於變量或文本中的任何數值。 由於我們在那裡添加了一個 +,這意味著必須至少存在一個數字。 

您還可以使用 * 符號來指定不需要數字就可以找到匹配項。

但在我們的例子中,由於我們使用了 +,我們提取了 找到所有() 文本中的 1 個或多個數字課程名稱。 因此,在我們的例子中,正則表達式充當函數的設置。

re.search() 對比 重新匹配()

正如您可以從函數的名稱中猜到的那樣,第一個在文本中搜索匹配項。 問:有什麼區別 找到所有? 關鍵是它返回一個與模式匹配的特定對象,而不是像前面的函數那樣以列表的形式返回整個找到的結果序列。

反過來, re.match 函數也是如此。 只是語法不同。 模板必須放在開頭。 

讓我們舉一個例子來說明這一點。

>>> # 創建一個帶文本的變量

>>> text2 = «»»INF 信息學

213 MAT數學156″»»  

>>> # 編譯正則表達式並尋找模式

>>> regex_num = re.compile('d+')  

>>> s = regex_num.search(text2)  

>>> print('第一個索引:', s.start())  

>>> print('最後一個索引:', s.end())  

>>> 打印(文本 2[s.start():s.end()]) 

第一指數:17 

最後指數:20

213

如果您想以不同的方式獲得類似的結果,可以使用該函數 團體().

用 Re 庫替換部分文本

要替換文本,請使用函數 re.sub()。 假設我們的課程列表發生了一些變化。 我們看到,在每個數字值之後,我們都有一個選項卡。 我們的任務是將所有這些序列組合成一行。 為此,我們需要替換錶達式 s+ 通過 

原文是:

# 創建一個帶有文本的變量

>>> text = “””100 INF t 信息學

213 MAT 數學  

156 ENG t 英語»»»  

>>> 打印(文本)  

100信息 信息學

213馬特 數學  

156埃昂 英文

為了執行所需的操作,我們使用了以下代碼行。

# 用 1 替換一個或多個空格

>>> 正則表達式 = re.compile('s+')  

>>> print(regex.sub(' ', text))  

結果,我們有一條線。 

101 COM 計算機 205 MAT 數學 189 ENG 英語

現在考慮另一個問題。 我們沒有面臨放置空間的任務。 對我們來說更重要的是所有課程名稱都以新行開頭。 為此,使用另一個表達式,向異常添加換行符。 這是什麼表情?

電子圖書館 Re 支持負匹配等功能。 它與直接的不同之處在於它在斜線之前包含一個感嘆號。 也就是說,如果我們需要跳過換行符,那麼我們需要寫 !n 而不是 n。

我們得到以下代碼。

# 刪除除換行符以外的所有空格  

>>> 正則表達式 = re.compile('((?!n)s+)')  

>>> print(regex.sub(' ', text))  

100 INF 信息學

213 MAT數學  

156 ENG 英語

什麼是正則表達式組?

借助正則表達式組,我們可以以單獨元素的形式獲得所需的對象,而不是一行。 

假設我們需要獲取課程編號、代碼和名稱,而不是在一行中,而是作為單獨的元素。 要完成任務,您將需要編寫大量不必要的代碼行。 

事實上,任務可以大大簡化。 您可以為所有條目編譯模板,只需指定需要從括號中獲取的數據。

會有非常少的行數。 

# 創建課程文本模板組並提取它們

>>> course_pattern = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'  

>>> re.findall(課程模式,文本)  

[('100', 'INF', '計算機科學'), ('213', 'MAT', '數學'), ('156', 'ENG', 'English')]

“貪婪”匹配的概念

按照標準,正則表達式被編程為提取最大數量的匹配數據。 即使你需要的更少。

讓我們看一個示例 HTML 代碼,我們需要在其中獲取標籤。

>>> text = “貪婪正則表達式匹配示例”  

>>> re.findall('', 文本)  

['貪婪正則表達式匹配示例']

Python 沒有隻提取一個標籤,而是得到了整個字符串。 這就是為什麼它被稱為貪婪。

怎麼做才能只得到標籤? 在這種情況下,您需要使用惰性匹配。 要指定這樣的表達式,請在模式的末尾添加一個問號。

您將獲得以下代碼和解釋器的輸出。

>>> re.findall('', 文本)  

[,”]

如果只需要獲取第一次遇到的事件,則使用該方法 搜索 ().

re.search('', text).group()  

然後只會找到開始標籤。

流行的表達模板

這是一個包含最常用的正則表達式模式的表。

用於 Python 3 的 Re 模塊的文檔。 正則表達式的 Re 模塊

結論

我們只考慮了使用正則表達式的最基本方法。 無論如何,您已經看到了它們的重要性。 在這裡,是否需要解析整個文本或其單個片段,是否需要分析社交網絡上的帖子或收集數據以便以後處理它,都沒有區別。 正則表達式是這方面的可靠幫手。

它們允許您執行以下任務:

  1. 指定數據的格式,例如電子郵件地址或電話號碼。
  2. 獲取一個字符串並將其拆分為幾個較小的字符串。
  3. 對文本執行各種操作,例如搜索、提取必要的信息或替換部分字符。

正則表達式還允許您執行重要的操作。 乍一看,掌握這門科學並不容易。 但在實踐中,一切都是標準化的,所以弄清楚一次就足夠了,之後這個工具不僅可以在 Python 中使用,還可以在任何其他編程語言中使用。 甚至 Excel 也使用正則表達式來自動處理數據。 所以不使用這個工具是一種罪過。

發表評論