Python 正則表達式模塊 re

Python 正則表達式模塊 re

flyfish

一、正則表達式基礎

1. 什么是正則表達式?

正則表達式(Regular Expression, RE)是一種用于匹配、查找和替換文本模式的工具,由普通字符(如字母、數字)和特殊字符(元字符)組成。

2. 常用元字符
元字符說明示例
.匹配任意單個字符(除換行符)a.cabc, adc
\w匹配字母、數字或下劃線\w+hello123
\d匹配數字\d{3}123
\s匹配空白字符(空格、制表符等)\s+ → 多個空格
*匹配前一個字符零次或多次ab*a, ab, abb
+匹配前一個字符一次或多次ab+ab, abb
?匹配前一個字符零次或一次ab?aab
^匹配字符串開頭^abc → 以abc開頭
$匹配字符串結尾abc$ → 以abc結尾

二、Python 正則表達式模塊 re

1. 模塊導入
import re
2. 常用函數
函數名作用描述
re.compile()編譯正則表達式,提高重復使用效率
re.match()從字符串開頭匹配模式
re.search()在字符串任意位置搜索模式
re.findall()查找所有匹配項,返回列表
re.finditer()查找所有匹配項,返回迭代器
re.sub()替換匹配項
re.subn()替換匹配項并返回替換次數
re.split()按模式分割字符串
re.fullmatch()要求整個字符串完全匹配模式

三、核心功能詳解

1. 匹配操作
  • re.match()(從開頭匹配)
    match = re.match(r'hello', 'hello world')
    print(match.group())  # 輸出: hello
    

match = re.search(r'```json(.*?)```', content, re.DOTALL)

re.search() 函數

re.search(pattern, string, flags=0)re 模塊中的一個函數,用于在字符串 string 中搜索第一個與模式 pattern 匹配的子字符串。如果找到匹配項,則返回一個匹配對象;如果沒有找到,則返回 None

  • pattern:要搜索的正則表達式模式。
  • string:要在其中進行搜索的字符串,這里是 content
  • flags:可選參數,用于指定正則表達式的匹配模式。這里使用了 re.DOTALL
正則表達式模式 r'```json(.*?)```'
  • r:在字符串前面加上 r 表示這是一個原始字符串。在原始字符串中,反斜杠 \ 不會被當作轉義字符處理,這樣可以避免在編寫正則表達式時出現過多的轉義字符,提高代碼的可讀性。
  • json ````:這是一個普通的字符串,表示匹配以 json ````開頭的文本。
  • (.*?):這是一個捕獲組,用于匹配任意字符(除換行符外,除非使用了 re.DOTALL 標志)。
    • .:匹配除換行符外的任意單個字符。
    • *:表示前面的字符(即 .)可以出現零次或多次。
    • ?:在 * 后面加上 ? 表示非貪婪匹配。貪婪匹配會盡可能多地匹配字符,而非貪婪匹配會盡可能少地匹配字符。例如,如果字符串中有多個 json...代碼塊,非貪婪匹配會只匹配到第一個 ```````````就停止。
  • :表示匹配以 結尾的文本。
re.DOTALL 標志

re.DOTALLre 模塊中的一個標志,它會改變 . 的匹配行為。默認情況下,. 不匹配換行符,但使用 re.DOTALL 后,. 可以匹配包括換行符在內的任意字符。這意味著代碼塊中可以包含換行符,能夠正確匹配多行的 JSON 代碼塊。

  • re.search()(全局搜索)
    search = re.search(r'world', 'hello world')
    print(search.group())  # 輸出: world
    
2. 查找所有匹配項
  • re.findall()
    numbers = re.findall(r'\d+', 'a123b456c')
    print(numbers)  # 輸出: ['123', '456']
    
3. 替換操作
  • re.sub()
    text = re.sub(r'\d+', 'X', 'a123b456c')
    print(text)  # 輸出: aXbXc
    
4. 分割字符串
  • re.split()
    parts = re.split(r'\s+', 'hello   world')
    print(parts)  # 輸出: ['hello', 'world']
    

四、捕獲組與 group() 方法

1. 基本用法
pattern = r'(\d{4})-(\d{2})-(\d{2})'
date_str = '2025-03-11'
match = re.search(pattern, date_str)print(match.group(0))  # 完整匹配結果 → '2025-03-11'
print(match.group(1))  # 第一個捕獲組 → '2025'
print(match.group(2))  # 第二個捕獲組 → '03'
print(match.group(3))  # 第三個捕獲組 → '11'
2. 查看捕獲組數量
  • 使用 groups()
    groups = match.groups()
    print(len(groups))  # 輸出: 3
    
  • 命名捕獲組(使用 groupdict()
    pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
    match = re.search(pattern, date_str)
    print(match.groupdict())  # 輸出: {'year': '2025', 'month': '03', 'day': '11'}
    

五、re.match vs re.search

基本概念對比
  • re.match:該函數會從字符串的起始位置開始嘗試匹配正則表達式模式。如果字符串的起始位置不符合模式,即使字符串的其他部分存在匹配內容,re.match 也會返回 None。也就是說,它要求模式必須從字符串的第一個字符開始匹配成功。
  • re.search:此函數會在整個字符串中進行搜索,查找與正則表達式模式匹配的第一個位置。只要字符串中存在一處符合模式的內容,re.search 就會返回一個匹配對象。
詳細示例對比
示例 1:模式在字符串起始位置匹配
import re# 定義字符串和模式
pattern = r'hello'
string = 'hello world'# 使用 re.match
match_result = re.match(pattern, string)
if match_result:print("re.match 匹配成功,匹配內容為:", match_result.group())
else:print("re.match 匹配失敗")# 使用 re.search
search_result = re.search(pattern, string)
if search_result:print("re.search 匹配成功,匹配內容為:", search_result.group())
else:print("re.search 匹配失敗")

結果分析:在這個例子中,模式 'hello' 位于字符串 'hello world' 的起始位置。因此,re.matchre.search 都能成功匹配,并且都能返回匹配到的 'hello'

示例 2:模式不在字符串起始位置
import re# 定義字符串和模式
pattern = r'world'
string = 'hello world'# 使用 re.match
match_result = re.match(pattern, string)
if match_result:print("re.match 匹配成功,匹配內容為:", match_result.group())
else:print("re.match 匹配失敗")# 使用 re.search
search_result = re.search(pattern, string)
if search_result:print("re.search 匹配成功,匹配內容為:", search_result.group())
else:print("re.search 匹配失敗")

結果分析:模式 'world' 不在字符串 'hello world' 的起始位置,所以 re.match 會匹配失敗,返回 None。而 re.search 會在整個字符串中搜索,能夠找到 'world' 并返回匹配對象,輸出匹配內容 'world'

示例 3:模式部分在起始位置但不完全匹配
import re# 定義字符串和模式
pattern = r'hello world!'
string = 'hello world'# 使用 re.match
match_result = re.match(pattern, string)
if match_result:print("re.match 匹配成功,匹配內容為:", match_result.group())
else:print("re.match 匹配失敗")# 使用 re.search
search_result = re.search(pattern, string)
if search_result:print("re.search 匹配成功,匹配內容為:", search_result.group())
else:print("re.search 匹配失敗")

結果分析:模式 'hello world!' 雖然前部分 'hello world' 與字符串起始部分相同,但整體模式不完全匹配,所以 re.match 會失敗。re.search 同樣在整個字符串中找不到完全匹配的內容,也會匹配失敗。

性能考慮
  • re.match:由于它只從字符串起始位置開始匹配,不需要對整個字符串進行遍歷,在某些情況下性能可能會更好,特別是當你明確知道要匹配的內容應該在字符串開頭時。
  • re.search:需要遍歷整個字符串來查找匹配位置,所以在處理較長字符串時,性能可能會相對較低。但它的靈活性更高,適用于不確定匹配內容位置的情況。

六、正則表達式 re 模塊的常用例子

1. 匹配以特定字符開頭的字符串

import retext = "apple banana cherry"
pattern = r'^apple'
result = re.search(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失敗")

2. 匹配以特定字符結尾的字符串

import retext = "apple banana cherry"
pattern = r'cherry$'
result = re.search(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失敗")

3. 匹配包含特定單詞的字符串

import retext = "The quick brown fox jumps over the lazy dog"
pattern = r'fox'
result = re.search(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失敗")

4. 匹配連續數字

import retext = "abc123def"
pattern = r'\d+'
result = re.findall(pattern, text)
print("匹配結果:", result)

5. 匹配字母和數字的組合

import retext = "abc123def"
pattern = r'[a-zA-Z0-9]+'
result = re.findall(pattern, text)
print("匹配結果:", result)

6. 匹配郵箱地址

import retext = "example@example.com"
pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
result = re.fullmatch(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失敗")

7. 匹配手機號碼

import retext = "13800138000"
pattern = r'^1[3-9]\d{9}$'
result = re.fullmatch(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失敗")

8. 匹配日期格式(YYYY-MM-DD)

import retext = "2025-03-11"
pattern = r'^\d{4}-\d{2}-\d{2}$'
result = re.fullmatch(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失敗")

9. 替換所有數字為指定字符

import retext = "abc123def456"
pattern = r'\d+'
replacement = 'X'
result = re.sub(pattern, replacement, text)
print("替換結果:", result)

10. 分割字符串

import retext = "apple,banana,cherry"
pattern = r','
result = re.split(pattern, text)
print("分割結果:", result)

11. 提取 HTML 標簽中的內容

import rehtml = '<p>Hello, World!</p>'
pattern = r'<p>(.*?)</p>'
result = re.findall(pattern, html)
print("提取結果:", result)

12. 匹配中文

import retext = "你好,世界!"
pattern = r'[\u4e00-\u9fa5]+'
result = re.findall(pattern, text)
print("匹配結果:", result)

13. 匹配多個單詞中的任意一個

import retext = "cat dog elephant"
pattern = r'cat|dog'
result = re.findall(pattern, text)
print("匹配結果:", result)

14. 匹配重復的字符

import retext = "aaaaabbbccc"
pattern = r'(.)\1+'
result = re.findall(pattern, text)
print("匹配結果:", result)

15. 匹配不包含特定字符的字符串

import retext = "abcde"
pattern = r'[^abc]+'
result = re.findall(pattern, text)
print("匹配結果:", result)

16. 匹配單詞邊界

import retext = "The quick brown fox jumps"
pattern = r'\bfox\b'
result = re.search(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失敗")

17. 匹配 IP 地址

import retext = "192.168.1.1"
pattern = r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
result = re.fullmatch(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失敗")

18. 匹配 URL

import retext = "https://www.example.com"
pattern = r'^https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'
result = re.fullmatch(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失敗")

19. 統計匹配次數

import retext = "apple apple banana cherry apple"
pattern = r'apple'
matches = re.findall(pattern, text)
count = len(matches)
print("匹配次數:", count)

20. 使用編譯后的正則表達式進行匹配

import retext = "abc123def"
pattern = re.compile(r'\d+')
result = pattern.findall(text)
print("匹配結果:", result)

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

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

相關文章

【商城實戰(33)】解鎖版本迭代與更新策略

【商城實戰】專欄重磅來襲&#xff01;這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建&#xff0c;運用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用戶、商品、訂單等核心模塊開發&#xff0c;再到性能優化、安全加固、多端適配&#xf…

環境配置 | 5分鐘極簡Git入門:從零上手版本控制

你是否剛接觸Git&#xff1f;別擔心&#xff01;這篇指南將用最簡單的步驟帶你掌握Git核心操作&#xff0c;快速開啟版本控制之旅&#xff01;? 1.git在win10上的下載安裝 1.1.下載git 打開官方網站 Git - Downloadshttps://git-scm.com/downloads ? ?? 1.2.git安裝 …

計算機網絡——DNS

一、什么是DNS&#xff1f; DNS&#xff08;Domain Name System&#xff0c;域名系統&#xff09; 是互聯網的核心服務&#xff0c;負責將人類可讀的域名&#xff08;如 www.baidu.com&#xff09;轉換為機器可識別的 IP地址&#xff08;如 14.119.104.254&#xff09;。它像一…

SQLark 實戰 | 如何從Excel、csv、txt等外部文件進行數據導入

數據導入導出是應用開發者在平時開發中最常用的操作之一&#xff0c;SQLark 里提供了方便的圖形化界面來完成導入導出。本文先和大家分享如何從 Excel、csv、txt 等外部文件導入數據到數據庫表中。 &#x1f449; 前往 SQLark 官網&#xff1a;www.sqlark.com 下載全功能免費版…

docker無法正常拉取鏡像問題的解決

目錄 1.前言 2.解決方案 1.前言 安裝docker后拉取鏡像&#xff0c;遇見了如下問題&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded whil…

k8s系統學習路徑

學習 Kubernetes&#xff08;K8s&#xff09;需要循序漸進&#xff0c;結合理論知識和實踐操作。以下是學習 Kubernetes 的推薦步驟&#xff1a; 1. 先決條件 ? 掌握容器基礎&#xff1a;先學習 Docker&#xff0c;理解容器化概念&#xff08;鏡像、容器、倉庫&#xff09;、…

@RequestParam、@RequestBody、@PathVariable

1. RequestParam RequestParam&#xff1a;get請求時如果用不到它的3個屬性&#xff0c;可以省略&#xff1b;其他請求如果是通過param傳送數據&#xff0c;必須使用該注釋 要點&#xff1a; 可用于任何類型的請求&#xff08;get請求數據在請求行中&#xff0c; post請求數據…

麒麟系統利用pycharm生成deb文件

在麒麟系統&#xff08;Kylin OS&#xff09;上使用 PyCharm 進行 Python 開發并生成 .deb 可安裝軟件包&#xff0c;可以按照以下步驟進行操作&#xff1a; 1. 準備工作 安裝 PyCharm&#xff1a;確保已經在麒麟系統上安裝了 PyCharm&#xff0c;可以使用官方提供的安裝包進…

微信小程序接入DeepSeek模型(火山方舟),并在視圖中流式輸出

引言&#xff1a; DeepSeek&#xff0c;作為一款先進的自然語言處理模型&#xff0c;以其強大的文本理解和生成能力著稱。它能夠處理復雜的文本信息&#xff0c;進行深度推理&#xff0c;并快速給出準確的回應。DeepSeek模型支持流式處理&#xff0c;這意味著它可以邊計算邊輸…

釘釘(excel)能讓表格中不是‘北京’的字符串自動加亮顯示(方便查看)以及隔行填充嚴顏色是斑馬色(方便查看)嘛

在釘釘在線表格中&#xff0c;雖然功能相對Excel有所簡化&#xff0c;但仍然可以通過條件格式實現對特定內容的高亮顯示。以下是具體步驟&#xff1a; 一、在釘釘在線表格中設置條件格式 1. 打開釘釘在線表格 登錄釘釘&#xff0c;進入“釘釘在線表格”應用。 打開你需要操作…

Windows根據文件名批量在文件夾里查找文件并復制出來,用WPF實現的詳細步驟

項目前言 在日常工作和生活中&#xff0c;我們常常會遇到需要從大量文件中根據文件名批量查找特定文件并復制到指定位置的情況。手動一個個查找和復制文件不僅效率低下&#xff0c;還容易出錯。使用 Windows Presentation Foundation (WPF) 可以創建一個用戶友好的圖形界面應用…

PHP語法基礎

PHP語法基礎 一&#xff0c;變量 在PHP中&#xff0c;變量是存儲數據的容器&#xff0c;其靈活性和動態類型系統是PHP的核心特性之一。以下是PHP變量的詳細解析&#xff0c;涵蓋聲明、作用域、類型轉換及最佳實踐&#xff1a; 1. 變量基礎 聲明與命名規則 無需顯式聲明類型&…

Java 并發編程——BIO NIO AIO 概念

參考 Java 并發編程——BIO NIO AIO 概念 阻塞與非阻塞、同步與異步概念 系統調用、緩存、物理設備阻塞與非阻塞同步與異步 四種主要的 IO 模型 同步阻塞 IO同步非阻塞 IOIO 多路復用異步 IO select&#xff0c;poll&#xff0c;epoll 系統調用命令

探索Maas平臺與阿里 QWQ 技術:AI調參的魔法世界

摘要&#xff1a;本文介紹了藍耘 Maas 平臺在人工智能領域的表現及其核心優勢&#xff0c;包括強大的模型支持、高效的資源調度和友好的操作界面。文章還探討了藍耘 Maas 平臺與阿里 QWQ 技術的融合亮點及應用拓展實例&#xff0c;并提供了調參實戰指南&#xff0c;最后對藍耘 …

Python 實現大文件的高并發下載

項目背景 基于一個 scrapy-redis 搭建的分布式系統&#xff0c;所有item都通過重寫 pipeline 存儲到 redis 的 list 中。這里我通過代碼演示如何基于線程池 協程實現對 item 的中文件下載。 Item 結構 目的是為了下載 item 中 attachments 保存的附件內容。 {"crawl_tim…

MySQL與Canal、RabbitMQ集成指南

MySQL 部分 1. 查看是否開啟 binlog MySQL 8 默認開啟 binlog。可以通過以下命令查看是否開啟&#xff1a; SHOW VARIABLES LIKE log_bin;如果返回結果為 ON&#xff0c;則表示 binlog 已開啟。 Variable_nameValuelog_binON 2. 若未開啟 binlog&#xff0c;則需手動配置 …

X86 RouterOS 7.18 設置筆記十:上海電信IPTV使用msd_lite實現組播轉單撥

X86 j4125 4網口小主機折騰筆記五&#xff1a;PVE安裝ROS RouterOS X86 RouterOS 7.18 設置筆記一&#xff1a;基礎設置 X86 RouterOS 7.18 設置筆記二&#xff1a;網絡基礎設置(IPV4) X86 RouterOS 7.18 設置筆記三&#xff1a;防火墻設置(IPV4) X86 RouterOS 7.18 設置筆記四…

Select 選擇器選項位置偏移的解決方案

Select 選擇器選項位置偏移的解決方案 在使用 Select 組件時&#xff0c;可能會遇到下拉選項位置偏移的問題。這通常由 CSS 樣式、組件 渲染方式 或 父級元素的影響 造成。以下是詳細的排查步驟和解決方案。 一、常見原因 position: relative; 或 overflow: hidden; 影響下拉菜…

LeetCode 解題思路 17(Hot 100)

解題思路&#xff1a; 找到鏈表中點&#xff1a; 使用快慢指針法&#xff0c;快指針每次移動兩步&#xff0c;慢指針每次移動一步。當快指針到達末尾時&#xff0c;慢指針指向中點。遞歸分割與排序&#xff1a; 將鏈表從中點處分割為左右兩個子鏈表&#xff0c;分別對這兩個子…

數學建模歷程之初見

第一次接觸數學建模是在上大學前&#xff0c;當時只是聽過。起源于我在大學的老鄉群里聊天&#xff0c;由于當時年輕有點傻&#xff0c;說的話太多了&#xff0c;什么都問哈哈哈哈哈。 后來有個學長從老鄉群里加我&#xff0c;問我怎么話那么多&#xff0c;你們懂當時對我幼小…