正規表達式文法

位置
正向預查
比如說我們有一個文本叫做abcd,現在我們希望比對"a後面的bcd",但是“又不希望比對到a”,那麼可以用正向預查這麼寫:
(?<=a)bcd
這裡的(?<=a)即為正向預查的寫法,它代表的含義就是比對a後面的内容,但是又不包含a本身
負向預查
接下來再來看負向預查的寫法,還是拿abcd來舉例子,假設這裡我們要比對"d前面的abc",但是“又不希望比對到d”,那麼使用負向預查可以這麼寫
abc(?=d)
這裡的(?=d)即為負向預查的寫法,它代表的含義就是比對d前面的内容,但是又不包含d本身
正規表達式關卡
關卡1-固定字元串
要求:找出字元串中是否含有123456
import re
text = '身高:178,體重:168,學号123456,密碼9527,學号123456'
print(re.findall(r'123456',text)) #re是python正規表達式子產品,findall是裡面函數,找出所有意思,r代表原始字元串
關卡2-預定義字元集
要求:找出所有單個的數字
import re
text = '身高:178,體重:168,學号123456,密碼9527,學号123456'
print(re.findall(r'\d',text))
關卡3-重複某一類字元
要求:找出所有數字或者長度
import re
text = '身高:178,體重:168,學号123456,密碼9527,學号123456'
關卡4-組合{}()[]
要求:找出座機号碼
- 數量詞{}中間代入數值代表前面應該是幾位長,可以用逗号分隔代表區間
- ()代表一個整體
- []代表裡面多個參數,隻要有一個比對上即可
text = '我的電話号碼是18512345678,另外一個号碼是18612345678,座機号碼是021-12345678,另外一個座機是0211-12345678'
将最終前後比對一緻的資料分組,最終得到後面那組資料
關卡5-邏輯或|
要求:找出手機号碼和座機号碼
關卡6-邊界比對^&
要求:找出手機号
text = '18512345678是我的電話号碼,另外一個号碼是18612345678,座機号碼是021-12345678,另外一個座機是0211-12345678'
關卡7-内部限制
要求,找出barbar前後三個字母重複的字元串
text = 'barbar, barpar, parparp'
關卡8-正反向結合
寫正規表達式步驟
例如:021-12345678-120
- 确定模式包含幾個子模式,案例分為3個子模式用固定字元串連接配接,這裡有3個子模式021、12345678、120
- 各個部分的字元串分類是什麼,\d(數字)還是\D(非數字)
- 各個部分如何重複,子模式1重複幾~幾次、子模式2重複幾~幾次、子模式3重複幾~幾次
- 是否有外部位置限制
- 是否有内部位置限制
Python的re子產品
查找
- search 部分比對,隻要在字元串中找到字元存在即可
- match 從頭開始比對
- findall 傳回字元串
- finditer 傳回match疊代器
替換
比對替換傳回數量
import re
# 去掉電話号碼中的-
num = re.subn(r'\D', '', '188-1926-8053')
print(num)
# (18819268053, 2)
分割字元串
按照正規表達式的規則來分割字元串,并傳回清單
可以規定分割的次數
import re
print(re.split('a*', 'hello world'))
# ['', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '']
print(re.split('a*', 'hello world', 1))
# ['', 'hello world']
修飾符
re.I:忽略大小寫
re.L:本地化識别比對
re.M:多行比對
re.S:使.比對包括換行在内的所有字元
import re
content = "Cats are smarter than dogs"
print(re.search(r'DOGS', content, re.M | re.I))