Python 正則表達式完全指南

# Python 正則表達式完全指南

正則表達式(Regular Expression)是Python中進行文本處理的強大工具。本指南將詳細介紹Python中正則表達式的使用方法和實踐技巧。

## 1. 基礎知識

### 1.1 導入正則表達式模塊

```python

import re

```

### 1.2 創建正則表達式

在Python中有兩種方式創建正則表達式:

```python

# 方式1:使用原始字符串(推薦)

pattern = r'\d+'

# 方式2:普通字符串(需要額外轉義)

pattern = '\\d+'

```

### 1.3 基本匹配方法

```python

import re

text = "Hello, my phone is 123-456-7890"

# 1. re.match() - 從字符串開始處匹配

result = re.match(r'\w+', text)

print(result.group()) ?# 輸出: Hello

# 2. re.search() - 搜索整個字符串中的第一個匹配

result = re.search(r'\d+', text)

print(result.group()) ?# 輸出: 123

# 3. re.findall() - 找到所有匹配項

result = re.findall(r'\d+', text)

print(result) ?# 輸出: ['123', '456', '7890']

# 4. re.finditer() - 返回迭代器

for match in re.finditer(r'\d+', text):

? ? print(f"Found {match.group()} at position {match.start()}-{match.end()}")

```

## 2. 正則表達式語法

### 2.1 字符匹配

```python

# 示例文本

text = "Python3 is awesome! Price: $99.99"

# 匹配單個字符

re.findall(r'.', text) ? ? ?# 匹配任意字符

re.findall(r'\d', text) ? ? # 匹配數字

re.findall(r'\D', text) ? ? # 匹配非數字

re.findall(r'\w', text) ? ? # 匹配字母/數字/下劃線

re.findall(r'\W', text) ? ? # 匹配非字母/數字/下劃線

re.findall(r'\s', text) ? ? # 匹配空白字符

re.findall(r'\S', text) ? ? # 匹配非空白字符

```

### 2.2 數量詞

```python

# 文本示例

text = "Python programming is fun!!!"

# 常用數量詞

re.search(r'o*', text) ? ? ?# 匹配0次或多次

re.search(r'o+', text) ? ? ?# 匹配1次或多次

re.search(r'o?', text) ? ? ?# 匹配0次或1次

re.search(r'o{2}', text) ? ?# 精確匹配2次

re.search(r'o{1,3}', text) ?# 匹配1到3次

```

### 2.3 字符類

```python

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

# 使用字符類

re.findall(r'[aeiou]', text) ? ?# 匹配所有元音字母

re.findall(r'[^aeiou]', text) ? # 匹配所有非元音字母

re.findall(r'[a-z]', text) ? ? ?# 匹配所有小寫字母

re.findall(r'[A-Z]', text) ? ? ?# 匹配所有大寫字母

```

## 3. 高級特性

### 3.1 分組和捕獲

```python

# 分組示例

text = "John Smith, Jane Doe, Bob Johnson"

# 基本分組

pattern = r'(\w+)\s(\w+)'

matches = re.findall(pattern, text)

print(matches) ?# 輸出: [('John', 'Smith'), ('Jane', 'Doe'), ('Bob', 'Johnson')]

# 命名分組

pattern = r'(?P<first>\w+)\s(?P<last>\w+)'

for match in re.finditer(pattern, text):

? ? print(f"First: {match.group('first')}, Last: {match.group('last')}")

```

### 3.2 前向查找和后向查找

```python

text = "Price: $100, Cost: $50"

# 正向前向查找

re.findall(r'\d+(?=\s*dollars)', text) ?# 匹配后面跟著"dollars"的數字

# 負向前向查找

re.findall(r'\d+(?!\s*dollars)', text) ?# 匹配后面不跟"dollars"的數字

# 正向后向查找

re.findall(r'(?<=\$)\d+', text) ?# 匹配前面有$的數字

# 負向后向查找

re.findall(r'(?<!\$)\d+', text) ?# 匹配前面沒有$的數字

```

## 4. 實用示例

### 4.1 數據驗證

```python

def validate_email(email):

? ? """驗證電子郵件地址"""

? ? pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'

? ? return bool(re.match(pattern, email))

def validate_phone(phone):

? ? """驗證中國手機號"""

? ? pattern = r'^1[3-9]\d{9}$'

? ? return bool(re.match(pattern, phone))

def validate_password(password):

? ? """驗證密碼強度(至少8位,包含大小寫字母和數字)"""

? ? pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$'

? ? return bool(re.match(pattern, password))

```

### 4.2 文本處理

```python

def extract_urls(text):

? ? """提取文本中的URL"""

? ? pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'

? ? return re.findall(pattern, text)

def clean_text(text):

? ? """清理文本(刪除多余空白字符)"""

? ? return re.sub(r'\s+', ' ', text).strip()

def extract_dates(text):

? ? """提取日期(支持多種格式)"""

? ? pattern = r'\d{4}[-/]\d{1,2}[-/]\d{1,2}|\d{1,2}[-/]\d{1,2}[-/]\d{4}'

? ? return re.findall(pattern, text)

```

## 5. 性能優化技巧

### 5.1 編譯正則表達式

```python

# 當需要多次使用同一個正則表達式時,應該編譯它

pattern = re.compile(r'\d+')

# 使用編譯后的正則表達式

text = "123 456 789"

matches = pattern.findall(text)

```

### 5.2 優化技巧

1. 使用非捕獲組 `(?:)`:當不需要捕獲結果時

```python

# 不好的寫法

pattern = r'(https?://)(.*)'

# 好的寫法

pattern = r'(?:https?://)(.*)'

```

2. 避免過度使用通配符

```python

# 不好的寫法

pattern = r'.*foo.*'

# 好的寫法

pattern = r'[^/]*foo[^/]*'

```

## 6. 常見問題和解決方案

### 6.1 貪婪vs非貪婪匹配

```python

text = "<p>First</p><p>Second</p>"

# 貪婪匹配(默認)

re.findall(r'<p>.*</p>', text) ?# 匹配整個字符串

# 非貪婪匹配

re.findall(r'<p>.*?</p>', text) ?# 分別匹配每個標簽

```

### 6.2 處理特殊字符

```python

# 轉義特殊字符

def escape_special_chars(text):

? ? return re.escape(text)

# 示例

pattern = re.escape('hello.world') ?# 將點號轉義

```

## 7. 調試技巧

```python

# 使用verbose模式使正則表達式更易讀

pattern = re.compile(r"""

? ? \d+ ? ? ? ? ?# 匹配數字

? ? \s* ? ? ? ? ?# 可選的空白字符

? ? [a-zA-Z]+ ? ?# 匹配字母

? ? """, re.VERBOSE)

# 使用re.DEBUG標志查看編譯信息

pattern = re.compile(r'\d+\s*[a-zA-Z]+', re.DEBUG)

```

## 總結

Python的正則表達式功能強大且靈活,掌握它可以大大提高文本處理效率。關鍵點:

1. 合理使用原始字符串(r'')

2. 需要重復使用時記得編譯正則表達式

3. 注意貪婪vs非貪婪匹配

4. 適當使用命名分組提高代碼可讀性

5. 考慮性能優化

6. 編寫復雜正則表達式時使用verbose模式

記住:編寫正則表達式時應該遵循"簡單夠用"的原則,過于復雜的正則表達式往往會帶來維護困難和性能問題。

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

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

相關文章

Vue的scoped原理是什么

CSS常見模塊化方案 BEM&#xff08;Block Element Modifier&#xff09;: BEM是一種流行的命名約定&#xff0c;它通過特定的命名規則來組織CSS類名&#xff0c;使得樣式具有模塊化、可重用性和可讀性。BEM的命名規則是&#xff1a;block__element--modifier。 block&#xf…

【LC】3270. 求出數字答案

題目描述&#xff1a; 給你三個 正 整數 num1 &#xff0c;num2 和 num3 。 數字 num1 &#xff0c;num2 和 num3 的數字答案 key 是一個四位數&#xff0c;定義如下&#xff1a; 一開始&#xff0c;如果有數字 少于 四位數&#xff0c;給它補 前導 0 。答案 key 的第 i 個數…

太原理工大學軟件設計與體系結構 --javaEE

這個是簡答題的內容 選擇題的一些老師會給你們題庫&#xff0c;一些注意的點我會做出文檔在這個網址 項目目錄預覽 - TYUT復習資料:復習資料 - GitCode 希望大家可以給我一些打賞 什么是Spring的IOC和DI IOC 是一種設計思想&#xff0c;它將對象的創建和對象之間的依賴關系…

深度學習知識點:LSTM

文章目錄 1.應用現狀2.發展歷史3.基本結構4.LSTM和RNN的差異 1.應用現狀 長短期記憶神經網絡&#xff08;LSTM&#xff09;是一種特殊的循環神經網絡(RNN)。原始的RNN在訓練中&#xff0c;隨著訓練時間的加長以及網絡層數的增多&#xff0c;很容易出現梯度爆炸或者梯度消失的問…

mmdet

一&#xff0c;configs/_base_ 1.default_runtime.py 2.schedule_1x.py 二&#xff0c;mmdet 1.datasets/coco.py/CocoDataset METAINFO {classes:(milk, red, spring, fanta, sprite, pepsi, king, ice, cola, scream ),# palette is a list of color tuples, which is us…

ElasticSearch 認識和安裝ES

文章目錄 一、為什么學ElasticSearch?1.ElasticSearch 簡介2.ElasticSearch 與傳統數據庫的對比3.ElasticSearch 應用場景4.ElasticSearch 技術特點5.ElasticSearch 市場表現6.ElasticSearch 的發展 二、認識和安裝ES1.認識 Elasticsearch&#xff08;簡稱 ES&#xff09;2.El…

node.js中實現token的生成與驗證

Token&#xff08;令牌&#xff09;是一種用于在客戶端和服務器之間安全傳輸信息的加密字符串。在Web開發中&#xff0c;Token常用于身份驗證和授權&#xff0c;確保用戶能夠安全地訪問受保護的資源。 作用與意義 身份驗證&#xff1a;Token可以用來驗證用戶的身份&#xff0…

第34天:安全開發-JavaEE應用反射機制攻擊鏈類對象成員變量方法構造方法

時間軸&#xff1a; Java反射相關類圖解&#xff1a; 反射&#xff1a; 1、什么是 Java 反射 參考&#xff1a; https://xz.aliyun.com/t/9117 Java 提供了一套反射 API &#xff0c;該 API 由 Class 類與 java.lang.reflect 類庫組成。 該類庫包含了 Field 、 Me…

Django后端相應類設計

通用的ApiResponse類&#xff1a;用于生成統一的 API 響應格式。每個響應都包含以下字段&#xff08;每個接口最終的返回數據格式&#xff09;&#xff1a; status_code&#xff1a;HTTP 狀態碼&#xff08;如 200、400、500 等&#xff09;message&#xff1a;響應的描述信息…

汽車基礎軟件AutoSAR自學攻略(三)-AutoSAR CP分層架構(2)

汽車基礎軟件AutoSAR自學攻略(三)-AutoSAR CP分層架構(2) 下面我們繼續來介紹AutoSAR CP分層架構&#xff0c;下面的文字和圖來自AutoSAR官網目前最新的標準R24-11的分層架構手冊。該手冊詳細講解了AutoSAR分層架構的設計&#xff0c;下面讓我們來一起學習一下。 Introductio…

css面試常考布局(圣杯布局、雙飛翼布局、三欄布局、兩欄布局、三角形)

兩欄布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

模糊查詢在sqlserver、dm8、mysql的編寫示例

模糊查詢要求&#xff1a;字段值以 25D 開頭&#xff0c;并以 4 位數字結尾 sqlserver&#xff1a; select * from table_name where column_name like 25D[0-9][0-9][0-9][0-9] 說明&#xff1a; 25D&#xff1a;表示字符串以 25D 開頭。 [0-9][0-9][0-9][0-9]&#xf…

SCTNet模型詳解及代碼復現

模型背景 隨著深度學習技術的發展,語義分割領域取得了顯著進展。然而,在實際應用中,特別是在實時場景下,現有模型往往面臨計算復雜度高、難以平衡精度和速度等問題。為應對這些挑戰,研究人員提出了SCTNet模型,旨在解決實時語義分割問題,同時兼顧精度和效率。該模型融合…

Python的循環

Python的循環 Python的循環有兩種&#xff0c;分別是for…in循環和while循環。 for…in 循環 假設我們要循環輸出一個列表里的元素&#xff1a; names [張三,李四,王五] for name in names:print(name)執行這段代碼后&#xff0c;會依次打印names的每一個元素&#xff1a;…

【0387】Postgres內核 streaming replication(流復制)工作原理

1. Postgres 流復制 本文是關于設置 PostgreSQL 版本流復制的簡明指南,力求盡可能不受平臺限制。故而,其假定您擁有運用操作系統工具編輯文件及安裝/配置軟件包的扎實知識。并且,還假定您熟悉 PostgreSQL 的配置情況。 PostgreSQL 內置的流復制為您的數據庫構建了一個服務…

網絡攻擊行為可視化分析系統【數據分析 + 可視化】

一、系統背景 隨著信息技術的快速發展&#xff0c;網絡已成為現代社會不可或缺的一部分。然而&#xff0c;與此同時&#xff0c;網絡攻擊手段也日益多樣化和復雜化&#xff0c;給企業和個人的信息安全帶來了極大的威脅。傳統的網絡攻擊分析方法往往依賴于人工分析和處理大量的…

利用obs studio制作(人像+屏幕)錄制影像

1.什么是obs? OBS&#xff08;Open Broadcaster Software&#xff09;是一款功能強大的開源軟件&#xff0c;它使用戶能夠直接從電腦錄制視頻和直播內容到 Twitch&#xff0c;YouTube 和 Facebook Live 等平臺。它在需要直播或錄制屏幕活動的游戲玩家、YouTube 用戶和專業人士…

蠕蟲病毒會給服務器造成哪些危害?

蠕蟲病毒是一種獨立的惡意計算機程序&#xff0c;可以進行自我復制來傳播到其他的計算機系統當中&#xff0c;蠕蟲病毒和傳統病毒之間是有著區別的&#xff0c;蠕蟲病毒不需要宿主程序就能夠自行傳播&#xff0c;主要是利用各種操作系統漏洞進行攻擊的。 接下來小編就介紹一下蠕…

C# GDI+的DrawString無法繪制Tab鍵的現象

【啰嗦2句】 現在用C#的人很少了吧&#xff1f;GDI更少了吧&#xff1f;所以這個問題估計也冷門。沒關系&#xff0c;分享給特定需要的人也不錯。 【問題現象】 工作中開發了一個報告編輯器&#xff0c;實現圖文排版等功能&#xff0c;用著沒什么問題&#xff0c;直到有一天…

互斥信號量的等待與通知

目錄 等待互斥信號量 信號量未被占用 信號量被自己占用 信號量被高優先級任務占用 信號量被低優先級任務占用 釋放互斥信號量 未發生優先級繼承 發生優先級繼承 等待互斥信號量 信號量未被占用 標記為已經被占用鎖定計數1 信號量被自己占用 鎖定計數1 信號量被高優先級任務占用…