Python中的re庫詳細用法與代碼解析

目錄

1. 前言

2. 正則表達式的基本概念

2.1 什么是正則表達式?

2.2 常用元字符

3. re庫的適應場景

3.1?驗證用戶輸入

3.2?從文本中提取信息

3.3?文本替換與格式化

3.4?分割復雜字符串

3.5?數據清洗與預處理

4. re庫的核心功能詳解

4.1?re.match():從字符串開頭匹配

4.2?re.search():在字符串中搜索匹配

4.3?re.findall():查找所有匹配項

4.4?re.finditer():返回迭代器對象

5.5?re.sub():替換匹配項

4.6?re.split():分割字符串

4.7?編譯正則表達式

4.8?使用組提取特定信息

4.9?非貪婪匹配

5. 常見正則表達式模板

5.1?驗證郵箱

5.2?驗證手機號

5.3?匹配URL

5.4?提取日期

5.5?匹配HTML標簽

6. 性能優化技巧

6.1 編譯正則表達式

6.2?使用非捕獲組

6.3?選擇合適的匹配模式

6.4?預處理正則表達式

7. 總結


1. 前言

在數據處理、文本分析和自動化開發等場景中,文本處理是Python開發者最常面對的任務之一。想象一下,當你需要從用戶輸入中驗證郵箱格式、從日志文件中提取錯誤信息、或從網頁HTML中抓取特定數據時,手動逐字符檢查和提取效率低且容易出錯。Python的re庫提供了強大的正則表達式支持,它就像一把瑞士軍刀,能夠優雅地解決各種復雜文本處理任務。本文將深入淺出地介紹re庫的基本概念、適應場景和實戰技巧,幫助你掌握這門文本處理的藝術。

2. 正則表達式的基本概念

2.1 什么是正則表達式?

正則表達式(Regular Expression,簡稱Regex)是一種文本模式描述語言,用于定義具有特定格式的字符串規則。它如同數學中的方程式,但操作對象是文本模式而非數值。

例如:

  • a 匹配字符a

  • a+ 匹配一個或多個連續的a

  • a? 匹配零個或一個a

  • a|b 匹配a或b

  • ^start 匹配以start開頭的字符串

  • end$ 匹配以end結尾的字符串

2.2 常用元字符

正則表達式的強大來自于元字符(具有特殊含義的字符),以下是常用元字符及其含義:

元字符含義示例
.匹配任意單個字符(除換行符)a.b?匹配 aXb
*匹配前面的子表達式0次或多次ab*?匹配 a, ab, abb
+匹配前面的子表達式1次或多次ab+?匹配 ab, abb
?匹配前面的子表達式0次或1次ab?c?匹配 ac 或 abc
[]匹配指定范圍內的任意字符[a-z]?匹配小寫字母
^匹配字符串開頭或排除指定字符^hello?匹配以hello開頭的字符串
$匹配字符串結尾world$?匹配以world結尾的字符串
\d匹配任意數字\d{3}?匹配三位數字
\w匹配字母、數字或下劃線\w+?匹配連續的單詞字符
\s匹配任意空白字符\s+?匹配一個或多個空格

3. re庫的適應場景

3.1?驗證用戶輸入

import redef validate_email(email):pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'return re.match(pattern, email) is not Noneprint(validate_email("test@example.com"))  # True
print(validate_email("invalid_email@"))    # False

3.2?從文本中提取信息

text = "Contact us at contact@example.com or support@site.org"# 提取所有郵箱地址
emails = re.findall(r'[\w.-]+@[\w.-]+', text)
print(emails)  # ['contact@example.com', 'support@site.org']

3.3?文本替換與格式化

text = "The price is $100.50 and the discount is $20"# 將價格轉換為中文格式
formatted_text = re.sub(r'\$(\d+\.?\d*)', r'¥\1', text)
print(formatted_text)  # The price is ¥100.50 and the discount is ¥20

3.4?分割復雜字符串

text = "apple,orange;banana grape"# 使用多種分隔符分割
fruits = re.split(r'[;,,\s]\s*', text)
print(fruits)  # ['apple', 'orange', 'banana', 'grape']

3.5?數據清洗與預處理

text = "  Hello   World  This is   Python  "# 去除多余空格并分割單詞
clean_words = re.sub(r'\s+', ' ', text).strip().split()
print(clean_words)  # ['Hello', 'World', 'This', 'is', 'Python']

4. re庫的核心功能詳解

4.1?re.match():從字符串開頭匹配

pattern = r'^Hello'
text = "Hello World!"match_obj = re.match(pattern, text)
if match_obj:print("Match found:", match_obj.group())  # Match found: Hello
else:print("No match")

4.2?re.search():在字符串中搜索匹配

pattern = r'World'
text = "Hello World!"search_obj = re.search(pattern, text)
if search_obj:print("Search found:", search_obj.group())  # Search found: World
else:print("Not found")

4.3?re.findall():查找所有匹配項

text = "The rain in Spain stays mainly in the plain"
pattern = r'ain'matches = re.findall(pattern, text)
print(matches)  # ['ain', 'ain', 'ain']

4.4?re.finditer():返回迭代器對象

text = "The rain in Spain stays mainly in the plain"
pattern = r'ain'for match in re.finditer(pattern, text):print(f"Found '{match.group()}' at position {match.start()}")

5.5?re.sub():替換匹配項

text = "Hello World"
pattern = r'World'
replacement = "Python"new_text = re.sub(pattern, replacement, text)
print(new_text)  # Hello Python

4.6?re.split():分割字符串

text = "apple, orange; banana grape"
pattern = r'[;,]\s*'result = re.split(pattern, text)
print(result)  # ['apple', 'orange', 'banana grape']

4.7?編譯正則表達式

pattern = re.compile(r'\d+')text1 = "There are 123 apples"
text2 = "And 456 oranges"print(pattern.findall(text1))  # ['123']
print(pattern.findall(text2))  # ['456']

4.8?使用組提取特定信息

text = "John Doe: john.doe@example.com"pattern = r'(\w+) (\w+): (\S+)'match = re.match(pattern, text)
if match:first_name, last_name, email = match.groups()print(f"First Name: {first_name}")  # First Name: Johnprint(f"Last Name: {last_name}")    # Last Name: Doeprint(f"Email: {email}")            # Email: john.doe@example.com
  • (\S+): 匹配冒號后面的非空白字符(如 john.doe@example.com),捕獲為 email

4.9?非貪婪匹配

text = "<div><p>Hello</p><span>World</span></div>"# 貪婪匹配
print(re.findall(r'<div>.*</div>', text))  # ['<div><p>Hello</p><span>World</span></div>']# 非貪婪匹配
print(re.findall(r'<div>.*?</div>', text))  # ['<div><p>Hello</p><span>World</span>']

5. 常見正則表達式模板

5.1?驗證郵箱

email_pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'

5.2?驗證手機號

phone_pattern = r'^1[3-9]\d{9}$'  # 中國手機號
  1. \d{9}:匹配 9 個任意數字。\d 表示任意一個數字(0-9),{9} 表示前面的表達式(這里是指 \d)必須連續出現 9 次。

5.3?匹配URL

url_pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'  # 簡化版URL匹配

5.4?提取日期

date_pattern = r'\b(19|20)\d\d[-/.](0[1-9]|1[0-2])[-/.](0[1-9]|[12][0-9]|3[01])\b'

5.5?匹配HTML標簽

html_tag_pattern = r'<(\w+)(?:\s+[^>]*)?>.*?</\1>'  # 匹配成對標簽

6. 性能優化技巧

6.1 編譯正則表達式

# 不編譯
for text in large_text_list:re.findall(pattern, text)# 編譯后(推薦)
compiled_pattern = re.compile(pattern)
for text in large_text_list:compiled_pattern.findall(text)

6.2?使用非捕獲組

# 普通組
pattern = r'(\d+)-(\d+)'# 非捕獲組(提高性能)
pattern = r'\d+-(?:\d+)'

6.3?選擇合適的匹配模式

# 貪婪匹配可能導致性能問題
pattern = r'.*'# 使用更精確的模式
pattern = r'\w+'

6.4?預處理正則表達式

# 預處理
patterns = {'email': re.compile(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'),'phone': re.compile(r'^1[3-9]\d{9}$')
}# 使用時直接調用
if patterns['email'].match(user_input):# 處理郵箱pass

7. 總結

Python的re庫為我們提供了強大的文本處理能力,通過正則表達式,我們可以輕松應對各種復雜的文本匹配、提取、替換和驗證任務。從簡單的字符串檢查到復雜的模式匹配,re庫都能提供高效的解決方案。在實際開發中,合理使用正則表達式可以大大簡化代碼邏輯,提高程序的魯棒性和可維護性。

然而,正則表達式的強大也意味著復雜性,設計不當的正則表達式可能導致性能問題甚至安全漏洞(如ReDoS攻擊)。因此,在使用re庫時,我們應遵循以下原則:

  1. 務必保持正則表達式的可讀性,必要時添加注釋

  2. 對于復雜的正則表達式,考慮使用reVERBOSE模式添加注釋

  3. 測試各種可能的輸入情況,確保正則表達式的行為符合預期

  4. 在處理大量數據時,注意性能優化,編譯正則表達式并合理使用非捕獲組

掌握re庫不僅是一項技術技能,更是一種思維模式。它教會我們如何用模式化的思維分析問題、如何用最簡潔的方式表達復雜的規則、以及如何在精確性和性能之間找到平衡。希望本文能幫助你深入理解Python的re庫,讓你在文本處理的戰場上如虎添翼。我是橙色小博,關注我,一起在人工智能領域學習進步!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79445.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯2025年第十六屆省賽真題-水質檢測

C語言代碼&#xff1a; #include <stdio.h> #include <string.h>#define MAX_LEN 1000000int main() {char a[MAX_LEN 1], b[MAX_LEN 1];// 使用 scanf 讀取字符數組scanf("%s", a);scanf("%s", b);int ans 0;int pre -1;int state -1;i…

65.Three.js案例-使用 MeshNormalMaterial 和 MeshDepthMaterial 創建 3D 圖形

65.Three.js案例-使用 MeshNormalMaterial 和 MeshDepthMaterial 創建 3D 圖形 實現效果 在該案例中&#xff0c;Three.js 被用來創建一個包含多個 3D 對象的場景。其中包括&#xff1a; 圓環結&#xff08;TorusKnot&#xff09;立方體&#xff08;Box&#xff09;球體&…

Python學習筆記--Django的安裝和簡單使用(一)

一.簡介 Django 是一個用于構建 Web 應用程序的高級 Python Web 框架。Django 提供了一套強大的工具和約定&#xff0c;使得開發者能夠快速構建功能齊全且易于維護的網站。Django 遵守 BSD 版權&#xff0c;初次發布于 2005 年 7 月, 并于 2008 年 9 月發布了第一個正式版本 1…

《汽車噪聲控制》復習重點

題型 選擇 填空 分析 計算 第一章 噪聲定義 不需要的聲音&#xff0c;妨礙正常工作、學習、生活&#xff0c;危害身體健康的聲音&#xff0c;統稱為噪聲 噪聲污染 與大氣污染、水污染并稱現代社會三大公害 聲波基本概念 定義 媒質質點的機械振動由近及遠傳播&am…

冒泡排序的原理

冒泡排序是一種簡單的排序算法&#xff0c;它通過重復地遍歷待排序的列表&#xff0c;比較相鄰的元素并交換它們的位置來實現排序。具體原理如下&#xff1a; 冒泡排序的基本思想 冒泡排序的核心思想是通過相鄰元素的比較和交換&#xff0c;將較大的元素逐步“冒泡”到列表的…

前端npm包發布流程:從準備到上線的完整指南

無論是使用第三方庫還是創建和分享自己的工具&#xff0c;npm都為我們提供了一個強大而便捷的平臺&#xff0c;然而很多開發者在將自己的代碼發布到npm上時往往面臨各種困惑和挑戰&#xff0c;本篇文章將從準備工作到發布上線&#xff0c;探討如何讓npm包更易發布及避免常見的坑…

使用 CDN 在國內加載本地 PDF 文件并處理批注:PDF.js 5.x 實戰指南

PDF.js 是一個強大的開源 JavaScript 庫&#xff0c;用于在 Web 瀏覽器中渲染 PDF 文件。它由 Mozilla 開發&#xff0c;能夠將 PDF 文檔繪制到 HTML5 Canvas 或 SVG 上&#xff0c;無需任何本機代碼或瀏覽器插件。對于許多需要在網頁中展示 PDF 內容的應用場景來說&#xff0c…

網絡化:DevOps 工程的必要基礎(Networking: The Essential Foundation for DevOps Engineering)

李升偉 編譯 理解網絡化基礎知識 你是否曾想過是什么真正讓卓越的DevOps工程師與眾人區別開來&#xff1f;答案是網絡化。是的&#xff0c;對網絡的基本理解不僅僅是有幫助的——它是絕對必要的。在當今以微服務、容器和分布式系統為主宰的互聯互通世界中&#xff0c;對網絡原…

C++基本知識 —— 缺省參數·函數重載·引用

C基本知識 —— 缺省參數函數重載引用 1. 缺省參數2. 函數重載3. 引用3.1 引用的基礎知識3.2 引用的作用3.3 const 引用3.4 指針與引用的關系 1. 缺省參數 什么是缺省參數&#xff1f;缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數的時候&#xff0c;如…

Rust 官方文檔:人話版翻譯指南

鑒于大部分翻譯文檔都不太會說人話&#xff0c;本專欄主要內容為 rust 程序設計語言、rust 參考手冊、std 庫 等官方文檔的中譯中。

FlySecAgent:——MCP全自動AI Agent的實戰利器

最近&#xff0c;出于對人工智能在網絡安全領域應用潛力的濃厚興趣&#xff0c;我利用閑暇時間進行了深入研究&#xff0c;并成功開發了一款小型輕量化的AI Agent安全客戶端FlySecAgent。 什么是 FlySecAgent&#xff1f; 這是一個基于大語言模型和MCP&#xff08;Model-Contr…

實戰項目5(08)

目錄 任務場景一 【r1配置】 【r2配置】 【r3配置】 ???????任務場景二 【r1配置】 【r2配置】 ???????任務場景一 按照下圖完成網絡拓撲搭建和配置 任務要求&#xff1a; 通過在路由器R1、R2和R3上配置靜態路由&#xff0c;實現網絡中各終端PC能夠正常…

基于Kubernetes的Apache Pulsar云原生架構解析與集群部署指南(下)

文章目錄 k8s安裝部署Pulsar集群前期準備版本要求 安裝 Pulsar Helm chart管理pulsarClustersBrokersTopic k8s安裝部署Pulsar集群 前期準備 版本要求 Kubernetes 集群&#xff0c;版本 1.14 或更高版本Helm v3&#xff08;3.0.2 或更高版本&#xff09;數據持久化&#xff…

C35-數組和函數開發初見

一 數組作為函數的參數 用于傳遞數組中的某一個元素→意義不大 數組名當做函數實際參數 示例 代碼 #include <stdio.h>//封裝函數PrintArr void PrintArr(int arr[3]){int i;for(i0;i<3;i){printf("%d ",arr[i]);}putchar(\n);}//主函數 int main() { …

【小沐學GIS】基于C++繪制二維瓦片地圖2D Map(QT、OpenGL、GIS)

&#x1f37a;三維數字地球系列相關文章如下&#x1f37a;&#xff1a;1【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;OpenGL、glfw、glut、GIS&#xff09;第二期3【小沐學…

idea左側項目資源管理器不見了處理

使用idea誤觸導致&#xff0c;側邊欄和功能欄沒了&#xff0c;如何打開&#xff1f; 1.打開文件&#xff08;File&#xff09; 2. 打開設置&#xff08;Settings&#xff09; 3.選擇Appearance&Behavior--->Appearance劃到最下面&#xff0c;開啟顯示工具欄和左側并排布…

[Java實戰]Spring Boot 靜態資源配置(十三)

[Java實戰]Spring Boot 靜態資源配置&#xff08;十三&#xff09; 引言 靜態資源&#xff08;如 HTML、CSS、JavaScript、圖片等&#xff09;是 Web 應用的基石。Spring Boot 通過自動化配置簡化了靜態資源管理&#xff0c;但面對復雜場景&#xff08;如多模塊項目、CDN 集成…

多模態大語言模型arxiv論文略讀(六十九)

Prompt-Aware Adapter: Towards Learning Adaptive Visual Tokens for Multimodal Large Language Models ?? 論文標題&#xff1a;Prompt-Aware Adapter: Towards Learning Adaptive Visual Tokens for Multimodal Large Language Models ?? 論文作者&#xff1a;Yue Zha…

Python 基礎語法與數據類型(七) - 函數的定義與調用 (def, return)

文章目錄 為什么要使用函數&#xff1f;函數的定義 (def)函數的調用函數參數 (Parameters vs Arguments)返回值 (return)變量作用域 (簡要了解)總結練習題練習題答案 **創作不易&#xff0c;請大家點贊加收藏&#xff0c;關注我&#xff0c;持續更新教程&#xff01;** 到目前為…

華為配置篇-RSTP/MSTP實驗

MSTP 一、簡介二、常用命令總結三、實驗 一、簡介 RSTP&#xff08;快速生成樹協議&#xff09;? RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09;是 STP 的改進版本&#xff0c;基于 ??IEEE 802.1w 標準??&#xff0c;核心目標是解決傳統 STP 收斂速度慢的問…