20個Python 正則表達式應用與技巧

来源:https://www.cnblogs.com/huaweiyun/p/18130446
-Advertisement-
Play Games

本文分享自華為雲社區《Python 正則表達式大揭秘應用與技巧全解析》,作者:檸檬味擁抱。 Python 中的 re 模塊是用於處理正則表達式的強大工具。正則表達式是一種用來匹配字元串的模式,它可以在文本中搜索和匹配特定的字元串模式。在本文中,我們將探討 Python 中 re 模塊的應用和一些技巧 ...


本文分享自華為雲社區《Python 正則表達式大揭秘應用與技巧全解析》,作者:檸檬味擁抱。

Python 中的 re 模塊是用於處理正則表達式的強大工具。正則表達式是一種用來匹配字元串的模式,它可以在文本中搜索和匹配特定的字元串模式。在本文中,我們將探討 Python 中 re 模塊的應用和一些技巧,幫助您更好地理解和利用正則表達式。

1. 導入 re 模塊

在開始之前,首先要確保已經導入了 re 模塊:

import re

2. 使用 re 模塊進行匹配

以下是一個簡單的示例,演示如何使用 re 模塊在字元串中查找特定模式的匹配項:

text = "The quick brown fox jumps over the lazy dog"

# 使用 re 模塊查找匹配項
matches = re.findall(r'\b\w{3}\b', text)

print(matches)  # 輸出匹配的單詞列表

在上面的示例中,我們使用了 \b\w{3}\b 這個正則表達式來匹配長度為3的單詞。\b 表示單詞的邊界,\w{3} 表示匹配三個字母字元。re.findall() 函數返回所有匹配的結果。

3. 使用分組

分組是正則表達式中的一個強大功能,它允許您對匹配的部分進行分組處理。以下是一個示例,演示如何使用分組從文本中提取出郵件地址:

text = "Contact us at: [email protected], [email protected]"

# 使用分組提取郵件地址
emails = re.findall(r'([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})', text)

print(emails)  # 輸出提取的郵件地址列表

在上面的示例中,([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}) 是一個匹配郵件地址的正則表達式。其中,() 將整個郵件地址作為一個分組,使得 re.findall() 函數只返回匹配的郵件地址部分。

4. 替換文本中的字元串

re 模塊還提供了替換功能,允許您使用正則表達式來替換文本中的特定字元串。以下是一個示例,演示如何將文本中的所有數字替換為 “X”:

text = "There are 123 apples and 456 oranges"

# 使用 re.sub() 函數替換文本中的數字為 "X"
new_text = re.sub(r'\d+', 'X', text)

print(new_text)  # 輸出替換後的文本

在上面的示例中,re.sub(r'\d+', 'X', text) 使用正則表達式 \d+ 匹配一個或多個數字,並將其替換為 “X”。

5. 使用編譯的正則表達式

在處理大量文本時,編譯正則表達式可以提高匹配效率。以下是一個示例,演示如何使用編譯後的正則表達式進行匹配:

pattern = re.compile(r'\bpython\b', re.IGNORECASE)

text = "Python is a popular programming language"

# 使用編譯後的正則表達式進行匹配
match = pattern.search(text)

if match:
    print("Found")
else:
    print("Not found")

在上面的示例中,re.compile() 函數編譯了一個不區分大小寫的正則表達式,並且使用 search() 方法進行匹配。

通過掌握以上技巧,您可以更加靈活和高效地使用 Python 中的 re 模塊進行正則表達式的處理。正則表達式是一項強大的技能,在處理文本和字元串時非常有用。

6. 使用預定義字元類

正則表達式中有一些預定義的字元類,可以簡化匹配特定類型字元的操作。以下是一些常用的預定義字元類及其示例用法:

  • \d:匹配任意數字字元。
  • \w:匹配任意字母、數字或下劃線字元。
  • \s:匹配任意空白字元(空格、製表符、換行符等)。
text = "The code is 1234 and the password is abcd_123"

# 使用預定義字元類匹配數字和字母密碼
codes = re.findall(r'\b\w+\b', text)

print(codes)  # 輸出匹配的代碼和密碼列表

7. 使用量詞

量詞用於指定匹配字元或組的數量。以下是一些常用的量詞及其示例用法:

  • *:匹配前一個字元零次或多次。
  • +:匹配前一個字元一次或多次。
  • ?:匹配前一個字元零次或一次。
  • {n}:匹配前一個字元恰好 n 次。
  • {n,}:匹配前一個字元至少 n 次。
  • {n,m}:匹配前一個字元至少 n 次,但不超過 m 次。
text = "The Python programming language is widely used for data analysis"

# 使用量詞匹配至少包含兩個字母的單詞
words = re.findall(r'\b\w{2,}\b', text)

print(words)  # 輸出匹配的單詞列表

8. 使用錨點

錨點用於匹配字元串的邊界,而不是實際的字元。以下是一些常用的錨點及其示例用法:

  • ^:匹配字元串的開頭。
  • $:匹配字元串的結尾。
  • \b:匹配單詞的邊界。
text = "Python is a great language for both beginners and experts"

# 使用錨點匹配以 Python 開頭的句子
sentence = re.findall(r'^Python.*', text)

print(sentence)  # 輸出匹配的句子

9. 貪婪與非貪婪匹配

在正則表達式中,量詞預設是貪婪的,即它們會儘可能匹配最長的字元串。但有時候我們希望匹配最短的字元串,這時候就需要使用非貪婪匹配。在量詞後面加上 ? 符號可以將其變為非貪婪匹配。

text = "Python is a powerful programming language"

# 使用貪婪匹配查找 "p""g" 之間的內容
greedy_match = re.findall(r'p.*g', text)

# 使用非貪婪匹配查找 "p""g" 之間的內容
non_greedy_match = re.findall(r'p.*?g', text)

print("貪婪匹配:", greedy_match)  # 輸出貪婪匹配結果
print("非貪婪匹配:", non_greedy_match)  # 輸出非貪婪匹配結果

10. 使用後向引用

後向引用允許您在正則表達式中引用先前匹配的內容。這在需要匹配重覆的模式時非常有用。

text = "apple apple orange orange"

# 使用後向引用匹配重覆的單詞
duplicates = re.findall(r'(\b\w+\b) \1', text)

print("重覆的單詞:", duplicates)  # 輸出匹配到的重覆單詞列表

11. 多行匹配

有時候我們需要匹配多行文本,而不僅僅是單行。這時可以使用 re.MULTILINE 標誌來啟用多行匹配模式。

text = """Python is a popular programming language.
It is used for web development, data analysis, and more.
Python has a simple syntax and is easy to learn."""

# 使用多行匹配模式匹配以大寫字母開頭的句子
sentences = re.findall(r'^[A-Z].*$', text, re.MULTILINE)

print("以大寫字母開頭的句子:", sentences)  # 輸出匹配到的句子列表

12. 使用命名分組

在複雜的正則表達式中,為了增加可讀性和維護性,可以使用命名分組來標識匹配的部分。

text = "John has 5 apples, Mary has 3 oranges"

# 使用命名分組提取人名和水果數量
matches = re.findall(r'(?P<name>\w+) has (?P<quantity>\d+) \w+', text)

for match in matches:
    print("Name:", match['name'], "- Quantity:", match['quantity'])

以上是一些高級技巧,可以進一步擴展您對正則表達式的應用和理解。通過不斷練習和嘗試,您將能夠更靈活地應用正則表達式來解決各種文本處理問題。

13. 使用預搜索斷言

預搜索斷言允許您在匹配字元串時,指定字元串之前或之後的條件。它不會消耗匹配的字元,僅用於指定條件。

text = "apple banana orange grape"

# 使用預搜索斷言匹配出包含 "apple" 之後的所有水果
result = re.findall(r'(?<=apple\s)(\w+)', text)

print("包含 'apple' 之後的水果:", result)  # 輸出匹配到的水果列表

14. 使用肯定與否定預搜索斷言

肯定預搜索斷言 (?=...) 匹配滿足條件的字元串,而否定預搜索斷言 (?!) 匹配不滿足條件的字元串。

text = "Python is a powerful programming language"

# 使用肯定預搜索斷言匹配包含 "is" 的單詞
positive_result = re.findall(r'\b\w+(?= is\b)', text)

# 使用否定預搜索斷言匹配不包含 "is" 的單詞
negative_result = re.findall(r'\b\w+(?! is\b)', text)

print("肯定預搜索斷言:", positive_result)  # 輸出匹配到的單詞列表
print("否定預搜索斷言:", negative_result)  # 輸出匹配到的單詞列表

15. 使用 re.finditer() 函數

re.finditer() 函數與 re.findall() 函數類似,但它返回一個迭代器,可以逐個訪問匹配對象。

text = "Python is a powerful programming language"

# 使用 re.finditer() 函數匹配所有單詞
matches_iter = re.finditer(r'\b\w+\b', text)

for match in matches_iter:
    print(match.group())  # 輸出匹配到的單詞

16. 使用 re.split() 函數

除了匹配和查找文本模式,re 模塊還提供了 re.split() 函數,用於根據正則表達式模式拆分字元串。

text = "apple,banana,orange,grape"

# 使用 re.split() 函數根據逗號拆分字元串
fruits = re.split(r',', text)

print("拆分後的水果列表:", fruits)  # 輸出拆分後的水果列表

17. 使用 re.sub() 函數的替換函數參數

re.sub() 函數的第二個參數可以是一個函數,用於處理匹配的結果後再替換。

def double(match):
    return str(int(match.group(0)) * 2)

text = "The numbers are 1, 2, 3, and 4"

# 使用替換函數參數將所有數字乘以2
new_text = re.sub(r'\d+', double, text)

print("替換後的文本:", new_text)  # 輸出替換後的文本

18. 使用 re.fullmatch() 函數

re.fullmatch() 函數用於檢查整個字元串是否完全匹配給定的模式。

pattern = re.compile(r'\d{4}-\d{2}-\d{2}')

date1 = "2022-01-15"
date2 = "15-01-2022"

# 使用 re.fullmatch() 函數檢查日期格式
match1 = pattern.fullmatch(date1)
match2 = pattern.fullmatch(date2)

if match1:
    print("日期格式正確")
else:
    print("日期格式錯誤")

if match2:
    print("日期格式正確")
else:
    print("日期格式錯誤")

19. 使用 re.IGNORECASE 標誌進行不區分大小寫匹配

在編譯正則表達式時,可以使用 re.IGNORECASE 標誌來進行不區分大小寫的匹配。

pattern = re.compile(r'python', re.IGNORECASE)

text = "Python is a powerful programming language"

# 使用不區分大小寫匹配模式查找 "Python"
match = pattern.search(text)

if match:
    print("Found")
else:
    print("Not found")

20. 使用 re.DEBUG 標誌進行正則表達式調試

在編譯正則表達式時,可以使用 re.DEBUG 標誌來輸出正則表達式的調試信息,以便更好地理解它的工作原理。

pattern = re.compile(r'\b\w{3}\b', re.DEBUG)

text = "The quick brown fox jumps over the lazy dog"

# 輸出編譯後的正則表達式調試信息
pattern.findall(text)

通過繼續學習和實踐這些高級的正則表達式技巧,您將能夠更好地應用正則表達式來處理各種文本匹配和處理任務,提高代碼的效率和可維護性。正則表達式是 Python 中強大而靈活的工具之一,對於處理字元串模式非常有用。

總結

通過本文的介紹,我們探索了 Python 中 re 模塊的應用與技巧,使您能夠更靈活和高效地處理正則表達式。我們從基礎的模式匹配開始,介紹瞭如何使用 re 模塊進行匹配、分組、替換等操作。隨後,我們深入探討了一些高級技巧,包括貪婪與非貪婪匹配、後向引用、多行匹配、預搜索斷言等,這些技巧可以幫助您更好地處理複雜的文本處理任務。此外,我們還介紹了一些實用的函數和標誌,如 re.split()re.sub() 的替換函數參數、re.fullmatch()re.IGNORECASEre.DEBUG 等,使您能夠更靈活地應用正則表達式解決實際問題。

掌握正則表達式是 Python 編程中非常重要的一部分,它能夠幫助我們更快地處理字元串模式匹配、文本提取等任務,提高代碼的效率和可維護性。通過不斷學習和實踐,您將能夠更深入地理解和應用正則表達式,解決各種文本處理問題,提升自己在 Python 編程中的技能水平。希望本文對您有所幫助,歡迎繼續探索和學習更多關於正則表達式的知識。

點擊關註,第一時間瞭解華為雲新鮮技術~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著B端業務快速發展,系統愈趨複雜。我們發起了B端架構升級專項,基於B端業務的特點,從研發規範建設、B端架構基建、系統架構升級和落地保障等多方面提升了B端的架構水平 ...
  • 問題背景 訪問某個 HTTP 功能變數名稱介面,偶發性超時,原因可能多種多樣,比如 DNS 解析問題、網路質量問題、對端服務負載問題等,在客戶端沒有良好埋點的情況下,排查起來比較費勁,只能挨個方向嘗試,這裡送大家一個小工具,可以快速採樣 DNS 解析延遲,快速確認是否是 DNS 解析問題。 使用演示 運行工 ...
  • 前端 https://blog.csdn.net/m0_37613503/article/details/128961447 資料庫 1.用戶表 CREATE TABLE `x_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varc ...
  • 1.VS上安裝Qt擴展 點擊菜單欄【擴展】->【管理擴展】,在搜索框搜索“Qt”, 點擊下載Qt Visual Studio Tools, 以2022版為例,需要關閉所有視窗才能執行安裝 關閉VS後,彈出安裝視窗,等待其安裝完成 2. 新建QT工程測試 等待安裝完成後,添加一個Qt Vertion後 ...
  • 隨著互聯網的迅猛發展,越來越多的應用場景需要進行用戶實名認證,其中手機號機主姓名核驗就是其中必不可少的一環。在電商、游戲、直播、金融等領域,用戶實名認證成為了一個重要的手段,以提高安全性和信任度。 近年來,隨著手機號的普及和使用頻率的增加,手機號的歸屬地信息也逐漸成為人們關註的焦點。手機號機主姓名核 ...
  • decltype關鍵字是C++11新標準引入的關鍵字,它和關鍵字auto的功能類似,也可以自動推導出給定表達式的類型,但它和auto的語法有些不同,這篇文章講解了decltype的使用場景以及和auto不同的地方,同時也講解了和auto結合使用的用法。 ...
  • 為了增加查詢的性能,MyBatis 提供了二級緩存架構,分為一級緩存和二級緩存。 這兩級緩存最大的區別就是:一級緩存是會話級別的,只要出了這個 SqlSession,緩存就沒用了。而二級緩存可以跨會話,多個會話可以使用相同的緩存! 一級緩存使用簡單,預設就開啟。二級緩存需要手動開啟,相對複雜,而且要 ...
  • 本文深入探討了Kubernetes Pod配置的實戰技巧和常見易錯點。 關註【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿裡雲認證的資深架構師,項目管理專業人士,上億營 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...