python 正則替換_5分鐘速覽Python正則表達式常用函數!五分鐘就掌握它!

導讀:正則表達式是處理字符串類型的"核武器",不僅速度快,而且功能強大。本文不過多展開正則表達式相關語法,僅簡要介紹python中正則表達式常用函數及其使用方法,以作快速查詢瀏覽。

56982482d4c10769b1c0c2e8bd197bc1.png

01 Re概覽

Re模塊是python的內置模塊,提供了正則表達式在python中的所有用法,默認安裝位置在python根目錄下的Lib文件夾(如 ..PythonPython37Lib)。主要提供了3大類字符串操作方法:

  • 字符查找/匹配
  • 字符替換
  • 字符分割

由于是面向字符串類型的模塊,就不得不提到字符串編碼類型。re模塊中,模式串和搜索串既可以是 Unicode 字符串(常用str類型),也可以是8位字節串 (bytes,2位16進制數字,例如xe5), 但要求二者必須是同類型字符串。

02 字符串查找/匹配

  • 預編譯:compile

在介紹查找和匹配函數前,首先需要知道re的compile函數,該函數可以將一個模式串編譯成正則表達式類型,以便后續快速匹配和復用

import?repattern?=?re.compile(r'[a-z]{2,5}')type(pattern)?#re.Pattern

此例創建了一個正則表達式式對象(re.pattern),命名為pattern,用于匹配2-5位小寫字母的模式串。后續在使用其他正則表達式函數時,即可使用pattern進行方法調用。

  • 匹配:match

match函數用于從文本串的起始位置開始匹配,若匹配成功,則返回相應的匹配對象,此時可調用group()方法返回匹配結果,也可用span()方法返回匹配起止下標區間;否則返回None

import?repattern?=?re.compile(r'[a-z]{2,5}')text1?=?'this?is?a?re?test'res?=?pattern.match(text1)print(res)?#if?res:????print(res.group())?#this????print(res.span())?#(0,?4)text2?=?'是的,?this?is?a?re?test'print(pattern.match(text2))#None

match函數還有一個變形函數fullmatch,當且僅當模式串與文本串剛好全部匹配時,返回一個匹配對象,否則返回None

  • 搜索:search

match只提供了從文本串起始位置匹配的結果,如果想從任意位置匹配,則可調用search方法,與match方法類似,當任意位置匹配成功,則立即返回一個匹配對象,也可調用span()方法獲取起止區間、調用group方法獲得匹配文本串

import?repattern?=?re.compile(r's[a-z]{2}')text1?=?'this?is?a?re?test'res?=?pattern.search(text1)print(res)?#if?res:????print(res.group())?#is????print(res.span())?#(4,?7)pattern2?=?re.compile(r's[a-z]{5}')text2?=?'是的,this?is?a?re?test'print(pattern2.search(text2))#None

match和search均用于匹配單個結果,唯一區別在于前者是從起始位置開始匹配,而后者從任意位置匹配,匹配成功則返回一個match對象。

  • 全搜索:findall/finditer

幾乎是最常用的正則表達式函數,用于尋找所有匹配的結果,例如在爬蟲信息提取中,可非常方便地提取所有匹配字段

import?repattern?=?re.compile(r's[a-z]{2,5}')text1?=?'this?is?a?re?test'res?=?pattern.findall(text1)print(res)?#['?is',?'?re',?'?test']

findall返回的是一個列表對象類型,當無匹配對象時,返回一個空列表。為了避免因同時返回大量匹配結果占用過多內存,可以調用finditer函數返回一個迭代器類型,其中每個迭代元素是一個match對象,可繼續調用group和span方法獲取相應結果

import?repattern?=?re.compile(r's[a-z]{2,5}')text1?=?'this?is?a?re?test'res?=?pattern.finditer(text1)for?r?in?res:????print(r.group())"""?is?re?test"""

當匹配模式串較為簡單或者僅需單詞調用時,上述所有方法也可直接調用re類函數,而無需事先編譯。此時各方法的第一個參數為模式串。

import?repattern?=?re.compile(r'd{2,5}')text?=?'this?is?re?test're.findall('[a-z]+',?text) #['this', 'is', 're', 'test']

03 字符串替換/分割

  • 替換:sub/subn

當需要對文本串進行條件替換時,可調用re.sub實現(當然也可先編譯后再用調用實例方法),相應參數分別為模式串、替換格式、文本串,還可以通過增加缺省參數限定替換次數和匹配模式。通過在模式串進行分組,可實現字符串的格式化替換(類似字符串的format方法),以實現特定任務。

import?retext?=?'today?is?2020-03-05'print(re.sub('-',?'',?text))?#'today?is?20200305'print(re.sub('-',?'',?text,?1))?#'today?is?202003-05'print(re.sub('(d{4})-(d{2})-(d{2})',?r'2/3/1',?text))?#'today?is?03/05/2020'

re.sub的一個變形方法是re.subn,區別是返回一個2元素的元組,其中第一個元素為替換結果,第二個為替換次數

import?retext?=?'today?is?2020-03-05'print(re.subn('-',?'',?text))?#('today?is?20200305',?2)
  • 分割:split

還可以調用正則表達式實現字符串的特定分割,相當于.split()方法的一個加強版,實現特定模式的分割,返回一個切割后的結果列表

import?retext?=?'today?is?a?re?test,?what?do?you?mind?'print(re.split(',',?text))?#['today?is?a?re?test',?'?what?do?you?mind?']

04 總結

  • python中的re模塊提供了正則表達式的常用方法,每種方法都包括類方法調用(如re.match)或模式串的實例調用(pattern.match)2種形式
  • 常用的匹配函數:match/fullmatch
  • 常用的搜索函數:search/findall/finditer
  • 常用的替換函數:sub/subn
  • 常用的切割函數:split
  • 還有其他很多方法,但不是很常用,具體可參考官方文檔
  • 另外,python還有第三方正則表達式庫regex可供選擇

源碼獲取私信小編01哦

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

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

相關文章

MFC鼠標OnMouseHover使用

ON_WM_MOUSEHOVER消息要生效,要配合ON_WM_MOUSEMOVE一起使用.代碼如下:void CYuButton::OnMouseMove(UINT nFlags, CPoint point) {// TODO: 在此添加消息處理程序代碼和/或調用默認值TRACKMOUSEEVENT tme { 0 };tme.cbSize sizeof(TRACKMOUSEEVENT);tme.dwFlags TME_HOVER…

oracle 分組_大數據分組怎樣才會更快

分組是數據庫的常見運算,無論數據如何準備,通常都需要將所有數據遍歷。建立索引這時是不起作用的,存儲格式才是決定遍歷效率的主要因素。數據庫中數據的存放雖然是二進制格式的,但普遍IO性能差,庫內遍歷快,…

java下拉樹_參數模板中下拉樹級聯下拉數據集查詢

背景說明在參數表單的制作中會遇到各種各樣的需求,如為了方便參數的輸入,需要將輸入框設計成樹狀;若參數模板中有兩個輸入框,每個輸入框對應的參數有某種關系,前一個輸入框輸入參數后,后一個輸入框自動關聯…

java8 list 行轉列_太贊了,Intellij IDEA 竟然把 Java8 的數據流問題這么完美的解決掉了!

使用 IntelliJ IDEA 來幫忙構建你自己的實時模板連接分組《Java 2019 超神之路》《Dubbo 實現原理與源碼解析 —— 精品合集》《Spring 實現原理與源碼解析 —— 精品合集》《MyBatis 實現原理與源碼解析 —— 精品合集》《Spring MVC 實現原理與源碼解析 —— 精品合集》《Spr…

線程run方法和start方法的區別

區別 run() 只是一個普通的方法調用,不會開啟新的線程。 start() 會開啟新的線程,分配新的資源。里面的變量互不影響。 實例 package multithreading;public class MyThread extends Thread {String flag;public MyThread(String flag) {this.flag…

字典的拼接方法

剛看到覺得很簡單 試著用 d3 dict1 dict2 就解決了 結果 報類型錯誤 后來想去遍歷 在組合越想越麻煩 下面分享幾個方法 d1 {"name":"luoyong","age":36}d2 {"class":"AID1712","start":"python"}方…

python反射、閉包、裝飾器_python 閉包裝飾器(一)

一、閉包1.舉例defouter():x 10def inner(): #內部函數print(x) #外部函數的一個變量returninner#調用inner()函數的方法outer()() #法一fouter()f()#法二注意:inner()是局部變量,在全局范圍不可調用(即不能直接調用inner()函數),但是在法二中…

java list集合自定義排序_Java 通過 Comparator comparing 對 list 自定義 排序

摘要:在日常開發中,經常會用到排序算法,這里記錄下日常使用比較多的排序方法,其中包括按指定指定:正序、倒序排序,還有按自定義字段排序的方法,方便日后查看;一:按指定字…

beautifulsoup爬取網頁中的表格_用 Python 爬取網頁

來自公眾號:優達學城Udacity作者:Kerry Parker編譯:歐剃作為數據科學家的第一個任務,就是做網頁爬取。那時候,我對使用代碼從網站上獲取數據這項技術完全一無所知,它偏偏又是最有邏輯性并且最容易獲得的數據…

Java中Runnable和Thread的區別

概述 Runnable 是接口。 Thread 是類,且實現了Runnable接口。 Thread部分源碼 public class Threadimplements Runnable {private static class Caches{static final ConcurrentMap subclassAudits new ConcurrentHashMap();static final ReferenceQueue subcla…

python 神經網絡工具_神經網絡15分鐘入門!使用python從零開始寫一個兩層神經網絡...

本篇是該系列的第三篇,建議在閱讀本篇文章之前先看前兩篇文章。在本文中將使用python實現之前描述的兩層神經網絡,并完成所提出的“象限分類”的問題。需要注意的是,雖然標題叫做神經網絡15分鐘入門,但是到這篇文章,對…

12.3目錄結構

目錄結構 設計好目錄結構 可讀性高可維護性高比如一個Foo項目Foo/--- bin/--- foo--- foo/--- tests/--- _init__.py--- test_main.py--- init.py--- main.py---doc--- conf.py---abc.rst--- setup.py--- requirement.txt--- README簡要解釋一下: bin/:存放項目的一…

pyecharts添加文字_超燃的文字云效果,用Python就能輕松get!

本文轉載自公眾號:數據森麟(ID:shujusenlin)作者:葉庭云鏈接:https://blog.csdn.net/fyfugoyfa/ 01 / 詞云圖詞云圖是一種用來展現高頻關鍵詞的可視化表達,通過文字、色彩、圖形的搭配,產生有沖擊力地視覺效…

同步關鍵詞synchronized

概述 synchronized是java中的一個關鍵字,也就是說是Java語言內置的特性。 synchronized( 一個任意的對象(鎖) ){ 代碼塊中放操作共享數據的代碼。 } public synchronized int getIndex() {return 1;}public static synchronized int getN…

python連接mysql用哪個模塊_Python連接MySQL數據庫之pymysql模塊使用

Python3連接MySQL本文介紹Python3連接MySQL的第三方庫--PyMySQL的基本使用。PyMySQL介紹PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務器的一個庫,Python2中則使用mysqldb。Django中也可以使用PyMySQL連接MySQL數據庫。PyMySQL安裝pip install pymysql連接數據…

mysql 創建視圖 主鍵_MySQL數據庫基礎操作命令,本文助你更上一層樓!

今天介紹的是關于Mysql數據庫一些操作的基礎命令用戶與權限創建用戶mysql>create user test identified by BaC321#; 修改密碼5.5版本及以前的命令mysql>set password for testpassowrd(!1A2#3); 5.6及以上命令mysql>update mysql.user set authentication_stringpass…

mysql 聚合函數 怎么用在條件里_MySql 中聚合函數增加條件表達式的方法

Mysql 與聚合函數在一起時候where條件和having條件的過濾時機where 在聚合之前過濾當一個查詢包含了聚合函數及where條件&#xff0c;像這樣的情況select max(cid) from t where t.id<999這時候會先進行過濾&#xff0c;然后再聚合。先過濾出ID《999的記錄&#xff0c;再查找…

drbd(三):drbd的狀態說明

1.幾種獲取狀態信息的方法 drbd有很多獲取信息的方式。在drbd84和之前的版本&#xff0c;大多都使用cat /proc/drbd來獲取信息&#xff0c;多數情況下&#xff0c;這個文件展示的信息對于管理和維護drbd來說已經足夠。 例如以下是drbd84上兩個volume的節點狀態信息&#xff1a;…

Lock的lock()方法

ReentrantLock是JDK唯一實現了Lock接口的類 lock() 是平常使用得最多的一個方法&#xff0c;就是用來獲取鎖。如果鎖已被其他線程獲取&#xff0c;則進行等待。 由于在前面講到如果采用Lock&#xff0c;必須主動去釋放鎖&#xff0c;并且在發生異常時&#xff0c;不會自動釋放鎖…

Lock的tryLock()方法

概述 tryLock()方法是有返回值的&#xff0c;它表示用來嘗試獲取鎖&#xff0c;如果獲取成功&#xff0c;則返回true&#xff0c;如果獲取失敗&#xff08;即鎖已被其他線程獲取&#xff09;&#xff0c;則返回false&#xff0c;這個方法無論如何都會立即返回。在拿不到鎖時不…