天天看點

文本處理利器:Python正規表達式的9個實用案例

文本處理利器:Python正規表達式的9個實用案例

在軟體開發或資料開發過程中,處理和分析文本資料是一項至關重要的技能。無論是資料清洗、資訊提取還是日志分析,正規表達式(Regular Expression)都扮演着不可或缺的角色。它是一種強大的工具,通過簡潔而優雅的模式比對語言,可以有效地搜尋、替換和解析文本。盡管正規表達式看似複雜,但一旦掌握,其應用将極大地提高工作效率,使複雜的文本處理任務變得輕松自如。

然而,要真正掌握正規表達式,僅僅了解其文法和基本規則是不夠的。實踐出真知,隻有通過具體的執行個體操作,才能深入了解其強大之處并靈活運用。接下來我們介紹九個Python 正規表達式的示例,帶您一步步探索正規表達式的魅力。從基礎的字元串比對到複雜的文本解析,每個案例都旨在幫助您在實踐中掌握這項重要的技能,讓您在處理文本時如虎添翼。

示例一:驗證郵箱位址

驗證郵箱位址的有效性是正規表達式的經典用例。以下是一個示例程式:

import re


def val_email(email):
    pattern = r"^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,}#34;
    if re.match(pattern, email):
        print("有效的email")
    else:
        print("無效的email!!")


val_email(email="[email protected]")
val_email(email="snb/smartnotebook.tech")
val_email(email="[email protected]")           
文本處理利器:Python正規表達式的9個實用案例

在這個例子中,使用了 Python 的 re 子產品來編譯一個比對有效郵箱位址格式的正規表達式模式。然後,使用它的 match() 函數來檢查 email 變量是否符合該模式。

在這個正則模式中,有幾個關鍵點:

  • 使用 [] 來表示一個範圍。例如,[a-zA-Z0-9] 可以比對 0 到 9 之間的數字,A 到 Z 之間的大寫字母,或 a 到 z 之間的小寫字母。
  • ^ 表示行的開頭。在這個的例子中,用它來確定文本必須以 [a-zA-Z0-9] 開頭。
  • $ 表示行的結尾。
  • \ 用來轉義特殊字元(允許在示例中比對像 . 這樣的字元)。
  • {n,m} 文法用來比對前一個正規表達式的 n 到 m 次重複。使用了 {2,},這意味着前面的部分 [a-zA-Z] 應至少重複 2 次。這就是為什麼 “[email protected]” 被識别為無效郵箱位址的原因。
  • + 表示比對前一個正規表達式的 1 次或多次重複。例如,ab+ 将比對一個 a 後跟任意數量的 b。

這個經典例子展示了在 Python 中使用正規表達式的一些基本文法。實際上,Python 的 re 子產品是一顆隐藏的寶石,可以從中使用許多更多的技巧。

示例二:從字元串中提取數字

要從一段長文本中找到一些特殊字元,最直接的想法是使用 for 循環周遊所有字元并找到需要的字元。但實際上并不需要使用任何循環。正規表達式天生就是作為過濾器使用的。

import re

def extract_numbers(text):
    pattern = r"\d+"
    return re.findall(pattern, text)


print(extract_numbers("There are over 1000 views of Snb's articles."))           
文本處理利器:Python正規表達式的9個實用案例

如上所示,re.findall() 函數接收一個正規表達式和一個文本,可以友善地幫助找到所有需要的字元。\d 用于在正規表達式中比對一個數字。

示例三:驗證電話号碼

以下示例也是利用 \d 來檢查有效的電話号碼:

import re


def is_valid_phone_number(phone_number):
    pattern = r"^\d{3}-\d{4}-\d{4}#34;
    return bool(re.match(pattern, phone_number))


print(is_valid_phone_number("137-1234-5678"))
print(is_valid_phone_number("13712345678"))           
文本處理利器:Python正規表達式的9個實用案例

除了 \d 外,還在正規表達式中使用了 ^、$ 和 {n} 文法來確定字元串是一個有效的電話号碼。

示例四:将文本分割為單詞

在日常程式設計中,将長文本分割為單獨的單詞是另一個常見的需求。借助于 re 子產品的 split() 函數,我們可以輕松完成這個任務:

print(re.split(r'\s+', 'a b   c'))


print( re.split(r'[\s\,]+', 'a,b, c  d'))


print(re.split(r'[\s\,\;]+', 'a,b;; c  d'))           
文本處理利器:Python正規表達式的9個實用案例

如上代碼所示,使用 \s 來在正規表達式中比對空格。

示例五:使用正規表達式查找并替換文本

在使用正規表達式從文本中找到特殊字元後,我們可能需要将它們替換為新的字元串。re 子產品中的 sub() 函數使得這一過程非常順暢:

import re


text = """SmartNotebook is a modern, 
          enterprise-grade notebook designed 
          for data analysis/data science platform."""
pattern = r"book"
replacement = "Book"


new_text = re.sub(pattern, replacement, text)
print(new_text)           
文本處理利器:Python正規表達式的9個實用案例

如上所示,隻需向 sub() 函數傳遞三個參數:模式(pattern)、替換字元串(replacement)和原始文本。執行後,它将傳回一個新的文本。

示例六:重新編譯 Python 中的正規表達式

在 Python 中使用正規表達式比對字元串時,通常需要兩個步驟:

  1. 編譯正規表達式。
  2. 使用編譯後的正規表達式來比對字元串。

是以,如果一個正規表達式需要重複使用,每次都重新編譯可能會造成資源浪費。為了避免這種情況,Python 允許我們預先編譯一次正規表達式,然後在後續的比對中重複使用已編譯的對象。這樣可以顯著提高性能和效率。

import re
re_numbers = re.compile(r'^\d+#39;)
print(re_numbers.match('123'))
print(re_numbers.match('SmartNotebook'))           
文本處理利器:Python正規表達式的9個實用案例

如上例所示,示範了如何使用 re 子產品的 compile() 函數預先編譯正規表達式,并在稍後使用它。隻要字元串不能比對正規表達式,match() 函數就會傳回 None。

示例七:提取和操作文本的子内容

group() 方法是 Python re 子產品中的一個函數,用于傳回正則比對對象的一個或多個比對的子組。它非常友善用于提取文本的不同部分。

例如,以下代碼展示了如何提取以“HH”格式表示的時間字元串的兩個部分:

import re


time='18:05'
matched = re.match(r'^([0-1][0-9]|2[0-3])\:([0-5][0-9])#39;, time)


print(matched.groups())
print(matched.group())
print(matched.group(0)) 
print(matched.group(1))
print(matched.group(2))           
文本處理利器:Python正規表達式的9個實用案例

如上所示,group(0) 傳回原始字元串。然後 group(1) 和 group(2) 分别傳回比對字元串的第一部分和第二部分。

示例八:命名組用于提取子内容

當子組數量較多時,程式中的數字會使代碼難以了解。是以,Python 提供了命名組的技巧來提取子内容:可以使用命名組捕獲比對字元串的特定部分,而無需使用編号捕獲組。這樣可以使代碼更易讀和維護。以下是一個示例:

import re


text = "SmartNotebook, age 2"
pattern = r"(?P<name>\w+),\sage\s(?P<age>\d+)"
match = re.search(pattern, text)
print(match.group("name"))  
print(match.group("age"))           
文本處理利器:Python正規表達式的9個實用案例

如上所示,命名組的關鍵文法是 ?P<xxx>。它定義了相應組的名稱,可以使用 group() 函數基于這個名稱來提取内容。

示例九:使用 VERBOSE 标志使正規表達式更易讀

在一些複雜的場景中,正規表達式可能變得越來越複雜和難以了解。肯定需要一種方法使其更整潔和清晰。這時就可以使用 re.VERBOSE 技巧。

import re


text = "SmartNotebook, [email protected], 198-2133-7583"
pattern = r"""
    (?P<name>\w+),\s
    (?P<email>\w+@\w+\.\w+),\s
    (?P<phone>\d{3}-\d{4}-\d{4})
"""


match = re.search(pattern, text, re.VERBOSE)
if match:
    print(match.group("name"))
    print(match.group("email"))
    print(match.group("phone"))           
文本處理利器:Python正規表達式的9個實用案例

如上所示,可以将長的正規表達式拆分為多行,以提高可讀性。隻要在 re.search() 函數中有 re.VERBOSE 标志,它就可以像往常一樣被正确識别。

在軟體開發和資料進行中,文本資料的處理和分析是至關重要的技能。正規表達式在這一過程中扮演着不可或缺的角色,通過簡潔的模式比對語言,能夠高效地搜尋、替換和解析文本。掌握正規表達式不僅提升工作效率,還能使複雜的文本處理任務變得輕松。通過執行個體學習,從驗證郵箱位址到提取和操作文本的子内容,每個示例都幫助深入了解并靈活運用這一強大工具。

繼續閱讀