Python正則表達式實戰指南

一 正則表達式庫

正則表達式是文本處理中不可或缺的強大工具,Python通過re模塊提供了完整的正則表達式支持。本文將詳細介紹re模塊中最常用的match()search()findall()函數,以及貪婪模式與非貪婪模式的區別,幫助讀者掌握Python中正則表達式的核心用法。

1. re.match()函數:從字符串開頭匹配

re.match()是正則表達式最基本的函數之一,它嘗試從字符串的起始位置匹配一個模式。

基本語法與參數

re.match(pattern, string, flags=0)
  • ?pattern?:要匹配的正則表達式字符串或預編譯的正則對象
  • ?string?:要匹配的目標字符串
  • ?flags?:可選標志,用于控制正則表達式的匹配方式

返回值特性

  • 匹配成功時返回Match對象
  • 匹配失敗時返回None

典型使用示例

import rea='1,2,3,4,5'result1=re.match('1,',a)#必須以這個參數開頭才行
result2=re.match('2',a)print(result1)    #返回match對象
print(result2)  #結果為空
<re.Match object; span=(0, 2), match='1,'>

其中span參數代表匹配成功 的起始和末尾的位置。match代表匹配的值為什么

2. re.search()函數:掃描整個字符串

match()不同,re.search()掃描整個字符串查找第一個匹配項,不限于字符串開頭。

基本語法

re.search(pattern, string, flags=0)

參數與match()相同,但行為不同。

import re
a='1,2,3,4,5,3'
result=re.search('3',a)  #可以不以這個參數開頭,但只返回第一個匹配的信息
print(result)
<re.Match object; span=(4, 5), match='3'>

?根據輸出結果我們可以看出,search()只返回了第一個查到的值的信息。

與match()的關鍵區別

特性re.match()re.search()
匹配位置僅字符串開頭字符串任意位置
使用頻率較少較多
性能稍快稍慢
典型用途驗證開頭格式查找內容

3. re.findall()函數:查找所有匹配項

re.findall()返回字符串中所有與模式匹配的非重疊匹配項列表。

基本語法

re.findall(pattern, string, flags=0)

返回值特點

  • 返回包含所有匹配子串的列表
  • 沒有匹配時返回空列表
  • 如果正則中有分組,則返回分組元組列表
import re
a='as1m,23f,asd3,23f,112'
res1=re.findall('2',a)
print(res1)
['2', '2', '2']

?可以看出,這個把匹配的所有結果都返回了,但我們也會發現,這個返回的是一個列表形式,很利于處理。

與match/search的區別

  • match:只在開頭查找單個匹配
  • search:在整個字符串查找單個匹配
  • findall:查找所有非重疊匹配

前面只是開胃小菜,下面請看他們結合正則表達式所展現的絢麗操作吧

4 表示字符范圍

????????先舉例子再說概念

import re
massage='pig98dog80'
res1=re.findall('[io]',massage)
res2=re.findall('[a-z]',massage)
res3=re.findall('[0-9]',massage)
print(res1)
print(res2)
print(res3)

輸出

['i', 'o']
['p', 'i', 'g', 'd', 'o', 'g']
['9', '8', '8', '0']

?根據上面實例我們可以看出

[io]所表示的是在這個字符串中,出現i或o都會被提取出來,類比,我們也可以想到[90]表示的不是90,而是表示這個‘9’和‘0’兩個字符

[a-z]所表示的是在這個字符串中,出現在a-z范圍中的都會被提取出來

[0-9]所表示的是在這個字符串中,出現在0-9范圍中的都會被提取出來

5 表示字符出現的次數

還是先舉例子再說概念

import remassage='abcdacdabb'
res=re.findall('ab*',massage)
print('ab*型:',res)res1=re.findall('ab+',massage)
print('ab+型:',res1)res2=re.findall('ab?',massage)
print('ab?型:',res2)

結果

ab*型: ['ab', 'a', 'abb']
ab+型: ['ab', 'abb']
ab?型: ['ab', 'a', 'ab']

?根據這個結果,在格式上我們可以看出區別,b后面跟的分別是*+?,然后結果也很明顯,第一種b分別出現了0,1,2次,第二種b分別出線了1,2次,第三種情況出現了1,0,1次

我們我們可以知道

ab*這種類型,可以提取*前面的數據(字母,數字,或者符號)出現任意次數的情況

ab+這種類型,可以提取*前面的數據(字母,數字,或者符號)最少出現一次的類型

ab*這種類型,可以提取*前面的數據(字母,數字,或者符號)出現0-1次的類型

import re
message='0123456'
mes=re.findall('^0',message)
mes1=re.findall('^6',message)
mes2=re.findall('0$',message)
mes3=re.findall('6$',message)
print('^0型',mes)
print('^6型',mes1)
print('0$型',mes2)
print('6$型',mes3)

輸出

^0型 ['0']
^6型 []
0$型 []
6$型 ['6']

?我們可以看出在對于同一串字符串,當0在行首時^0就可以識別出來有結果,^6就返回空值,同理$也是

所以

^所選這的是這個字符后面在行首的情況

$所選這的是這個字符前面在行尾的情況

res=re.findall('f[o]{3}',a)
res1=re.findall('f[o]{3,}',a)
res2=re.findall('f[o]{3,6}',a)
print(res)
print(res1)
print(res2)

?結果

['fooo']
['foooooooooooo']
['foooooo']

?這個我們可以看出[o]{3}就對于ooo,[o]{3,}結果就是取了全部的o,[o]{3,6}取了最大6個o

總結

ab*這種類型,可以提取*前面的數據(字母,數字,或者符號)出現任意次數的情況

ab+這種類型,可以提取*前面的數據(字母,數字,或者符號)最少出現一次的類型

ab*這種類型,可以提取*前面的數據(字母,數字,或者符號)出現0-1次的類型

^所選這的是這個字符后面在行首的情況

$所選這的是這個字符前面在行尾的情況

[o]{3} 表示3個

[o]{3,} 表示3個以上

{o]{3,6} 表示3-6個但一般沒有參數控制會是6個

6 表示同一類字符

正則表達式元字符詳解

以下是對常用正則表達式元字符的解釋和用法說明:

\d 匹配任意數字字符,等價于 [0-9]。例如匹配電話號碼中的數字部分。

\D 匹配任意非數字字符,等價于 [^0-9]。例如匹配非數字分隔符。

\s 匹配任意空白字符,包括空格、制表符、換行符等。例如匹配文本中的空格分隔符。

\S 匹配任意非空白字符。例如匹配連續的非空白文本。

\w 匹配任意單詞字符,包括字母、數字和下劃線,等價于 [A-Za-z0-9_]。例如匹配變量名。

\W 匹配任意非單詞字符。例如匹配特殊符號。

\b 匹配單詞邊界。例如精確匹配整個單詞 "the" 可以寫作 \bthe\b

\B 匹配非單詞邊界。例如匹配 "the" 但排除 "there" 中的 "the"。

\f 匹配換頁符(Form feed)。

\n 匹配換行符(Line feed)。

\r 匹配回車符(Carriage return)。

\v 匹配垂直制表符(Vertical tab)。

. 匹配除換行符外的任意單個字符。例如匹配 "a.c" 可以匹配 "abc"、"aXc" 等。

使用示例

// 匹配所有數字
a = "123abc".match(/\d/g); // ["1", "2", "3"]// 匹配非數字
b = "123abc".match(/\D/g); // ["a", "b", "c"]// 匹配空白字符
c = "a b\tc".match(/\s/g); // [" ", "\t"]// 匹配單詞邊界
d = "hello world".match(/\b\w+\b/g); // ["hello", "world"]

這些元字符可以組合使用構建更復雜的正則表達式模式,滿足各種文本匹配需求。

6. 貪婪模式與非貪婪模式

正則表達式中的量詞(如*, +, ?, {})默認采用貪婪匹配,會盡可能多地匹配字符。通過在量詞后添加?可啟用非貪婪匹配,盡可能少地匹配字符。

貪婪匹配示例

text = "Here is <div>sometext</div> with <div>tags</div>."
pattern = r'<.*>'
match = re.search(pattern, text)
print(match.group())  # 輸出: <div>sometext</div> with <div>tags</div>

非貪婪匹配示例

pattern = r'<.*?>'
matches = re.findall(pattern, text)
print(matches)  # 輸出: ['<div>', '</div>', '<div>', '</div>']

關鍵區別總結

模式表示方法匹配行為適用場景
貪婪*, +, ?, {}盡可能多匹配提取最大可能內容
非貪婪*?, +?, ??, {}?盡可能少匹配提取最小單位內容

綜合應用建議

  1. ?性能考慮?:對于頻繁使用的正則表達式,使用re.compile()預編譯可提高效率
  2. ?錯誤處理?:總是檢查匹配結果是否為None再調用group()
  3. ?模式選擇?:
    • 驗證字符串格式→match
    • 查找內容→search
    • 提取所有匹配→findall
  4. ?貪婪控制?:處理HTML/XML等嵌套結構時,非貪婪模式通常更安全

通過掌握這些核心函數和模式,您將能夠高效處理大多數文本匹配和提取任務。正則表達式雖然復雜,但一旦掌握將成為您文本處理的強大武器。

7 或和組

或用|表示

組用(表達式)

5實戰

讀取html中的內容

import re
f1=open(r'D:\培訓\中國城市名稱大全.html','r',encoding='utf-8')
f2=open('城市大全.csv1','w')
ls=[]
for line in f1:# <div class="para" label-module="para">鄭州市 洛陽市 焦作市 商丘市 信陽市 周口市 鶴壁市 安陽市 濮陽市 駐馬店市</div>res=re.findall('<div class="para" label-module="para">(.+)</div>', line)if len(res)>0:ls = ls+res# print(re.findall("para>(.+)<", line))
for i in ls:f2.write(str(i)+',')# print(i)
f1.close()
f2.close()

二 第三方庫?

第三方庫,我們用一般用 pip在cmd終端安裝,也可以在pycharm終端安裝。

主要通過

?

?我們還可以在后面加

-i https://pypi.tuna.tsinghua.edu.cn/simple

來使用清華源的鏡像源來安裝

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

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

相關文章

使用球體模型模擬相機成像:地面與天空的可見性判斷與紋理映射

在傳統相機模擬中&#xff0c;地面通常被建模為一個平面&#xff08;Plane&#xff09;&#xff0c;這在低空場景下是合理的。但在更大視場范圍或遠距觀察時&#xff0c;地球的曲率不可忽視。因此&#xff0c;我們需要將地面模型從平面升級為球體&#xff0c;并基于球面與光線的…

Agent自動化與代碼智能

核心問題&#xff1a; 現在很多團隊做AI系統有個大毛病&#xff1a;只顧追求“高大上”的新技術&#xff08;尤其是AI Agent&#xff09;&#xff0c;不管實際業務需不需要。 結果系統搞得又貴、又復雜、還容易出錯。大家被“Agent”這個概念搞暈了&#xff1a;到底啥時候用簡單…

SQL141 試卷完成數同比2020年的增長率及排名變化

SQL141 試卷完成數同比2020年的增長率及排名變化 withtemp as (selectexam_id,tag,date(submit_time) as submit_timefromexamination_infoleft join exam_record using (exam_id)wheresubmit_time is not null),2021_temp as (selecttag,count(*) as exam_cnt_21,rank() over…

C語言<數據結構-單鏈表>

鏈表是一種常見且重要的數據結構&#xff0c;在 C 語言中&#xff0c;它通過指針將一系列的節點連接起來&#xff0c;每個節點可以存儲不同類型的數據。相比數組&#xff0c;鏈表在插入和刪除元素時不需要移動大量數據&#xff0c;具有更好的靈活性&#xff0c;尤其適合處理動態…

archive/tar: unknown file mode ?rwxr-xr-x

這個是我在docker build報錯的&#xff0c;這是一個node.js項目。我猜你也是一個node.js下的項目&#xff0c;或者前端項目。 解決方法&#xff1a; .dockerignore里面寫一下node_modules就行了。 未能解決&#xff1a;archive/tar&#xff1a;未知文件模式&#xff1f;rwxr-…

【前端】ikun-markdown: 純js實現markdown到富文本html的轉換庫

文章目錄背景界面當前支持的 Markdown 語法不支持的Markdown 語法代碼節選背景 出于興趣,我使用js實現了一個 markdown語法 -> ast語法樹 -> html富文本的庫, 其速度應當慢于正則實現的同類js庫, 但是語法擴展性更好, 嵌套列表處理起來更方便. 界面 基于此js實現vue組…

【echarts踩坑記錄】為什么第二個Y軸最大值不整潔

目錄問題復現示意圖&#xff1a;解決方法有以下幾種&#xff1a;1. 在y軸配置中手動設置max屬性&#xff1a;2. 使用ECharts提供的坐標軸標簽格式化功能&#xff1a;&#x1f680;寫在最后問題復現示意圖&#xff1a; 今天在用echarts圖表的時候&#xff0c;出現了一個小問題。…

Duplicate cleaner pro 的使用技巧

Duplicate cleaner pro 的使用技巧前言文件去重基本介紹經驗之談目錄結構修改盤符起因方法手動分配方法?數據修改方法安裝sqlite-web修改數據庫GPU加速安裝驅動獲取驅動和硬件信息安裝CUDA配置環境變量&#xff08;如果是自定義安裝&#xff09;創建程序<1>獲取參數和命…

數字孿生技術引領UI前端設計新趨勢:增強現實與虛擬現實的融合應用

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;AR 與 VR 的 “割裂” 與數字孿生的 “融合” 契機增強現實&#xff08;AR&…

Qt使用dump文件記錄并查找軟件奔潰信息詳細教程

Qt使用dump文件記錄并查找軟件奔潰信息一、dump文件概述1、dump文件的基本概念2、dump文件的常見類型3、dump文件的分析工具4、dump文件的應用場景二、具體實現步驟1、下載dbghelp庫2、將庫添加到自己的工程中3、main.cpp添加代碼記錄奔潰日志4、編寫測試代碼5、測試6、結果查看…

UI前端與數字孿生結合案例分享:智慧城市的智慧能源管理系統

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;能源管理的 “數字孿生革命”智慧城市的能源系統正面臨 “供需失衡、損耗…

Android 16系統源碼_SplashScreen窗口的創建流程(一)

一 點擊桌面圖標觸發SplashScreen 1.1 點擊桌面圖標打開應用 點擊桌面的短信圖標&#xff0c;然后打開短信頁面&#xff0c;使用winscope獲取數據。從點擊短信圖標到應用內容完全展開&#xff0c;中間有出現一個標題帶有“Splash Screen”字符串的窗口。 二 Splash Screen窗口創…

線性代數學習筆記

矩陣 矩陣是一種非常重要的數學對象,它通常由一個由數字排成的矩形陣列來定義。一個矩陣由若干行和若干列組成,被稱為矩陣的行數和列數。一般情況下,矩陣的行數和列數分別用 n n n 和 m m m 表示。<

2025.7.13總結

每次寫日記&#xff0c;總覺得自我感受不是很好&#xff0c;腦子總會有許多消極思想。在網上&#xff0c;我曾看到一個關于“人生是一場巨大的事與愿違”&#xff0c;可能&#xff0c;真的是這個樣子吧。以前的我&#xff0c;有上進心&#xff0c;有目標感&#xff0c;腳踏實地…

linux-網絡-網絡管理發展歷程

Linux 的網絡管理機制經歷了多個階段的發展&#xff0c;從早期的靜態配置到現代動態管理工具的出現&#xff0c;反映了 Linux 系統在網絡連接、自動化和用戶體驗方面的不斷演進。以下是 Linux 網絡管理發展的主要階段&#xff1a;1. 早期的靜態網絡配置&#xff08;傳統方式&am…

華為 GaussDB :技術特性、應用局限與市場爭議

3-5月間&#xff0c;老夫在某學校帶了這門課&#xff0c;簡單總結一下課程外的看法&#xff1a;華為 GaussDB 作為華為云生態中的核心數據庫產品&#xff0c;自推出以來便承載著華為在數據基礎設施領域的戰略野心。其技術路線既延續了開源數據庫的兼容性優勢&#xff0c;又深度…

從零開始學習深度學習—水果分類之PyQt5App

一、項目背景?&#xff1a;本項目是“從零開始學習深度學習”系列中的第二個實戰項目&#xff0c;旨在實現第一個簡易App(圖像分類任務——水果分類)&#xff0c;進一步地落地AI模型應用&#xff0c;幫助初學者初步了解模型落地。基于PyQt5圖形界面的水果圖像分類系統&#xf…

小架構step系列13:測試用例的加載

1 概述測試用例的編寫要有一些基礎的規范&#xff0c;在本文先定義文件名稱和測試用例方法名的規范。2 文件加載原理先從源碼來看一下測試用例的文件加載原理。2.1 文件的匹配主要是通過注解來掃描測試用例。// 在IDEA測試用例啟動時&#xff0c;調用junit-platform-launcher-x…

K8S的CNI之calico插件升級至3.30.2

前言宿主機ping不通K8S的pod&#xff0c;一直存在丟包的現象&#xff0c;排查了防火墻、日志、詳細信息等沒發現什么問題&#xff0c;最后搜索發現&#xff0c;是因為把K8S的版本升級之后&#xff0c;舊版本的CNI插件不適配原因導致的&#xff0c;于是就把calico也一并升級并且…

Spring Boot RESTful API 設計指南:查詢接口規范與最佳實踐

Spring Boot RESTful API 設計指南&#xff1a;查詢接口規范與最佳實踐 引言 在 Spring Boot 開發中&#xff0c;查詢接口的設計直接影響著系統的可用性、可維護性和性能。本文將深入探討如何規范設計查詢接口&#xff0c;包括 GET/POST 的選擇、參數定義、校驗規則等&#xff…