一文掌握python中正則表達式的各種使用

文章目錄

    • 1. 正則表達式基礎
      • 1.1 常用元字符
      • 1.2 基本用法
    • 2. 正則表達式高級功能
      • 2.1 分組捕獲
      • 2.2 命名分組
      • 2.3 非貪婪匹配
      • 2.4 零寬斷言
      • 2.5 編譯正則表達式
      • 2.6 轉義字符
    • 3. 常見應用場景
      • 3.1 驗證郵箱格式
      • 3.2 提取 URL
      • 3.3 提取日期
      • 3.4 提取HTML中的鏈接
      • 3.5 提取HTML中的圖片鏈接
      • 3.6 提取JSON中的特定字段
    • 4. 總結

在Python爬蟲中, 正則表達式Regular Expression,簡稱Regex)是一種強大的工具,用于從文本中提取、匹配和替換特定的字符串模式。正則表達式可以幫助我們從HTML、JSON等格式的文本中提取所需的數據。

1. 正則表達式基礎

1.1 常用元字符

正則表達式由一系列字符和特殊符號組成,用于定義匹配模式。以下是一些常用的正則表達式元字符:

  • . 匹配任意字符(除了換行符 \n)
  • ^ 匹配字符串的開頭
  • $ 匹配字符串的結尾
  • * 匹配前面的字符 0 次或多次
  • + 匹配前面的字符 1 次或多次
  • ? 匹配前面的字符 0 次或 1 次
  • {n} 匹配前面的字符恰好 n 次
  • {n,} 匹配前面的字符至少 n 次
  • {n,m} 匹配前面的字符至少 n 次,至多 m 次
  • \d 匹配數字(等價于 [0-9])
  • \D 匹配非數字(等價于 [^0-9])
  • \w 匹配字母、數字或下劃線(等價于 [a-zA-Z0-9_])
  • \W 匹配非字母、數字或下劃線
  • \s 匹配空白字符(空格、制表符、換行符等)
  • \S 匹配非空白字符
  • [...] 匹配括號內的任意一個字符
  • [^...] 匹配不在括號內的任意一個字符

1.2 基本用法

Python提供了re模塊來支持正則表達式的操作。以下是re模塊中常用的函數:

  • re.search(pattern, string):在字符串中搜索匹配正則表達式的第一個位置,返回一個匹配對象。如果沒有匹配項,返回None。
  • re.match(pattern, string):從字符串的開頭開始匹配正則表達式,返回一個匹配對象。如果沒有匹配項,返回None。
  • re.findall(pattern, string):返回字符串中所有匹配正則表達式的子串,返回一個列表。
  • re.sub(pattern, repl, string):將字符串中所有匹配正則表達式的子串替換為repl,返回替換后的字符串。
  • re.compile(pattern):將正則表達式編譯為一個正則表達式對象,可以重復使用。

Python 的 re 模塊使用樣例如下:

import re# re.match()
result = re.match(r'hello', 'hello world')
if result:print("匹配成功:", result.group())  # 輸出: 匹配成功: hello
else:print("匹配失敗")# re.search()
result = re.search(r'world', 'hello world')
if result:print("匹配成功:", result.group())  # 輸出: 匹配成功: world
else:print("匹配失敗")# re.findall()
result = re.findall(r'\d+', '3 apples, 5 bananas, 10 cherries')
print(result)  # 輸出: ['3', '5', '10']#re.finditer()
matches = re.finditer(r'\d+', '3 apples, 5 bananas, 10 cherries')
for match in matches:print(match.group())  # 輸出: 3, 5, 10# re.sub()
text = '3 apples, 5 bananas, 10 cherries'
result = re.sub(r'\d+', 'X', text)
print(result)  # 輸出: X apples, X bananas, X cherries# re.split()
result = re.split(r'\s+', 'hello   world')
print(result)  # 輸出: ['hello', 'world']

2. 正則表達式高級功能

2.1 分組捕獲

使用 () 可以將匹配的內容分組,并通過 group() 方法獲取。

import retext = 'John: 30, Jane: 25'
result = re.search(r'(\w+): (\d+)', text)
if result:print("姓名:", result.group(1))  # 輸出: 姓名: Johnprint("年齡:", result.group(2))  # 輸出: 年齡: 30

2.2 命名分組

可以為分組命名,方便后續引用。

import retext = 'John: 30'
result = re.search(r'(?P<name>\w+): (?P<age>\d+)', text)
if result:print("姓名:", result.group('name'))  # 輸出: 姓名: Johnprint("年齡:", result.group('age'))  # 輸出: 年齡: 30

2.3 非貪婪匹配

正則表達式默認是貪婪匹配,即盡可能多地匹配字符。例如,.*會匹配盡可能多的字符。可以使用.*?進行非貪婪匹配。

import retext = '<div>content1</div><div>content2</div>'
result = re.findall(r'<div>(.*?)</div>', text)
print(result)  # 輸出: ['content1', 'content2']

2.4 零寬斷言

零寬斷言用于指定匹配的位置,但不消耗字符。

  • 正向先行斷言:(?=…),匹配后面是 … 的位置。
  • 負向先行斷言:(?!..),匹配后面不是 … 的位置。
  • 正向后行斷言:(?<=…),匹配前面是 … 的位置。
  • 負向后行斷言:(?<!..),匹配前面不是 … 的位置。
import re# 匹配后面是數字的字母
result = re.findall(r'\w+(?=\d)', 'apple3 banana5 cherry10')
print(result)  # 輸出: ['apple', 'banana', 'cherry']# 匹配前面是數字的字母
result = re.findall(r'(?<=\d)\w+', '3apple 5banana 10cherry')
print(result)  # 輸出: ['apple', 'banana', 'cherry']

2.5 編譯正則表達式

如果需要多次使用同一個正則表達式,可以將其編譯為 re.Pattern 對象,以提高效率。

import repattern = re.compile(r'\d+')
result = pattern.findall('3 apples, 5 bananas, 10 cherries')
print(result)  # 輸出: ['3', '5', '10']

2.6 轉義字符

在正則表達式中,某些字符(如.、*、?等)具有特殊含義。如果要匹配這些字符本身,需要使用反斜杠\進行轉義。例如,.匹配實際的.字符。

3. 常見應用場景

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 提取 URL

import retext = 'Visit https://www.example.com or http://example.org'
urls = re.findall(r'https?://[^\s]+', text)
print(urls)  # 輸出: ['https://www.example.com', 'http://example.org']

3.3 提取日期

import retext = 'Today is 2023-10-05, and tomorrow is 2023-10-06.'
dates = re.findall(r'\d{4}-\d{2}-\d{2}', text)
print(dates)  # 輸出: ['2023-10-05', '2023-10-06']

3.4 提取HTML中的鏈接

假設我們要從HTML中提取所有的鏈接,可以使用正則表達式來匹配標簽中的href屬性。

import rehtml = """
<a href="https://www.example.com">Example</a>
<a href="https://www.google.com">Google</a>
<a href="https://www.python.org">Python</a>
"""# 正則表達式匹配<a>標簽中的href屬性
pattern = r'<a href="(.*?)">'# 使用re.findall提取所有匹配的鏈接
links = re.findall(pattern, html)print(links)
# 輸出:['https://www.example.com', 'https://www.google.com', 'https://www.python.org']

3.5 提取HTML中的圖片鏈接

假設我們要從HTML中提取所有的圖片鏈接,可以使用正則表達式來匹配標簽中的src屬性。

import rehtml = """
<img src="https://www.example.com/image1.jpg" alt="Image 1">
<img src="https://www.google.com/logo.png" alt="Google Logo">
<img src="https://www.python.org/python.png" alt="Python Logo">
"""# 正則表達式匹配<img>標簽中的src屬性
pattern = r'<img src="(.*?)"'# 使用re.findall提取所有匹配的圖片鏈接
image_links = re.findall(pattern, html)print(image_links)
# 輸出:['https://www.example.com/image1.jpg', 'https://www.google.com/logo.png', 'https://www.python.org/python.png']

3.6 提取JSON中的特定字段

假設我們有一個JSON字符串,想要提取其中的某個字段,可以使用正則表達式來匹配。

import rejson_data = '{"name": "Alice", "age": 25, "city": "New York"}'# 正則表達式匹配"name"字段的值
pattern = r'"name": "(.*?)"'# 使用re.search提取匹配的字段值
match = re.search(pattern, json_data)if match:print(match.group(1))

4. 總結

正則表達式是處理文本的強大工具,Python 的 re 模塊提供了豐富的功能來支持正則表達式的使用。通過掌握基礎語法和高級功能,可以輕松應對各種文本處理任務。

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

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

相關文章

TCP,http,WebSocket

TCP&#xff08;Transmission Control Protocol&#xff0c;傳輸控制協議&#xff09;和HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;都是網絡通信中的重要協議&#xff0c;但它們在網絡協議棧的不同層次上工作&#xff0c;各自負責不同…

Redis|持久化

文章目錄 總體介紹RDB&#xff08;Redis DataBase&#xff09;官網介紹案例演示優勢劣勢如何檢查修復 dump.rdb 文件哪些情況下會觸發 RDB 快照如何禁用快照RDB 優化配置項詳解小總結 AOF&#xff08;Append Only File&#xff09;官網介紹是什么能干嘛AOF 持久化工作流程AOF 緩…

Docker小游戲 | 使用Docker部署star-battle太空飛船射擊小游戲

Docker小游戲 | 使用Docker部署star-battle太空飛船射擊小游戲 前言項目介紹項目簡介項目預覽二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署star-battle網頁小游戲下載鏡像創建容器檢查容器狀態檢查服務端口安全設置四、訪問star-battle網頁小游戲五、總…

巨控科技的GRM550元出魔抗實現PLC遠程下載與維護方案:工業自動化的高效解決方案

巨控科技PLC遠程下載與維護方案&#xff1a;工業自動化的高效解決方案 在工業自動化領域&#xff0c;設備的高效維護與快速調試是保障生產連續性的關鍵。巨控科技推出的PLC遠程下載與維護方案&#xff0c;憑借其先進的技術和廣泛兼容性&#xff0c;成為企業實現設備遠程管理的…

ChatGLM2-6B如何從輸入到輸出-代碼解析(二)

出發點 上一篇解析了Chatglm2-6b的模型架構&#xff0c;并和Chatglm-6b進行對比&#xff0c;但是留下了幾個問題&#xff08;哭&#xff09;這一篇的目的是講明白attention和rotaryEmbedding&#xff0c;解決問題&#xff0c;并實現整體目標&#xff0c;完全替代modeling_chat…

Sublime Text4安裝、漢化

-------------2025-02-22可用---------------------- 官方網址下載&#xff1a;https://www.sublimetext.com 打開https://hexed.it 點擊打開文件找到軟件安裝目錄下的 ctrlf 查找 8079 0500 0f94 c2右邊啟用替換替換為:c641 0501 b200 90點擊替換按鈕 替換完成后 另存為本地…

汽車開放系統架構(AUTOSAR)中運行時環境(RTE)生成過程剖析

一、引言 在當今高度智能化的汽車電子領域&#xff0c;軟件系統的復雜性呈指數級增長。為了應對這一挑戰&#xff0c;汽車開放系統架構&#xff08;AUTOSAR&#xff09;應運而生&#xff0c;它為汽車電子軟件開發提供了標準化的分層架構和開發方法。其中&#xff0c;運行時環境…

基于MATLAB的OFDM通信系統仿真設計

下面將為你詳細介紹基于MATLAB的OFDM通信系統仿真設計的步驟和示例代碼。 1. OFDM系統原理概述 正交頻分復用&#xff08;OFDM&#xff09;是一種多載波調制技術&#xff0c;它將高速數據流通過串并轉換&#xff0c;分配到多個正交的子載波上進行傳輸&#xff0c;這樣可以有效…

stm32仿真 74hc238流水燈 數碼管動態數字顯示

f103c6t6a_hex文件 #include "main.h"![請添加圖片描述](https://i-blog.csdnimg.cn/direct/8c0d44b121134cf08f5186df316ea07f.gif)#include "stdlib.h"void SystemClock_Config(void); static void MX_GPIO_Init(void); // 自定義abc引腳 #define A_PIN…

結構型模式 - 代理模式 (Proxy Pattern)

結構型模式 - 代理模式 (Proxy Pattern) 代理模式是一種結構型設計模式&#xff0c;它允許通過代理對象來控制對另一個對象&#xff08;目標對象&#xff09;的訪問。代理對象充當目標對象的接口&#xff0c;客戶端通過代理對象間接訪問目標對象。 分為兩大類 靜態代理&#…

網絡層(IP)

基本概念 子網和局域網是一個概念主機: 配有 IP 地址, 也能進行路由控制的設備;路由器: 即配有 IP 地址, 又能進行路由控制;節點&#xff1a; 路由器和主機的統稱。 背景 兩主機并不是直接連接的&#xff0c;路徑選擇問題&#xff1f;為什么&#xff1f; 由網絡層&#xff08…

JMeter性能問題

性能測試中TPS上不去的幾種原因 性能測試中TPS上不去的幾種原因_tps一直上不去-CSDN博客 網絡帶寬 連接池 垃圾回收機制 壓測腳本 通信連接機制 數據庫配置 硬件資源 壓測機 業務邏輯 系統架構 CPU過高什么原因 性能問題分析-CPU偏高 - 西瓜汁拌面 - 博客園 US C…

創建型模式 - 建造者模式 (Builder Pattern)

創建型模式 - 建造者模式 (Builder Pattern) 建造者模式是一種創建型設計模式&#xff0c;它將一個復雜對象的構建與表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。 需求描述 在游戲開發中&#xff0c;創建一個復雜的游戲角色&#xff0c;角色具有多種屬性&…

代碼隨想錄第二十天|二叉樹part08--669.修建二叉搜索樹、108.將有序數組轉換為二叉搜索樹、538.把二叉搜索樹轉換為累加樹

刷題小記&#xff1a; 上期學習了二叉搜索樹的插入和刪除操作&#xff0c;這次學習如何按區間修剪二叉搜索樹。還有兩題&#xff0c;關于借助二叉搜索樹的有序特性進行轉換。 669.修剪二叉搜索樹&#xff08;669.修剪二叉搜索樹&#xff09; 題目分析&#xff1a; 給定一個…

Fisher信息矩陣(Fisher Information Matrix,簡稱FIM)

Fisher信息矩陣簡介 Fisher信息矩陣&#xff08;Fisher Information Matrix&#xff0c;簡稱FIM&#xff09;是統計學和信息理論中的一個重要概念&#xff0c;廣泛應用于參數估計、統計推斷和機器學習領域。它以統計學家羅納德費希爾&#xff08;Ronald Fisher&#xff09;的名…

【初階數據結構】鏈表的柔光之美

目錄 一、為什么需要鏈表&#xff1f; 二、鏈表與數組的對比 三、鏈表節點定義 四、鏈表基本操作 1. 創建鏈表 2. 插入節點 頭插法&#xff08;時間復雜度O(1)&#xff09; 尾插法&#xff08;時間復雜度O(n)&#xff09; 3. 刪除節點 4. 遍歷鏈表 五、進階操作 1. 反…

《論湖倉一體架構及其應用》審題技巧 - 系統架構設計師

軟考論文寫作框架 一、考點概述 “湖倉一體架構及其應用”這一論題&#xff0c;主要考察了考生對現代數據管理系統中湖倉一體架構的理解、應用及問題解決能力。隨著5G、大數據、人工智能、物聯網等技術的快速發展&#xff0c;企業數據的管理需求正發生深刻變化。傳統的數據管…

MybatisPlus-擴展功能-枚舉處理器

在Mybatis里有一個叫TypeHandler的類型處理器&#xff0c;我們常見的PO當中的這些成員變量的數據類型&#xff0c;它都有對應的處理器&#xff0c;因此它就能自動實現這些Java數據類型與數據庫類型的相互轉換。 它里面還有一個叫EnumOrdinalTypeHandler的枚舉處理器&#xff0…

北京大學第二彈《DeepSeek提示詞工程和落地場景》

大家好&#xff0c;我是吾鳴。 之前給大家分享過北京大學出品的DeepSeek教程《DeepSeek與AIGC應用》&#xff0c;今天吾鳴發現北京大學又出第二版教程了&#xff0c;教程的名稱叫做《DeepSeek提示詞工程和落地場景》&#xff0c;在此分享給大家。文末有完整版PDF下載地址。 教程…

deepseek自動化代碼生成

使用流程 效果第一步&#xff1a;注冊生成各種大模型的API第二步&#xff1a;注冊成功后生成API第三步&#xff1a;下載vscode在vscode中下載agent&#xff0c;這里推薦使用cline 第四步&#xff1a;安裝完成后&#xff0c;設置模型信息第一步選擇API provider&#xff1a; Ope…