本文目錄一覽:
Python正則表達式之re.match()
我們在面對生物數據,比如序列信息(比如鹼基序列、氨基酸序列等)的時候, 會時常要問,這其中是否包含着且含有多少某種已知的模式,一段DNA中是否包含轉錄起始特徵TATA box、一段RNA中是否包含某種lncRNA、一段肽鏈中是否包含鋅指結構等等;另一方面,我們在操作數據時,會時常遇到諸如把某個字符(對象)換成另一種字符(對象)的替換操作,而其本質還是如何搜索符合某種(替換)模式的對象。
在這些幾乎天天都可以碰到的 模式匹配/搜索問題中,正則表達式就是一把解決問題的利劍!
在Python的re模塊中,常用的有四個方法(match、search、findall、finditer)都可以用於匹配字符串,今天我們先來了解一下re.match()。
re.match()必須從字符串開頭匹配! match方法嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。主要參數如下:
舉個栗子來理解一下它的用法:
運行結果:
從例子中我們可以看出,re.match()方法返回一個匹配的對象,而不是匹配的內容。通過調用span()可以獲得匹配結果的位置。而如果從起始位置開始沒有匹配成功,即便其他部分包含需要匹配的內容,re.match()也會返回None。
一般一個小括號括起來就是一個捕獲組。我們可以使用group()來提取每組匹配到的字符串。
group()會返回一個包含所有小組字符串的元組,從 0 到 所含的小組號。
直接調用groups()則直接返回一個包含所有小組字符串的元組,從 1 到 所含的小組號。
再舉一個栗子:
運行結果:
Python 標準庫模塊 – re
正則表達式引擎對正則表達式文本進行編譯生成正則表達式對象,再由正則表達式對象對目標文本進行匹配,後返回匹配結果。
正則表達式中一共包含 2 中字符: 普通字符 、 元字符
匹配單個字符的元字符及其含義:
匹配重複性的元字符及其含義:
匹配位置的元字符及其含義:
分組匹配的元字符及其含義:
表示或運算的元字符:
轉義元字符:
在 Python 中使用正則表達式,我們需要藉助 re 模塊提供的強大 API,下面我們就來學習幾個 re 模塊常用的接口吧~
參數說明: findall(“正則表達式”, “要匹配的字符串”, flags=標誌1|標誌2|…)
返回值:以列表形式返回匹配到的字符串。
下面,我們用 findall 返回 Python 之禪中首尾用到的反義詞:
運行結果:
當正則表達式中含有一個以上分組時, findall 返回的列表由元組構成,元組中包含每個分組匹配到的內容。如果只有一個分組,則返回由該分組匹配到的內容組所構成的列表:
match 函數返回的結果是一個 SRE_Match 對象:
SRE_Match 具有很多的屬性,比如 .string 屬性可以方便我們我獲取在匹配時輸入的字符串:
屬性 .re 可以獲取匹配時使用的編譯後的正則表達式模式:
由於默認使用了 re.UNICODE ,所以我們這裡的 \w 可以匹配中文字符。
屬性 .regs 則以列表的形式返回正則表達式匹配到的內容以及各個分組陪陪到的內容,不過請注意,返回的都是索引的形式:
可以使用序列切片來看一下我們的正則表達式及其中的兩個分組所匹配到的內容:
SRE_Match 對象也提供了非常多好用的方法,比如 groups 可以獲取各個分組匹配到的內容:
group 則可以靈活地獲取正則表達式或對應分組匹配到的內容:
如果使用的正則表達式定義了分組的名稱, group 還可以通過名稱獲取相應分組匹配的內容:
在定義了分組的名稱之後,還可以方便地使用 groupdict 以字典的形式返回所有分組匹配的結果:
最後需要注意的是, match 從字符串的開頭開始匹配,如果開頭不符合要求,則直接返回 None 。
與 match 匹配開頭不同, search 匹配第一個符合規則的字符串,未成功則返回 None 。參數: re.search(pattern, string, flags=0) ;返回值同 match 。
在介紹 match 的使用時,最後一個例子,由於我們在字符串前面添加了 ‘PYTHON’ 導致 match 使用原來的正則表達式無法匹配,返回 None 。此時,使用 search 就可以迎刃而解啦:
運行結果:
小結:
參數: re.split(pattern, string, maxsplit=0, flags=0) , split 功能非常強大,以正則表達式匹配到的標誌來分隔字符串,比如下面這樣一個混亂的字符串,我們要提取其中所有的數字:
下面,我們就來詳細介紹一下 split 的用法。
首先,是以單字符切割:
以分號切割時,共產生了 4 個子字符串,放在列表中返回。
下面,還是以單字符切割,但可以使用正則表達式中的 [] 來指定多種字符:
由於字符串 line 中有連續的 2 個分號,逗號或者空格,因此可以使用 [;\s,]+ 來切割:
最後,上面的字符串在切割時,分隔符都沒有被保留下來,使用括號捕獲分組,即可保留分隔符:
re.sub 提供比字符串的 replace 方法更加強大的功能:對於輸入的字符串 string ,利用正則表達式 pattern 強大的字符串處理功能,實現複雜的字符串替換處理為 repl ,返回被替換後的字符串。
下面的例子中,我們將句子中多餘的空格和數字去掉:
如果想要知道替換過程中,共發生了多少次替換,可以使用 subn :
小結:
上述的案例中,我們每次都需要傳入正則表達式,相應的函數每次在調用時,都需要編譯一次正則表達式。如果上述過程需要多次重複,那麼每次都去耗費時間編譯正則表達式是很不划算的。
re 模塊為我們提供了 compile 函數,用來編譯正則表達式模式,返回編譯好模式。因此,可以把那些常用的正則表達式編譯成正則表達式對象,以提高效率。
格式: re.compile(pattern, flags=0) ,其中 pattern 為編譯時用的表達式字符串, flags 為編譯標誌位,用於修改正則表達式的匹配方式,如:是否區分大小寫,多行匹配等。常用的 flags 有:
註:使用按位或 | 連接多個 flags 。
我們上述介紹的 re 模塊的匹配、分割、替換函數, compile 函數的返回值類提供了相應的方法,使用方式類似,只是不需要傳入正則表達式字符串而已。
由於用法幾乎一致,這裡就不一一舉例啦~
貪婪模式 : * + ? {m,n} ,正則表達式的重複默認總是儘可能多得向後匹配內容。
非貪婪模式 : *? +? ?? {m,n}? ,儘可能少的匹配內容。
Python re正則表達式模塊及其用法
1.第一個參數是正則表達式,這裡為”(\w+)\s”,如果匹配成功,則返回一個Match,否則返回一個None;
2.第二個參數表示要匹配的字符串;
3.第三個參數是標緻位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。 re.search函數會在字符串內查找模式匹配,只到找到第一個匹配然後返回,如果…
4.第四個參數指替換個數。默認為0,表示每個匹配項都替換。 re.sub還允許使用函數對匹配…
Python模塊的幾種類型簡介
1、系統內置模塊
os模塊:os模塊包含普遍的操作系統功能
sys模塊:提供了一系列有關Python運行環境的變量和函數
random模塊:random模塊用於生成隨機數
time 模塊: 主要包含各種提供日期、時間功能的類和函數
datetime模塊:對time模塊的一個高級封裝
shutil模塊:是一種高層次的文件操作工具
logging模塊:將日誌打印到了標準輸出中
re模塊:可以直接調用來實現正則匹配
pymysql模塊:連接數據庫,並實現簡單的增刪改查
threading模塊:提供了更強大的多線程管理方案
queue模塊:實現了多生產者,多消費者的隊列
json模塊:用於字符串和數據類型間進行轉換json
2、開源(三方)模塊
Requests:最富盛名的http庫。每個Python程序員都應該有它。
Scrapy:從事爬蟲相關的工作,這個庫也是必不可少的。
NumPy:為Python提供了很多高級的數學方法。
matplotlib:一個繪製數據圖的庫。對於數據分析師非常有用。
Pygame:開發2D遊戲的時候可以用上 。
Scapy:用Python寫的數據包探測和分析庫。
Django:開源Web開發框架,它鼓勵快速開發,並遵循MVC設計,開發周期短。
Py2exe:將python腳本轉換為windows上可以獨立運行的可執行程序。
BeautifulSoup:基於Python的HTML/XML解析器,簡單易用。
PyGtk:基於Python的GUI程序開發GTK+庫。
3、自定義模塊
自定義模塊是自己寫的模塊,對某段邏輯或某些函數進行封裝後供其他函數調用。
注意:自定義模塊的命名一定不能和系統內置的模塊重名了,否則將不能再導入系統的內置模塊了。
例如:自定義了一個sys.py模塊後,再想使用系統的sys模塊是不能使用的。
原創文章,作者:XI2MC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/129241.html