正則運算式,又稱規則運算式,(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念,正則運算式通常被用來檢索、替換那些符合某個模式(規則)的文本,
Python作為一門資料處理語言,經常使用正則匹配段落,比如爬蟲爬取資料時,正則運算式是Python內置的模塊,不需要額外安裝,

今天來給大家分享一份比較全面的Python正則運算式寶典,學會之后,你將掌握正則運算式的各種應用場景,
一、re模塊
re (Regular Expression簡寫),這個很好記住,
1.匯入re模塊
在使用正則運算式之前,需要匯入re模塊,
import re
2.findall()的語法:
匯入了re模塊之后就可以使用findall()方法了,
re.findall(pattern, string, flags=0)
引數
pattern:必填,正則運算式
string:必填,需要檢索的文本, == 確保沒亂碼 ==
Flags:選填,功能標志位
回傳陣列
str='a1a2a3'
newStr=re.findall('a\d',str )
nullVlue=re.findall('b\d',str)
print('newStr匹配個數:',len(newStr))
print('newStr匹配結果',newStr)
print('nullVlue匹配個數:',len(nullVlue))
print('nullVlue匹配結果',nullVlue)
顯示如下:
newStr匹配個數: 3
newStr匹配結果 ['a1', 'a2', 'a3']
nullVlue匹配個數: 0
nullVlue匹配結果 []
基本語法已經介紹完成了,
二、正則運算式
1.傻瓜式截取findall
import re
text='aaa bbb ccc'
rol='aaa (.*) ccc'
rul=re.findall(rol ,text)
print(rul)
顯示如下:
['bbb']
直接復制原來的文本,把想要提取的文本替換成(.*)

運算式解釋:
| 表示 | 意義 |
|---|---|
(pattern) | 表示匹配pattern并獲取這一匹配,要匹配圓括號字符,請使用"\("或"\)", |
. | 匹配除“\n"之外的任何單個字符,要匹配包括"\n"在內的任何字符,請使用像"(.|\n)"的模式, |
* | 匹配前面的子運算式零次或多次,例如,zo*能匹配“z"以及"zoo",*等價于{0,}, |
增加替代
import re
text = '<li><a href="/2/">動作片</a></li> <li><a href="/1/">喜劇片</a></li>'
rol = r'<li><a href=".*?">(.*?)</a></li>'
rul = re.findall(rol, text)
print(rul)
顯示:
['動作片', '喜劇片']
運算式解釋:

| 表示 | 意義 |
|---|---|
? | 非貪婪模式盡可能少的匹配所搜索的字串,而默認的貪婪模式則盡可能多的匹配所搜索的字串, |
pattern | 不帶( )表示匹配pattern匹配值不獲取~~獲取值不輸出~~, |
保留獲取
import re
text = '<li><a href="/2/">動作片</a></li> <li><a href="/1/">喜劇片</a></li>'
role = r'<li><a href=".*?">(.*?)</a></li>'
resu = re.findall(role , text)
rol2=r'(<a href=".*?">.*?</a>)'
rul2 = re.findall(rol2, text)
print(resu )
顯示:
['<a href="/2/">動作片</a>', '<a href="/1/">喜劇片</a>']
把括號寫在外面就可以了
2.傻瓜式的講完了,下面講講限定符
1 - [xyz]
字符集合,匹配所包含的任意一個字符,例如,“[abc]“可以匹配"plain"中的"a”,
import re
text = 'aab 1+23 ss aac 4-56 ss'
rol = r'aa(.*?)ss'
rul1 = re.findall(rol, text)
print(rul1)
rol2 = r'aa[bc](.*?)ss'
rul1 = re.findall(rol2, text)
print(rul1)
輸出:
['b 1+23 ', 'c 4-56 ']
[' 1+23 ', ' 4-56 ']
== 運算式解釋 ==
①我們可以先把固定的截取下來,紅框部分,
②再通過非截取方式把b和c過濾掉,藍色部分,
③[ ]提供的就是包含功能

2 - {}
| 表示 | 意義 |
|---|---|
{n} | n是一個非負整數,匹配確定的n次,例如,“o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的兩個o, |
{n,} | n是一個非負整數,至少匹配n次,例如,“o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o,"o{1,}"等價于"o+","o{0,}"則等價于"o*", |
{n,m} | m和n均為非負整數,其中n<=m,最少匹配n次且最多匹配m次,例如,“o{1,3}"將匹配"fooooood"中的前三個o,"o{0,1}"等價于"o?",請注意在逗號和兩個數之間不能有空格, |
+ | 匹配前面的子運算式一次或多次,例如,“zo+"能匹配"zo"以及"zoo",但不能匹配"z",+等價于{1,},, |
* | 匹配前面的子運算式零次或多次,例如,zo*能匹配“z"以及"zoo",*等價于{0,}, |
== 難度加大,b和c的個數不固定 ==
import re
#難度加大,b和c的個數不固定
text = 'aabbccbb 1+23 ss aaccb 4-56 ss'
rol = r'aa[bc]{3,10}(.*?)ss'
rul1 = re.findall(rol, text)
print(rul1)
rol2 = r'aa[bc](.*?)ss'
rul2 = re.findall(rol2, text)
print(rul2)
顯示:
[' 1+23 ', ' 4-56 ']
['bccbb 1+23 ', 'cb 4-56 ']

3 - (?:pattern)正則斷言
斷言(Assertions)在正則運算式概念里面難理解,它通常指的是在目標字串的當前匹配位置進行的一種測驗但這種測驗并不占用目標字串,也即不會移動模式在目標字串中的當前匹配位置,
| 表示 | 意義 |
|---|---|
x|y | 匹配x或y,例如,“z|food"能匹配"z"或"food","(z|f)ood"則匹配"zood"或"food", |
(?:pattern) | 匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存盤供以后使用,這在使用或字符“(|)"來組合一個模式的各個部分是很有用, |
(?=pattern) | 正向肯定預查,在任何匹配pattern的字串開始處匹配查找字串,這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用, |
(?!pattern) | 正向否定預查,在任何不匹配pattern的字串開始處匹配查找字串,這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用, |
(?!pattern) | 正向否定預查,在任何不匹配pattern的字串開始處匹配查找字串,這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用, |
(?<=pattern) | 反向肯定預查,與正向肯定預查類擬,只是方向相反, |
(?<!pattern) | 反向否定預查,與正向否定預查類擬,只是方向相反, |
== 再把開頭字符變得不固定aa和dd,結尾字符ss,ff ==
import re
#難度加大,b和c的個數不固定
#再把開頭字符變得不固定aa和dd,結尾字符ss,ff
text = 'aabbccbb 1+23 ss ddccb 4-56 ff'
rol = r'aa[bc]{3,10}(.*?)ss'
rul1 = re.findall(rol, text)
print(rul1)
rol2 = r'(?:aa|dd)[bc]{3,10}(.*?)(?:ss|ff)'
rul2 = re.findall(rol2, text)
print(rul2)
顯示:
[' 1+23 ']
[' 1+23 ', ' 4-56 ']

三、Python正則flags
編譯標志讓你可以修改正則運算式的一些運行方式,多個標志可以通過按位 OR-ing 它們來指定,如 re.I | re.M ,flags都有兩種形式,縮寫和全寫都可以,
| 表示 | 意義 |
|---|---|
re.I或re.IGNORECASE | 忽略大小寫 |
re.L或re.LOCALE | 使用當地locale,(python中有個locale模塊,locale代表不同的語言,地區和字符集) |
re.U或re.UNICODE | 使用unicode的locale |
re.U或re.UNICODE | 使用unicode的locale |
re.M或re.MULTILINE | 使用^或$時會匹配每一行的行首或行尾 |
re.S或re.DOTALL | 使用.時能匹配換行符 |
re.X或re.VERBOX | 忽略空白字符,而且可以加入注釋 |
re.I
import re
#難度加大,b和c的個數不固定
#再把開頭字符變得不固定aa和dd,結尾字符ss,ff
#改變字母大小寫
text = 'aAbBCcbb 1+23 Ss Ddccb 4-56 fF'
rol = r'(?:aa|dd)[bc]{3,10}(.*?)(?:ss|ff)'
rul = re.findall(rol, text)
print(rul)
rul2 = re.findall(rol, text,re.I)
print(rul2)
顯示:
[]
[' 1+23 ', ' 4-56 ']

re.M和re.S
import re
#難度加大,b和c的個數不固定
#再把開頭字符變得不固定aa和dd,結尾字符ss,ff
#改變字母大小寫
#在中間添加一個換行符
text = 'aAbBCcbb 1+23 \n Ss Ddccb 4-56 fF'
rol = r'(?:aa|dd)[bc]{3,10}(.*?)(?:ss|ff)'
rul = re.findall(rol, text,re.I)
print(rul)
rul2 = re.findall(rol, text,re.I|re.S)
print(rul2)
顯示:
[' 4-56 ']
[' 1+23 \n ', ' 4-56 ']

== 結果說明 ==
①默認re.M只會匹配在當前 行(非列) 里面進行匹配,“Ss”已經換行了,所以“1+23”沒有匹配到,
②re.S表示匹配多行,并且捕獲換行符
③re.S|re.I可以并行使用
# 結語 正則的匹配方法,已經寫完了,號稱萬能的文本處理工具,下篇開始講解,替換,追加,最后最后,感謝大家關注!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/300482.html
標籤:python
