python正則表達式re(Regular Expression)

目錄

?正則表達式:

match()函數:

search()函數:

findall()函數:

正則表達式的參數:

表示字符范圍的參數:

表示字符出現的次數的參數:

表示同一類字符的參數:

貪婪和非貪婪模式:

或和組:

sub()和complie()方法:


?正則表達式

正則表達式(Regular Expression,re)是一種用于對字符串類型數據 進行高效的搜索、替換的操作。

其主要的匹配字符串的函數有三種:match(), search(),findall()

函數匹配范圍返回結果常見用途
match()字符串起始位置匹配的對象 或?None驗證字符串是否以特定字符開頭
search()整個字符串第一個匹配的對象 或?None查找字符串中是否存在某個字符
findall()整個字符串所有匹配的字符串 或 元組列表提取文本中所有符合條件的內容

match()函數:

1.

import re
message = '張三、李四、王五、趙六'
result = re.match('張三',message) #從參數2中查找滿足參數1的內容
print(result)

運行結果:

<re.Match object; span=(0, 2), match='張三'>

解析:re.match()從字符串起始位置匹配正則表達式。此處 “張三” 位于message開頭,匹配成功,返回包含匹配位置(span=(0,2))和匹配內容的Match對象。


2.

import re
message = '張三、李四、王五、趙六'
result = re.match('三',message) #起始位置匹配不成功的話,就返回none
print(result)

運行結果:

None

解析:re.match()僅從字符串開頭匹配。message開頭是 “張”,而非 “三”,匹配失敗,返回None

search()函數:

import re
message = '張三、李四、王五、趙六、王五'
result = re.search('王五',message)
print(result)

運行結果:

<re.Match object; span=(6, 8), match='王五'>

解析:re.search()在字符串任意位置查找第一個匹配的項。第一個 “王五” 位于索引 6-8 的位置,因此返回該位置的匹配對象。

findall()函數:

import re
message = '張三、李四、王五、趙六、王五'
result = re.findall('王五',message)#從參數2中查找滿足參數1的所有內容
print(result)

運行結果:

['王五', '王五']

解析:re.findall()返回所有匹配的內容,以列表形式呈現。message中出現兩次 “王五”,因此列表包含兩個元素。

正則表達式的參數:

表示字符范圍的參數:

[abc]:字符集合匹配,即匹配 abc 中的 任意一個字符。

[a-z]:范圍匹配,即匹配指定范圍內的 任意一個字符。

import re
message = 'Python93,C87,Java63,C++88'
result_1 = re.search('[cn]',message)
result_2 = re.findall('[0-9]',message)
result_3 = re.findall('[cn][0-9]',message)  # 匹配字母c或n后接數字的組合
print(result_1,result_2,result_3)

運行結果:

<re.Match object; span=(5, 6), match='n'> 
['9', '3', '8', '7', '6', '3', '8', '8'] ['n9']

解析:

  • [cn]匹配字母cnmessage中第一個符合的是Python中的n(索引 6)。
  • [0-9]匹配所有數字,提取出字符串中所有單個數字。
  • [cn][0-9]匹配cn后接數字的組合,僅Python93中的n9符合。

表示字符出現的次數的參數:
符號含義示例與等價形式
*匹配前面的子表達式任意次(≥0 次)。ab*?可匹配 "a", "ab", "abb" 等。
+匹配前面的子表達式至少一次(≥1 次)。ab+?可匹配 "ab", "abb",但不匹配 "a"。
?匹配前面的子表達式零次或一次(0 或 1 次)。ab??可匹配 "a" 或 "ab"。
^匹配輸入字符串的開始位置。^Hello?僅匹配以 "Hello" 開頭的字符串。
$匹配輸入字符串的結束位置。world$?僅匹配以 "world" 結尾的字符串。
{n}精確匹配前面的子表達式 n 次(n 為非負整數)。a{3}?僅匹配 "aaa"。
{n,}至少匹配前面的子表達式 n 次(n 為非負整數)。a{2,}?可匹配 "aa", "aaa" 等。
{n,m}最少匹配 n 次且最多匹配 m 次(n ≤ m,且均為非負整數)。a{1,3}?可匹配 "a", "aa", "aaa"。

示例1:

import re
message = 'da2a7ddbre77yifed777ttt3fefd7777b'
result = re.findall('[a-z]*[0-9][a-z]',message)
print(result)  
result = re.findall('[a-z]+[0-9][a-z]',message)
print(result) 
result = re.findall('[a-z]?[0-9][a-z]',message)
print(result) 

運行結果:

['da2a', '7d', '7y', '7t', 'tt3f', '7b']
['da2a', 'ttt3f']
['a2a', '7d', '7y', '7t', 't3f', '7b']

解析:正則表達式[a-z]*[0-9][a-z]表示:

  • [a-z]*:0 個或多個小寫字母;
  • [0-9]:1 個數字;
  • [a-z]:1 個小寫字母。
    匹配結果為包含 “數字前后有字母” 的片段。

示例2:

import re
phone_num = input("請輸入您的手機號碼:")
result = re.findall('^1[0-9]{10}$',phone_num)
print(result)

運行結果(輸入13155558888時):

['13155558888']

解析:正則^1[0-9]{10}$驗證手機號:

  • ^1:以 1 開頭;
  • [0-9]{10}:緊跟 10 個數字;
  • $:結束符(確保無多余字符)。
    匹配成功返回手機號列表,失敗返回空列表。

錯入輸入無法匹配:

如果去掉 "$" ,就不再有輸入位數限制:(即匹配足夠的數字后停止)

示例3:

import re
QQ_number = input("請輸入您的QQ號:")
result = re.match('[1-9][0-9]{4,10}$',QQ_number)
print(result)

運行結果(輸入123456時):

<re.Match object; span=(0, 6), match='123456'>

解析:正則[1-9][0-9]{4,10}$驗證 QQ 號:

  • [1-9]:首位不為 0;
  • [0-9]{4,10}:后續 4-10 個數字(總長度 5-11 位)。
    re.match()從開頭匹配,符合則返回匹配對象,否則返回None

示例4:

import re
use_name = input("請輸入您的用戶名:")
result = re.findall('^[A-Za-z_][A-Za-z0-9_]{7,}$',use_name)
print(result)

運行結果(輸入User_1234時):

['User_1234']

解析:正則驗證用戶名規則:

  • 首位為字母或下劃線;
  • 后續為字母、數字或下劃線,且總長度≥8 位。
    匹配成功返回用戶名列表,否則返回空列表。

?錯誤輸入無法匹配:

表示同一類字符的參數:
元字符描述等價于
\d匹配一個數字類字符[0-9]
\D匹配一個非數字類字符(^ 在中括號中表示 “非”)[^0-9]
\s匹配任何不可見字符,包括空格、制表符、換頁符等[\f\n\r\t\v]
\S匹配任何可見字符[^\f\n\r\t\v]
\w匹配包括下畫線的任何單詞字符[A-Za-z0-9_]
\W匹配任何非單詞字符[^A-Za-z0-9_]
\b匹配一個單詞的邊界,即單詞和空格間的位置
\B匹配非單詞邊界
\f匹配一個分頁符
\n匹配一個換行符
\r匹配一個 Enter 鍵符
\t匹配一個制表符
\v匹配一個垂直制表符
.匹配除 “\n” 和 “\r” 之外的任何單個字符

示例1:

import re
use_name = input("請輸入您的用戶名:")
result = re.findall('^[A-Za-z_]\w{7,}$',use_name)
print(result)

運行結果(輸入User_1234時):

['User_1234']

解析:\w任何單詞字符等價于[A-Za-z0-9_]

示例2:

import re
message = 'verb very never every aer_'
result = re.findall(r'\w+er\B',message)
print(result)

運行結果:

['ver', 'ver', 'ever', 'aer']

解析:

\w+er:匹配以er結尾的單詞片段;

\B:非單詞邊界(即er后緊跟其他字符,不是空格或結尾)。

示例3:

import re
message = 'verb very never every'
result = re.findall('.e',message)
print(result)

運行結果:

['ve', 've', 'ne', 've', ' e', 've']

解析:.匹配任意字符(除換行、回車),'e'匹配字母e,因此.e匹配 “任意字符 + e” 的組合。

貪婪和非貪婪模式:

貪婪模式:

嘗試匹配盡可能多的字符,只要滿足表達式要求都會匹配最多的字符

非貪婪模式:

一旦滿足表達式要求就不再繼續匹配。在次數限制操作符后面加上“?”可以將匹配模式轉換為非貪婪模式。

示例1:

import re
message = 'ccc739134792hdccc1'
result = re.findall('ccc\d+',message)
print(result)

運行結果:

['ccc739134792', 'ccc1']

解析:\d是數字類字符,+是>=1次。為貪婪模式,匹配盡可能多的數字。

示例2:

import re
message = 'ccc739134792hd'
result = re.findall('ccc\d+?',message)
print(result)

運行結果:

['ccc7']

解析:\d是數字類字符,+是>=1次,?是0次或1次,三者結合后意思是匹配 一個數量類字符。為非貪婪模式

如果去掉加號:

或和組:

示例1:

或:符合兩種情況的匹配

import re
message = 'verb very never every'
result = re.findall('\w+ev|\w+ry',message)
print(result)

運行結果:\w包括下畫線的任何單詞字符

['very', 'nev', 'every']

示例2:

將()中的表達式定義為組,并且將匹配這個表達式的字符保存到一個臨時區域,即捕獲匹配的內容

import re
message = 'verb very never every'
result = re.findall("e(.+)(.)r",message)
print(result)

運行結果:

[('rb very never ev', 'e')]

解析:()表示分組,e(.+)(.)r匹配:

  • e開頭,以r結尾;
  • 第一個分組(.+):匹配er之間的多個字符;
  • 第二個分組(.):匹配r前的單個字符。

sub()和complie()方法:

示例1:

re.sub()?用于在字符串中查找匹配正則表達式的部分,并替換為指定的內容

import re
content ='dh932hf9f934hfnf39d'
content = re.sub('\d','0',content)
print(content)

運行結果:

dh000hf0f000hfnf00d

解析:re.sub('\d','0',content)將字符串中所有數字(\d)替換為0,非數字字符保持不變。

示例2:

re.compile()?用于?預編譯正則表達式,提高多次匹配時的效率(避免重復解析正則表達式)。

import re
contentl ='2020 12 15 12:00'
pattern = re.compile('\d{2}:\d{2}')
print(pattern.findall(contentl))  

運行結果:

['12:00']

解析:re.compile('\d{2}:\d{2}')編譯正則表達式(匹配 “兩位數字:兩位數字” 的時間格式),再通過pattern.findall()從字符串中提取所有符合格式的內容,此處僅12:00符合。

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

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

相關文章

事件驅動設計:Spring監聽器如何像咖啡師一樣優雅處理高并發

架構哲學&#xff1a;當咖啡店面對洶涌客流時&#xff0c;真正的優雅不是更快的動作&#xff0c;而是科學的協作機制。Spring事件驅動正是通過發布-訂閱模式&#xff0c;讓系統像頂級咖啡師般從容應對突發流量。一、從咖啡店看監聽器本質&#xff1a;3大核心組件拆解 場景還原&…

C++ const 關鍵字解析

const 是 C 中用于定義常量或指定不可變性的關鍵字&#xff0c;它在不同上下文中有不同的含義和用法。下面是對 const 的全面解析&#xff1a;1. 基本用法定義常量const int MAX_SIZE 100; const double PI 3.14159;這些值在程序運行期間不能被修改必須在定義時初始化與指針結…

[es自動化更新] Updatecli編排配置.yaml | dockerfilePath值文件.yml

鏈接&#xff1a;https://github.com/elastic/elasticsearch/tree/main/build-conventions elasticsearch自動化更新 本專欄使用updatecli實現自動化版本更新與依賴管理。 其配置通過編排文件&#xff08;updatecli-compose.yaml&#xff09;實現&#xff0c;該文件羅列了稱…

新手向:使用Python將多種圖像格式統一轉換為JPG

本文將詳細解析一個專業的Python腳本&#xff0c;它能夠將指定文件夾中的所有非JPG格式圖像批量轉換為JPG格式。這個腳本雖然代碼量不大&#xff0c;但包含了文件操作、圖像處理、異常處理等多個重要編程概念&#xff0c;非常適合初學者系統學習。環境準備在開始之前&#xff0…

深入剖析C++ RPC框架原理:有棧協程與分布式系統設計

深入剖析C RPC框架原理&#xff1a;有棧協程與分布式系統設計 &#x1f6e0;? 第一部分&#xff1a;RPC框架核心原理與技術架構 &#x1f310; 1.1 RPC在分布式系統中的核心地位 遠程過程調用&#xff08;RPC&#xff09;是現代分布式系統的基石&#xff0c;它實現了&#xf…

基于springboot+Vue的二手物品交易的設計與實現

基于springbootVue的二手物品交易的設計與實現 作者&#xff1a; Mr順 | 某大廠全棧開發工程師 | CSDN新星計劃導師 | Java領域優質創作者 技術棧&#xff1a; SpringBoot, JavaWeb, 數據庫等。精通Java、微信小程序開發。 項目亮點&#xff1a; 完整可運行&#xff1a; 提供…

騰訊云輕量服務器創建快照免費API接口教程

接口簡介 該API用于騰訊云輕量服務器系統盤快照創建&#xff0c;無需關機即可自動刪除舊快照并創建新快照。特點包括&#xff1a; 不占用騰訊云快照配額支持自動備份策略適用于定時備份任務僅支持系統盤快照&#xff08;云硬盤需調用專用接口&#xff09; ?請求地址? https…

C++中的智能指針(1):unique_ptr

一、背景普通指針是指向某塊內存區域地址的變量。如果一個指針指向的是一塊動態分配的內存區域&#xff0c;那么即使這個指針變量離開了所在的作用域&#xff0c;這塊內存區域也不會被自動銷毀。動態分配的內存不進行釋放則會導致內存泄漏。如果一個指針指向的是一塊已經被釋放…

HTTPS安全機制:從加密到證書全解析

目錄 1.HTTPS是什么 2.加密是什么 3.HTTPS的加密過程 3.1對稱加密 3.2非對稱加密 4.引入證書 4.1"中間人"攻擊 4.2 引入證書機制 4.3 理解數據簽名 4.4 非對稱加密 對稱加密 證書認證 5.常見問題 5.1 Fiddler等抓包工具&#xff0c;為啥能解析HTTPS的數據…

2024年深度學習技術主要發展分析

摘要&#xff1a;深度學習作為人工智能領域的戰略級技術&#xff0c;在2024年持續取得突破性進展&#xff0c;持續重構現代戰爭規則&#xff0c;成為大國軍事智能化競爭的核心角力點。對2024年深度學習技術熱門領域的主要發展進行了綜合評述。研究了深度學習技術的發展現狀&…

Swift 枚舉:深入理解與高效使用

Swift 枚舉:深入理解與高效使用 引言 Swift 枚舉(Enum)是 Swift 編程語言中的一種基本數據類型,它允許我們將一組相關的值組合在一起。枚舉在 Swift 中有著廣泛的應用,從簡單的數據分類到復雜的業務邏輯處理,枚舉都能發揮巨大的作用。本文將深入探討 Swift 枚舉的原理、…

從大模型到云游戲,國鑫SY8108G-G4如何化身“全能AI引擎”?

當大模型參數量突破萬億級&#xff0c;傳統服務器在散熱枷鎖與擴展瓶頸前舉步維艱。國鑫全新推出的 SY8108G-G4 8U8卡AI服務器 &#xff0c;以顛覆性架構支持8張600W GPU全速并行&#xff0c;結合CPU-GPU直連、冗余電源和彈性擴展三大優勢&#xff0c;為AI訓練、生成式創作、數…

在多個DHCP服務器的網絡環境中選擇指定的DHCP服務

問題 學校有兩個網絡&#xff0c;我電腦網線插在同一個交換機的同一個接口上&#xff0c;有時候獲取的是172.27開頭的IP&#xff0c;有時候獲取的是192.168開頭的IP。 通常第一次開機獲取的是172.27的IP&#xff0c;插拔網線或重啟網絡接口后會變為192.168的IP。 兩個網絡各有…

【Nginx】實測Nginx增加第三方主動式健康檢查模塊

一、環境說明系統版本&#xff1a;CentOS 7.9內核版本&#xff1a;3.10.0-1160.119.1Nginx版本&#xff1a;1.26.3第三方檢測模塊及版本&#xff1a;nginx_upstream_check_module&#xff08;v0.4.0&#xff0c;兼容nginx 1.20&#xff09;二、nginx安裝部署2.1 下載檢測模塊目…

pytest中mark的使用

在pytest中&#xff0c;mark&#xff08;標記&#xff09;是用于對測試用例進行分類、篩選或附加元數據的重要功能。以下是其核心使用方法&#xff1a; 1. ?基本標記定義與使用? ?注冊標記?&#xff1a;在pytest.ini中預先定義標記&#xff08;避免運行時警告&#xff09;&…

STM32N6--NPU簡單介紹

關鍵詞&#xff1a;STM32N6、生物神經元、神經網絡處理單元&#xff08;NPU&#xff09;、數據流處理 參考鏈接&#xff1a; RM0486 Reference manual STM32N647/657xx Arm-based 32-bit MCUsST_中文論壇【資料合集】STM32N6超全資料合集&#xff08;定期更新&#xff09;B站_…

一款開源免費、通用的 WPF 主題控件包

前言 今天大姚給大家分享一款開源免費&#xff08;MIT License&#xff09;、通用的 WPF 主題控件包&#xff1a;Rubyer WPF。 WPF介紹 WPF是一個強大的桌面應用程序框架&#xff0c;用于構建具有豐富用戶界面的 Windows 應用。它提供了靈活的布局、數據綁定、樣式和模板、動…

windows安裝python環境以及對應編輯器的詳細流程

windows安裝python環境以及對應編輯器的詳細流程 一、安裝 Python 環境 步驟 1&#xff1a;下載 Python 安裝包 訪問 Python 官網&#xff1a;https://www.python.org/downloads/windows/選擇最新穩定版本&#xff08;如 Python 3.12.x&#xff09;&#xff0c;點擊 Download W…

高保真組件庫:下拉多選

制作一個高保真的下拉多選需要具備多種交互事件。 拖拽一個文本框并命名為“下拉文本輸入框”和一個向下的箭頭組合在一起,外觀上看起來是下拉組件。為了美觀調整一些邊框顏色、圓角、文字左邊距等。 拖拽一個矩形作為下拉選項的容器,啟動陰影xy都為0 制作下拉選項:拖拽一個…

sqli-labs靶場通關筆記:第1-4關 聯合注入

第1關&#xff1a;單引號閉合1.這是第1關的界面&#xff0c;讓我們以id作為參數輸入&#xff0c;方式為數值&#xff0c;這里輸入?id1看一下。2.顯示了id1的用戶名和密碼。分析&#xff1a;在sql注入漏洞中&#xff0c;第一步是要尋找注入點&#xff0c;即可以輸入參數的地方&…