python基礎學習14----正則表達式

来源:https://www.cnblogs.com/sfencs-hcy/archive/2018/09/13/9643713.html
-Advertisement-
Play Games

正則表達式是對字元串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字元串”,這個“規則字元串”用來表達對字元串的一種過濾邏輯。 在python中正則表達式被封裝到了re模塊,通過引入re模塊來使用正則表達式 re模塊中有很多正則表達式處理函數,首先用find ...


正則表達式是對字元串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字元串”,這個“規則字元串”用來表達對字元串的一種過濾邏輯。

在python中正則表達式被封裝到了re模塊,通過引入re模塊來使用正則表達式

re模塊中有很正則表達式處理函數,首先用findall函數介紹基本基本字元的含義

元字元有:.  \  *  +  ?  ^  $  |  {}  []  ()

findall函數

遍歷匹配,可以獲取字元串中所有匹配的字元串,返回一個列表

.  匹配任意除換行符"\n"外的字元

import re

temp=re.findall("a.c","abcdefagch")
print(temp)#['abc', 'agc']

*  匹配前一個字元0或多次

temp=re.findall("a*b","abcaaaaabcdefb")
print(temp)#['ab', 'aaaaab', 'b']

+  匹配前一個字元1次或無限次

temp=re.findall("a+b","abcaaaaabcdefb")
print(temp)#['ab', 'aaaaab']

?  匹配前一個字元0次或1次

temp=re.findall("a?b","abcaaaaabcdefb")
print(temp)#['ab', 'ab', 'b']

^  匹配字元串開頭。在多行模式中匹配每一行的開頭

temp=re.findall("^ab","abcaaaaabcdefb")
print(temp)#['ab']

$  匹配字元串末尾,在多行模式中匹配每一行的末尾

temp=re.findall("ab$","abcaaaaabcdefab")
print(temp)#['ab']

|  或。匹配|左右表達式任意一個,從左到右匹配,如果|沒有包括在()中,則它的範圍是整個正則表達式

temp=re.findall("abc|def","abcdef")
print(temp)#['abc', 'def']

{}  {m}匹配前一個字元m次,{m,n}匹配前一個字元m至n次,若省略n,則匹配m至無限次

temp=re.findall("a{3}","aabaaacaaaad")
print(temp)#['aaa', 'aaa']
temp=re.findall("a{3,5}","aaabaaaabaaaaabaaaaaa")
print(temp)#['aaa', 'aaaa', 'aaaaa', 'aaaaa']在獲取了3個a後,若下一個還是a,並不會得到aaa,而是算下一個a

[]  字元集。對應的位置可以是字元集中任意字元。字元集中的字元可以逐個列出,也可以給出範圍,如[abc]或[a-c]。[^abc]表示取反,即非abc,所有特殊字元在字元集中都失去其原有的特殊含義。用\反斜杠轉義恢復特殊字元的特殊含義。

temp=re.findall("a[bcd]e","abcdefagch")
print(temp)#[]此時bcd為b或c或d
temp=re.findall("a[a-z]c","abcdefagch")
print(temp)#['abc', 'agc']
temp=re.findall("[^a]","aaaaabcdefagch")
print(temp)#['b', 'c', 'd', 'e', 'f', 'g', 'c', 'h']
temp=re.findall("[^ab]","aaaaabcdefagch")
print(temp)#['c', 'd', 'e', 'f', 'g', 'c', 'h']a和b都不會被匹配

()  被括起來的表達式將作為分組,從表達式左邊開始每遇到一個分組的左括弧“(”,編號+1.分組表達式作為一個整體,可以後接數量詞。表達式中的|僅在該組中有效。

temp=re.findall("(abc){2}a(123|456)c","abcabca456c")
print(temp)#[('abc', '456')]
temp=re.findall("(abc){2}a(123|456)c","abcabca456cbbabcabca456c")
print(temp)#[('abc', '456'), ('abc', '456')]
#這裡有()的情況中,findall會將該規則的每個()中匹配到的字元創放到一個元組中

要想看到被完全匹配的內容,我們可以使用一個新的函數search函數

search函數

在字元串內查找模式匹配,只要找到第一個匹配然後返回,如果字元串沒有匹配,則返回None

 

temp=re.search("(abc){2}a(123|456)c","abcabca456c")
print(temp)#<re.Match object; span=(0, 11), match='abcabca456c'>
print(temp.group())#abcabca456c

 

\  轉義字元,使後一個字元改變原來的意思

反斜杠後邊跟元字元去除特殊功能;(即將特殊字元轉義成普通字元)

temp=re.search("a\$","abcabca456ca$")
print(temp)#<<re.Match object; span=(11, 13), match='a$'>
print(temp.group())#a$

引用序號對應的字組所匹配的字元串。

即下麵的\2為前邊第二個括弧中的內容,2代表第幾個,從1開始

a=re.search(r'(abc)(def)gh\2','abcdefghabc abcdefghdef').group()
print(a)#abcdefghdef

反斜杠後邊跟普通字元實現特殊功能;(即預定義字元)  

預定義字元有:\d \D \s \S \w \W \A \Z \b \B

預定義字元在字元集中仍有作用

\d  數字:[0-9]

temp=re.search("a\d+b","aaa234bbb")
print(temp.group())#a234b

\D  非數字:[^\d]

\s  匹配任何空白字元:[<空格>\t\r\n\f\v]

temp=re.search("a\s+b","aaa   bbb")
print(temp.group())#a   b

\S  非空白字元:[^\s]

\w  匹配包括下劃線在內的任何字字元:[A-Za-z0-9_]

\W  匹配非字母字元,即匹配特殊字元

temp=re.search("\W","$")
print(temp.group())#$

\A  僅匹配字元串開頭,同^

\Z  僅匹配字元串結尾,同$

\b  匹配\w和\W之間的邊界

temp=re.search(r"\bas\b","a as$d")
print(temp.group())#$as

\B  [^\b]

下麵介紹其他的re常用函數

compile函數

編譯正則表達式模式,返回一個對象的模式

 

rule = re.compile("abc\d+\w")
str = "aaaabc6def"
temp = rule.findall(str)
print(temp)#['abc6d']

 

match函數

在字元串剛開始的位置匹配,和^功能相同

 

temp=re.match("asd","asdfasd")
print(temp.group())#asd

 

 

 finditer函數

將所有匹配到的字元串以match對象的形式按順序放到一個迭代器中返回

 

temp=re.finditer("\d+","as11d22f33a44sd")
print(temp)#<callable_iterator object at 0x00000242EEEE9E48>
for i in temp:
    print(i.group())
#11
#22
#33
#44

 

split函數

用於分割字元串,將分割後的字元串放到一個列表中返回

如果在字元串的首或尾分割,將會出現一個空字元串

 

temp=re.split("\d+","as11d22f33a44sd55")
print(temp)#['as', 'd', 'f', 'a', 'sd', '']

 

使用字元集分割

如下先以a分割,再將分割後的字元串們以b分割,所以會出現3個空字元串

temp=re.split("[ab]","ab123b456ba789b0")
print(temp)#['', '', '123', '456', '', '789', '0']

sub函數 

將re匹配到的部分進行替換再返回新的字元串

temp=re.sub("\d+","_","ab123b456ba789b0")
print(temp)#ab_b_ba_b_

後邊還可以再加一個參數表示替換次數,預設為0表示全替換

subn函數

將re匹配到的部分進行替換再返回一個裝有新字元串和替換次數的元組

 

temp=re.subn("\d+","_","ab123b456ba789b0")
print(temp)#('ab_b_ba_b_', 4)

 

 

然後講一下特殊分組

temp=re.search("(?P<number>\d+)(?P<letter>[a-zA-Z])","ab123b456ba789b0")
print(temp.group("number"))#123
print(temp.group("letter"))#b

以?P<name>的形式起名

 

 

 

 

 最後說一下惰性匹配和貪婪匹配

temp=re.search("\d+","123456")
print(temp.group())#123456

此時為貪婪匹配,即只要符合就匹配到底

temp=re.search("\d+?","123456")
print(temp.group())#1

在後面加一個?變為惰性匹配,即只要匹配成功一個字元就結束匹配 

 

參考https://www.cnblogs.com/tina-python/p/5508402.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前陣子,我們分享了《 "Java中的基本數據類型轉換" 》這篇文章,對許多粉絲還是有帶來幫助的,今天講一下 Java 包裝類的的由來,及自動裝箱、拆箱的概念和原理。 什麼是包裝類型 Java 設計當初就提供了 8 種 基本數據類型及對應的 8 種包裝數據類型。我們知道 Java 是一種面向對象編程的 ...
  • 一.緩存雪崩現象 緩存雪崩一般是由某個緩存節點失效,導致其他節點的緩存命中率下降, 緩存中缺失的數據去資料庫查詢,短時間內造成資料庫伺服器崩潰, 重啟DB短期又被壓跨,但新數據的緩存也更新一些,DB反覆多次啟動多次,緩存重建完畢,DB才穩定運行,或者是由於緩存周期性的失效,比如緩存失效周期相同,在一 ...
  • c/c++ 標準容器 vector的記憶體空間是如何自動增長的 vector,string,deque的記憶體存儲機制:在一個連續的記憶體空間存儲,所以才支持下標操作。 vector的課題:由於容器的大小是可變的,當插入元素後,vector必須分配新的記憶體來保存已有元素和新的元素,將已有元素從舊的記憶體地址 ...
  • 版權聲明:本文為博主原創文章,未經允許不得轉載 引子 平常的文本處理工作中,我經常會遇到這麼一種情況:用python判斷一個string是否包含一個list里的元素。 這時候使用python的內置函數any()會非常的簡潔: any() 其實any函數非常簡單:判斷一個tuple或者list是否全為 ...
  • 單例概述 單例意即類在整個工程里只能有一個實例。單例通常應用在如下場景中,類的構造是一個非常耗時的過程,並且,它沒有多次構造的必要性。例如。你可以打開一個資料庫連接,只在此連接上進行資料庫操作。 那麼怎確保它在整個工程中只有一個實例呢?我們可以通過將構造函數的訪問許可權設置為private,並輔助其它 ...
  • java基礎: 1、==和equals的區別: 基本類型和引用類型 ==用來比較值,equals是比較對象的引用,即是否指向同一個對象? String str1 = new String("hello");String str2 = new String("hello"); System.out.p ...
  • 題目:括弧匹配 題目來源:https://blog.csdn.net/lizi_stdio/article/details/76618908 題目介紹:輸入一個字元串,裡面可能包含“()”、“ [ ] ”、" { } "三種括弧,要求程式判斷這個字元串里的括弧是否成對出現且嵌套關係正確,若成對出現且 ...
  • c/c++ 標準容器 forward_list, resize, 重新定位迭代器 1,forward_list特有的方法: + insert_after + emplace_after + erase_after 2,容器的插入刪除操作後的註意事項 + 必須保證每次改變容器的操作後都正確地重新定位迭 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...