正規表示式和re模組

2022-03-11 04:42:59 字數 3027 閱讀 8547

一、正規表示式

正規表示式是用來匹配字串非常強大的工具,在其他程式語言中同樣有正規表示式的概念。正規表示式是一種小型的、高度專業化的程式語言,他內嵌在python中,並通過re模組實現。

1.字元組:[字元組   在同個位置可能出現的各種字元組成了乙個字元組,在正規表示式中用表示,字元分為很多類,比如數字,字母,標點等等。假如現在要求乙個位置「只能出現乙個數字」,那麼這個位置上的字元只能是0,1,2,3,4,5,6,7,8,9這10個數之一。

字元:

\s          匹配非空白符

a|b           匹配字元a或者字元b

()           匹配括號內的表示式

[...]            匹配字元組中的字元

[^...]           匹配除了字元組中字元的所有字元

量詞:量詞          用法說明

*            重複零次或者更多次

+            重複一次或者更多次

?            重複零次或一次

重複n次

重複n次或更多次

重複n到m次

轉義符:

在正規表示式中,有很多有特殊意義的元字元,比如\n,\s等,如果要在正則中匹配正常的「\n」,而不是「換行符」就需要對「\」進行轉義,變成「\\」。

在python中,無論是正規表示式,還是待匹配的內容,都是以字串的形式出現的,在字串中\也有特殊的含義,本身還需要轉義。所以如果匹配一次「\n」,字串中要寫成「\\\n」,簡便操作,利用r可以讓整個字串都不在轉義了。

貪婪匹配與非貪婪匹配:

<.>:先拿著裡面的\.\*去匹配所有的內容,然後再根據》往回退著找,遇到即停止。

<.>:先拿著?後面的》去匹配符合條件的最少內容,然後把匹配結果返回

幾個常用的貪婪匹配pattern:

*? 重複任意次,但盡可能少重複

+? 重複1次或更多次,但盡可能少重複

?? 重複0次或1次,但盡可能少重複

? 重複n到m次,但盡可能少重複

? 重複n次以上,但盡可能少重複

.*?的用法:

. 是任意字元

* 是取 0 至 無限長度

? 是非貪婪模式。

何在一起就是 取盡量少的任意字元,一般不會這麼單獨寫,他大多用在:

.*?x

就是取前面任意長度的字元,直到乙個x出現

二、re模組的使用

1.findall用法

ret = re.findall('a', 'eva egon yuan')  # 返回所有滿足匹配條件的結果,放在列表裡

print(ret)

2.search

ret = re.search('a', 'eva egon yuan')  

print(ret.group()) # 結果:'a'

# 函式會在字串內查詢模式匹配,直到找到第乙個匹配然後返回乙個包含匹配資訊的物件,該物件可以通過呼叫group()方法得到匹配的字串,如果字串沒有匹配,則返回none,並且需要注意的是如果ret是none,再呼叫.group()會直接報錯。這一易錯點可以通過if判斷來進行篩選

3.match

ret = re.match('a', 'abc').group()  # 同search,不過僅在字串開始處進行匹配

print(ret) # 『a'

# match是從頭開始匹配,如果正則規則從頭開始可以匹配上,就返回乙個物件,需要用group才能顯示,如果沒匹配上就返回none,呼叫group()就會報錯

注意:findall的優先順序查詢:

print(ret) # ['oldboy'] 這是因為findall會優先把匹配結果組裡內容返回,如果想要匹配結果,取消許可權即可

其他方法:

ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在對''和'bcd'分別按'b'分割

print(ret) # ['', '', 'cd']

ret = re.sub('\d', 'h', 'eva3egon4yuan4', 1) # 將數字替換成'h',引數1表示只替換1個

print(ret) # evahegon4yuan4

ret = re.subn('\d', 'h', 'eva3egon4yuan4') # 將數字替換成'h',返回元組(替換的結果,替換了多少次)

print(ret)

obj = re.compile('\d') #將正規表示式編譯成為乙個 正規表示式物件,規則要匹配的是3個數字

ret = obj.search('abc123eeee') #正規表示式物件呼叫search,引數為待匹配的字串

print(ret.group()) #結果 : 123

import re

ret = re.finditer('\d', 'ds3sy4784a') #finditer返回乙個存放匹配結果的迭代器

print(ret) # print(next(ret).group()) #檢視第乙個結果

print(next(ret).group()) #檢視第二個結果

print([i.group() for i in ret]) #檢視剩餘的左右結果

re 正規表示式模組

import re 預定義字符集 d 數字 0 9 d 非數字 d s 空白字元 空格 t r n f v s 非空白字元 s w 單詞字元 a za z0 9 w 非單詞字元 w 匹配數量 匹配除換行符以外的任何單個字元 匹配前乙個字元0或無限次 盡可能多的匹配 盡可能少的進行匹配前邊的正規表示式...

正規表示式 re模組

re是python中的正規表示式模組,正則也是每個人程式設計之路上必備的基礎技能。這部落格希望即便從來沒接觸過的人看了也會使用正規表示式字元 含義.匹配除了換行符外的任何字元。可以用re.dotall來設定匹配任何字元,包括換行符 丨a丨b 表示正規表示式匹配a或者b 匹配輸入字串開始的位置,如果設...

正規表示式re模組

正規表示式re模組 編譯正規表示式模式,返回乙個物件的模式。可以把那些常用的正規表示式編譯成正規表示式物件,這樣可以提高一點效率。1 compile 格式 re.compile pattern,flags 0 pattern 編譯時用的表示式字串。flags 編譯標誌位,用於修改正規表示式的匹配方式...