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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...