Python正則表達式:從基礎到高級應用的全面總結與實戰【第103篇—JSON模塊】

Python正則表達式:從基礎到高級應用的全面總結與實戰

正則表達式是一種強大的文本匹配和處理工具,廣泛應用于文本處理、數據抽取、表單驗證等領域。本文將從正則表達式的基礎知識出發,逐步深入,最終結合代碼實戰,帶你全面了解正則表達式的奧妙。

在這里插入圖片描述

正則表達式基礎

1. 什么是正則表達式?

正則表達式是一種描述字符串匹配規則的文本模式,可以用來檢索、替換、驗證等操作。它由一系列字符和操作符組成,表示一種匹配規則。

2. 基礎語法

  • 字符匹配: 使用普通字符直接匹配文本,如 abc 匹配字符串中的 “abc”。
  • 元字符: 具有特殊意義的字符,如 . 表示匹配任意字符,^ 表示匹配字符串的開頭。
  • 字符類: 用方括號表示,如 [aeiou] 匹配任何一個元音字母。

3. 量詞和邊界

  • 量詞: 用于指定匹配的次數,如 * 表示零次或多次,+ 表示一次或多次,? 表示零次或一次。
  • 邊界: 使用 ^ 表示字符串的開頭,$ 表示字符串的結尾。

正則表達式代碼實戰

1. 使用正則表達式驗證郵箱

import redef validate_email(email):pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'if re.match(pattern, email):print(f"{email} 是一個有效的郵箱地址")else:print(f"{email} 不是一個有效的郵箱地址")# 測試
validate_email("user@example.com")
validate_email("invalid_email@.com")

2. 提取HTML中的鏈接

import rehtml_content = '<a href="https://www.example.com">Visit our website</a>'# 提取鏈接
links = re.findall(r'href="([^"]*)"', html_content)# 輸出鏈接
for link in links:print(f"鏈接: {link}")

3. 替換文本中的日期格式

import retext = "今天是2024年2月27日,明天是2024-02-28。"# 替換日期格式
formatted_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)print(f"替換前: {text}")
print(f"替換后: {formatted_text}")

4. 使用正則表達式判斷密碼強度

import redef check_password_strength(password):# 至少8個字符,包含至少一個大寫字母、一個小寫字母、一個數字和一個特殊字符pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$'if re.match(pattern, password):print("密碼強度符合要求")else:print("密碼強度不夠")# 測試
check_password_strength("StrongPass123!")
check_password_strength("weakpassword")

5. 從文本中提取手機號碼

import retext = "請聯系客戶:+86 13812345678 或者發送郵件至info@example.com"# 提取手機號碼
phone_numbers = re.findall(r'(?:(?:\+|00)86)?1[345789]\d{9}', text)# 輸出手機號碼
for number in phone_numbers:print(f"手機號碼: {number}")

6. 拆分逗號分隔的字符串

import recsv_data = "apple,orange,banana,grape"# 使用正則表達式拆分
items = re.split(r',', csv_data)# 輸出拆分結果
print("拆分后的結果:", items)

7. 使用正則表達式驗證URL

import redef validate_url(url):# 簡單的URL驗證,以http或https開頭,后面跟著域名pattern = r'^(https?://)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(?:/[^/#?]+)*(?:\?[^#]*)?(?:#(.*))?$'if re.match(pattern, url):print(f"{url} 是一個有效的URL")else:print(f"{url} 不是一個有效的URL")# 測試
validate_url("https://www.example.com")
validate_url("ftp://invalid-url.com")

8. 從HTML中提取文本內容

import rehtml_content = '<p>This is a <b>sample</b> HTML content.</p>'# 提取純文本內容
text_content = re.sub(r'<[^>]+>', '', html_content)print(f"HTML內容: {html_content}")
print(f"提取后的文本內容: {text_content}")

9. 匹配重復字符

import retext = "這個單詞是重復重復的,但是它們都是有意義的重復。"# 匹配連續重復的單詞
repeated_words = re.findall(r'\b(\w+)\s+\1\b', text)# 輸出匹配結果
print("連續重復的單詞:", repeated_words)

10. 使用正則表達式提取日志信息

import relog_data = """
2024-02-27 10:15: Error in module A
2024-02-27 11:30: Warning in module B
2024-02-27 12:45: Info: Application started
"""# 提取日志信息
log_entries = re.findall(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}): (Error|Warning|Info): (.+)', log_data)# 輸出提取結果
for entry in log_entries:timestamp, log_level, message = entryprint(f"{timestamp} - [{log_level}] {message}")

11. 使用正則表達式進行文本替換

import retext = "這是一個示例文本,包含一些需要替換的詞匯,例如apple和orange。"# 替換文本中的水果名稱
replaced_text = re.sub(r'\b(apple|orange)\b', 'fruit', text)print(f"替換前: {text}")
print(f"替換后: {replaced_text}")

12. 匹配多行文本

import remultiline_text = """
This is line 1.
Another line here.
And a third line.
"""# 匹配包含"line"的行
matching_lines = re.findall(r'.*line.*', multiline_text, re.MULTILINE)# 輸出匹配結果
for line in matching_lines:print(f"匹配的行: {line}")

我們深入了解了正則表達式在處理日志、進行文本替換等實際場景中的應用。正則表達式的強大之處在于它的靈活性和通用性,可以適應各種文本處理需求。希望這些例子能夠進一步拓展你對正則表達式的認識,并激發你在實際項目中更廣泛地應用它的興趣。如果有其他關于正則表達式的問題或者需要更多的實例,歡迎繼續提問。

13. 正則表達式分組與捕獲

在正則表達式中,使用括號可以創建分組,通過分組可以實現更精細的匹配和捕獲。

import retext = "2024-02-27 08:30: Process A started, Process B started"# 匹配并捕獲時間和進程名稱
pattern = r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}): (Process [A-Z]) started'
matches = re.findall(pattern, text)# 輸出捕獲結果
for match in matches:timestamp, process_name = matchprint(f"時間: {timestamp}, 進程: {process_name}")

14. 非貪婪匹配

正則表達式默認是貪婪匹配,即盡可能匹配更多的字符。在量詞后加上?可以實現非貪婪匹配。

import retext = "<b>bold text</b> and <i>italic text</i>"# 貪婪匹配
greedy_match = re.search(r'<.*>', text).group()# 非貪婪匹配
non_greedy_match = re.search(r'<.*?>', text).group()print(f"貪婪匹配: {greedy_match}")
print(f"非貪婪匹配: {non_greedy_match}")

15. 使用正則表達式驗證IP地址

import redef validate_ip_address(ip):pattern = r'^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)(\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)){3}$'if re.match(pattern, ip):print(f"{ip} 是一個有效的IP地址")else:print(f"{ip} 不是一個有效的IP地址")# 測試
validate_ip_address("192.168.0.1")
validate_ip_address("256.0.0.1")

通過這些高級的正則表達式實例,我們進一步提升了對正則表達式功能的理解和應用。分組、非貪婪匹配等特性使得正則表達式更加靈活和強大,能夠滿足更復雜的匹配需求。希望這些例子有助于你更深入地理解和運用正則表達式。如果你還有其他關于正則表達式的問題,歡迎提出。

16. 零寬斷言

零寬斷言是一種特殊的正則表達式結構,用于在匹配位置上添加條件,但并不消耗字符。常見的零寬斷言包括正向先行斷言((?=...))、負向先行斷言((?!...))、正向后行斷言((?<=...))、負向后行斷言((?<!...))等。

import retext = "apple orange banana"# 匹配單詞前面是"apple"的空格
positive_lookahead = re.search(r'apple(?=\s)', text).group()# 匹配單詞前面不是"apple"的空格
negative_lookahead = re.search(r'(?<!apple)\s', text).group()print(f"正向先行斷言: {positive_lookahead}")
print(f"負向先行斷言: {negative_lookahead}")

17. 使用正則表達式驗證日期格式

import redef validate_date(date):pattern = r'^(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$'if re.match(pattern, date):print(f"{date} 是一個有效的日期格式")else:print(f"{date} 不是一個有效的日期格式")# 測試
validate_date("2024-02-27")
validate_date("2024/02/27")

18. 正則表達式的替換與回調函數

利用正則表達式進行替換時,可以結合回調函數,實現更復雜的替換邏輯。

import redef multiply(match):number = int(match.group(1))return str(number * 2)text = "Numbers: 2, 5, 8, 12"# 使用回調函數替換數字
result = re.sub(r'\b(\d+)\b', multiply, text)print(f"替換前: {text}")
print(f"替換后: {result}")

通過這些高級的正則表達式實例,我們深入了解了零寬斷言、日期格式驗證以及替換與回調函數的應用。這些功能強大的特性使得正則表達式成為處理復雜文本匹配和替換任務的得力工具。希望這些例子有助于你更靈活地運用正則表達式解決實際問題。如果你還有其他關于正則表達式的疑問或需求,歡迎繼續提問。

總結:

通過本文的內容,我們全面深入地探討了正則表達式的基礎知識和高級應用。在基礎部分,我們學習了正則表達式的基本概念、語法元素以及常見的匹配規則。隨后,我們通過多個實例展示了正則表達式在不同場景的代碼應用,包括郵箱驗證、HTML鏈接提取、文本替換、密碼強度驗證等。

在高級部分,我們介紹了正則表達式的進階特性,包括分組與捕獲、非貪婪匹配、零寬斷言等。這些特性使得正則表達式更加靈活,能夠應對更復雜的文本匹配需求。同時,我們還探討了如何使用正則表達式驗證日期格式、IP地址,以及利用回調函數實現更復雜的替換邏輯。

通過這篇文章,讀者不僅學到了正則表達式的基礎知識,還深入了解了它在實際編程中的廣泛應用。正則表達式作為文本處理的得力工具,能夠提高開發效率,簡化代碼邏輯。希望本文的內容能夠幫助讀者更自信、更靈活地運用正則表達式解決實際問題,同時也鼓勵進一步深入學習和探索這一強大工具。如有任何問題或疑問,歡迎隨時提問,共同學習進步。

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

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

相關文章

趙文彬將出席無磷鍋爐工藝助劑在鍋爐水節水節能應用

演講嘉賓&#xff1a;趙文彬 集團副總/技術總監 上遠未來水務集團有限公司 演講題目&#xff1a;無磷鍋爐工藝助劑在鍋爐水節水節能方面的應用 會議簡介 “十四五”規劃中提出&#xff0c;提高工業、能源領城智能化與信息化融合&#xff0c;明確“低碳經濟”新的戰略目標&a…

mac 安裝hbuilderx

下載 HBuilderX下載地址: 下載地址 選額mac版本點擊下載 安裝 如圖&#xff0c;將HBuilderX拖到Applications&#xff0c;才是正確的安裝姿勢。 MacOSX&#xff0c;軟件必須安裝到/Applications目錄&#xff0c;如未安裝到此目錄&#xff0c;可能會出現插件安裝失敗、項目創建…

基于BERTopic模型的中文文本主題聚類及可視化

文章目錄 BERTopic簡介模型加載地址文本加載數據處理BERTopic模型構建模型結果展示主題可視化總結BERTopic簡介 BERTopic論文地址:BERTopic: Neural topic modeling with a class-based TF-IDF procedure BERTopic是一種結合了預訓練模型BERT和主題建模的強大工具。它允許我…

Linux中的動靜態庫

目錄 一、靜態庫 &#xff08;1&#xff09;靜態庫的優缺點&#xff1a; &#xff08;2&#xff09;Linux下靜態庫的創建和執行 1.直接編譯?編輯 2.指定路徑和庫名 3.用LIBRARY_PATH環境變量來配置路徑 二、動態庫 &#xff08;1&#xff09;動態庫的優缺點 &#xff…

javaweb請求與響應

前言 前面介紹了對應的服務器端的相關代碼。這里開始學習服務器端與客戶端的數據請求與響應 這里的僅僅是一個簡單的調用&#xff0c;并沒有經過servelert接口來進行調用&#xff0c;同前面的一樣&#xff0c;我們介紹對應的本地服務器進行的部署項目。 代碼 //屬于簡單的不…

Java學習—線程的創建

Java 中的多線程是一種強大的機制&#xff0c;允許程序同時執行兩個或兩個以上的部分。這些同時執行的部分被稱為線程&#xff0c;它們可以使程序的執行更加高效&#xff0c;特別是在進行大量計算或等待資源&#xff08;比如網絡資源或文件系統&#xff09;時。Java 提供了在程…

Scratch 第十三課-飛機大戰游戲

第十三課-飛機大戰游戲 學習目標 這節課我們做一款大家都愛玩的飛機大戰游戲&#xff0c;學習重點&#xff1a; 如何導入外部角色如何讓飛機發射子彈鼠標控制角色移動 程序設計 程序分析 &#xff1a; 飛機大戰游戲相信很多小朋友都玩過&#xff0c;我方飛機在下方&#xf…

LabVIEW石油鉆機提升系統數字孿生技術

LabVIEW石油鉆機提升系統數字孿生技術 隨著數字化、信息化、智能化的發展&#xff0c;石油鉆采過程中的石油鉆機數字化技術提升成為了提高鉆井效率、降低生產成本的重要途徑。基于中石油云平臺提供的數據&#xff0c;采用數字孿生技術&#xff0c;對石油鉆機提升系統進行數字化…

[Redis]——初識Redis

一、Redis為非關系型數據庫 ?我們常見的MySQL、SQLServer都是關系型數據庫&#xff0c;那他們之間有什么區別與聯系呢&#xff1f; &#x1f4d5;關系型數據庫與非關系型數據庫的區別&#xff08;面試題&#xff09; 解釋&#xff1a; SQL數據庫中的表是有結構的&#xff0c;包…

騰訊云學生云服務器_學生云主機_學生云數據庫_云+校園特惠套餐

2024年騰訊云學生服務器優惠活動「云校園」&#xff0c;學生服務器優惠價格&#xff1a;輕量應用服務器2核2G學生價30元3個月、58元6個月、112元一年&#xff0c;輕量應用服務器4核8G配置191.1元3個月、352.8元6個月、646.8元一年&#xff0c;CVM云服務器2核4G配置842.4元一年&…

小程序和頁面生命周期詳解

目錄 小程序的生命周期 創建&#xff08;onLoad&#xff09;&#xff1a; 顯示&#xff08;onShow&#xff09;&#xff1a; 隱藏&#xff08;onHide&#xff09;&#xff1a; 卸載&#xff08;onUnload&#xff09;&#xff1a; 錯誤監聽&#xff08;onError&#xff09;…

JVM 第二部分-2(堆,方法區)

4.堆 堆 一個Java程序&#xff08;main方法&#xff09;對應一個jvm實例&#xff0c;一個jvm實例只有一個堆空間堆是jvm啟動的時候就被創建&#xff0c;大小也確定了。大小可以用參數設置。堆是jvm管理的一塊最大的內存空間 核心區域&#xff0c;是垃圾回收的重點區域堆可以位…

洛谷P1509找啊找啊找GF

題解&#xff1a;這題我們需要考慮兩個因素 &#xff0c;既要有錢&#xff0c;也需要有人品&#xff0c;但是呢&#xff0c;還想花最少得時間泡到最多的女生&#xff0c;那么這題我們就要用到以往的二維dp數組&#xff0c;但是真的是二維的嗎&#xff1f;不&#xff0c;因為要考…

如何讓大項目自動化測試更加靈活簡潔

如何把大象放到冰箱里&#xff1f;第一打開冰箱門&#xff0c;第二把大象放進去&#xff0c;第三把冰箱門關好。 這個問題言外之意是大象那么大&#xff0c;怎么能放進冰箱&#xff0c;為什么要把大象放冰箱&#xff0c;就開始糾結這個問題了&#xff0c;它是想表明不用太多糾結…

Day20-磁盤管理

Day20-磁盤管理 1. cut 切:2. 磁盤歷史和內外部物理結構介紹2.1 磁盤發展趨勢和實現措施2.2 磁盤知識的體系結構2.3 機械磁盤的外部結構2.4 SSD固態硬盤的外部結構2.5 固態硬盤內部結構2.6 緩存在服務器各硬件上的速度和大小對比另類維度圖解&#xff0c;從上到下由高速到低速&…

DataX及Datax-web雜記

&#x1f47d;個人博客&#xff1a;https://everspring.github.io/ &#x1f47d;公眾號&#xff1a;愛歷史的IT男 一. DataX調試 DataX之前調試不是很方便&#xff0c;要打包后才能調試。23年7月后一位叫"FuYouJ "的開源者提交了datax-example模塊&#xff0c;就方…

ChatGPT 4.0:革新文獻檢索與推薦體驗

ChatGPT 4.0&#xff1a;革新文獻檢索與推薦體驗 隨著信息時代的到來&#xff0c;學術文獻的數量急劇增加&#xff0c;如何快速而準確地檢索到所需的文獻&#xff0c;以及發現潛在有價值的研究&#xff0c;成為了學術界的一大挑戰。ChatGPT 4.0作為最新一代的自然語言處理模型…

EasyRecovery2024國產免費的手機數據恢復軟件

一、功能介紹 EasyRecovery手機數據恢復軟件是一款功能全面的數據恢復工具&#xff0c;專為移動設備設計。其主要功能包括&#xff1a; 文件恢復&#xff1a;能夠恢復手機中因各種原因丟失的文件&#xff0c;如照片、視頻、音頻、文檔等。深度掃描&#xff1a;通過深度掃描手…

【數據結構】實現棧

大家好&#xff0c;我是蘇貝&#xff0c;本篇博客帶大家了解棧&#xff0c;如果你覺得我寫的還不錯的話&#xff0c;可以給我一個贊&#x1f44d;嗎&#xff0c;感謝?? 目錄 一 .棧的概念及結構二 .棧的實現棧的結構體初始化銷毀棧頂插入棧頂刪除顯示棧頂元素是否為空棧的大…

USB - Linux Kernel Menuconfig

Linux kernel&#xff0c;make menuconfig&#xff0c;和USB相關的&#xff0c;在主菜單選擇Device Drivers。 Device Drivers下面&#xff0c;找到USB support。 在USB support下面&#xff0c;就可以對USB相關的item進行設置。 按照從上到下的順序&#xff0c;打開的設置依次…