天天看點

Python 正規表達式和re子產品

正規表達式文法

Python 正規表達式和re子產品

位置

Python 正規表達式和re子產品

正向預查

比如說我們有一個文本叫做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代表原始字元串      
Python 正規表達式和re子產品

關卡2-預定義字元集

要求:找出所有單個的數字

import re
text = '身高:178,體重:168,學号123456,密碼9527,學号123456'
print(re.findall(r'\d',text))      
Python 正規表達式和re子產品

關卡3-重複某一類字元

要求:找出所有數字或者長度

import re
text = '身高:178,體重:168,學号123456,密碼9527,學号123456'      
Python 正規表達式和re子產品
Python 正規表達式和re子產品
Python 正規表達式和re子產品

關卡4-組合{}()[]

要求:找出座機号碼

  • 數量詞{}中間代入數值代表前面應該是幾位長,可以用逗号分隔代表區間
  • ()代表一個整體
  • []代表裡面多個參數,隻要有一個比對上即可
text = '我的電話号碼是18512345678,另外一個号碼是18612345678,座機号碼是021-12345678,另外一個座機是0211-12345678'      
Python 正規表達式和re子產品

将最終前後比對一緻的資料分組,最終得到後面那組資料

Python 正規表達式和re子產品
Python 正規表達式和re子產品

關卡5-邏輯或|

要求:找出手機号碼和座機号碼

Python 正規表達式和re子產品

關卡6-邊界比對^&

要求:找出手機号

text = '18512345678是我的電話号碼,另外一個号碼是18612345678,座機号碼是021-12345678,另外一個座機是0211-12345678'      
Python 正規表達式和re子產品

關卡7-内部限制

要求,找出barbar前後三個字母重複的字元串

text = 'barbar, barpar, parparp'      
Python 正規表達式和re子產品

關卡8-正反向結合

Python 正規表達式和re子產品

寫正規表達式步驟

例如:021-12345678-120

  1. 确定模式包含幾個子模式,案例分為3個子模式用固定字元串連接配接,這裡有3個子模式021、12345678、120
  2. 各個部分的字元串分類是什麼,\d(數字)還是\D(非數字)
  3. 各個部分如何重複,子模式1重複幾~幾次、子模式2重複幾~幾次、子模式3重複幾~幾次
  4. 是否有外部位置限制
  5. 是否有内部位置限制

Python的re子產品

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))