一、正則表達式簡介
正則表達式的官方文檔:https://www.runoob.com/regexp/regexp-tutorial.html
正則表達式:又稱正規表示式、正規表示法、正規表達式、規則表示式、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或者是RE),是計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列某個句法規則的字符串。在很多文本編輯器里,正則表達式通常來檢索、替換那些匹配某個模式的文本。
按某種規則匹配的表達式。
二、正則介紹
正則表達式是一個工具,用於匹配字符串,或用來提取字符串。
1、判斷一個字符串是否匹配給定的格式(判斷用戶賬號是否滿足格式)
2、從字符串中,按指定格式提取信息(抓取手機號)
import re str1 = 'fijiooe18814726275iufdrrrrdf18814726275fsdssa' # 定義一個查找的規則 # 已知需要查找的手機號 p = '18814726275' # search(): 從前往后查找數據,默認返回找到的第一個數據,不會再繼續往后面找 res = re.search(p,str1).group() print(res)
三、元字符
表示單字符
字符 | 功能 |
. | 匹配任意一個字符(除了\n) |
[] | 匹配[]中列舉的字符 |
\d | 匹配數字,即0-9 |
\D | 匹配非數字,即不是數字 |
\s | 匹配空白,即空格,tab鍵 |
\S | 匹配非空白 |
\w | 匹配單詞字符,即a-z、A-Z、0-9、_ |
\W | 匹配非單詞字符 |
表示數量
匹配多個字符的相關格式。
字符 | 功能 |
* | 匹配前一個字符出現0次或者無限次,即可有可無 |
+ | 匹配前一個字符出現1次或者無限次,即至少有1次 |
? | 匹配前一個字符出現1次或者0次,即要么有1次,要么沒有 |
{m} | 匹配前一個字符出現m次 |
{m,} | 匹配前一個字符至少出現m次 |
{m,n} | 匹配前一個字符至少出現m~n次 |
表示邊界
字符 | 功能 |
^ | 匹配字符串開頭 |
$ | 匹配字符串結尾 |
\b | 匹配一個單詞的邊界 |
\B | 匹配非單詞邊界 |
匹配分組
字符 | 功能 |
| | 匹配左右任意一個表達式 |
(ab) | 將括號中字符作為一個分組 |
\num | 引用分組num匹配到的字符串 |
(?P<name>) | 分組起別名 |
(?P=name) | 引用別名為name分組匹配到的字符串 |
四、re模塊
-
re.match函數
re.match函數嘗試從字符串的起始位置匹配一個模式,匹配成功,返回的是一個匹配對象(這個對象包含了匹配的信息,如果不是起始位置匹配成功的話,match()就會返回None。)
-
re.search方法
re.search()掃描整個字符串並返回第一個成功匹配到的字符。
-
re.match與re.search的區別
re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回為None;而re.search匹配整個字符串,直到找到一個匹配
-
findall方法
在字符串中找到正則表達式所匹配的所有子串,並以列表的形式進行返回,如果沒有找到匹配的。則返回來一個空列表。
-
注意:match和search 是匹配一次;而findall是匹配所有。
-
sub方法
替換字符串中的某些字符,可以用正則表達式來匹配被選子串。
re.sub(pattern,repl,string,count=0)
-
- pattern :表示正則表達式中的模式子串;
- repl:被替換的字符串(既可以是字符串,也可以是函數)
- string:要被處理的字符串,要替換的字符串
- count:替換的次數
str4 = '1#python#232th32#python#uedue#python#oyfdsthdsaastrtn' # ()將括號中的字符作為一個分組 p17 = 'py(th)on' res1 = re.search(p16,str4) print(res1) res2 = re.search(p16,str4).group(1) print(res2) # 匹配一個任意字符,出現一次以上且關閉貪婪模式 p18 = '#.+?#' res3 = re.findall(p18,str4) print(res3) p19 = '#(.+?)#' res4 = re.findall(p19,str4) print(res4) # 替換str4字符串中的p19為'*java*'字符串,count來控制替換的次數 res5 = re.sub(p19,'*java*',str4) print(res5)
五、貪婪模式
python中數量詞默認是貪婪模式,總是嘗試匹配盡可能多的字符;非貪婪模式相反,總是嘗試匹配盡可能少的字符。
在 *、?、+、{m,}、{m,n}后面加上?,可以使貪婪模式變成非貪婪模式。
練習
import re str1 = 't fijiooe18 71%^&&@#@47262 75i_ufdrrrrdf1 _8814726 275fsd ssa' # 定義一個查找的規則 # 已知需要查找的手機號 p1 = '18814726275' # 匹配11位數字的手機號碼 p2 = '\d{11}' # 匹配手機號碼 p3 = '1[3-9]\d{9}' # 匹配非數字 p4 = '\D{2}' # 匹配空格 p5 = '\s' # 匹配非空格 p6 = '\S' # 匹配單次字符,即A-Z、a-z、0-9、_ p7 = '\w' # 匹配非單次字符,即除A-Z、a-z、0-9、_以外的字符 p8 = '\W' # 匹配任意字符 p9 = '.' # search(): 從前往后查找數據,默認返回找到的第一個數據,不會再繼續往后面找 res = re.search(p1,str1) print(res) # findall() :找出所有符合規范的字符,以列表形式返回。 res = re.findall(p1,str1) print(res) # 正則表達式:默認是貪婪模式,貪婪模式是盡可能取最多的值。 p10 = '\d{3,5}' # 關閉貪婪模式:用? 盡可能取最少的值 p11 = '\d{3,5}?' # 注意:匹配規則中涉及到數量范圍的時候,會出現貪婪模式。如 {m,} {m,n} * + # 表示邊界的 str2 = '1python23232 python uedu python oy fdsd saas python' # ^ 表示匹配字符串開頭 p12 = '^py' res1 = re.search(p12,str2) res2 = re.findall(p12,str2) print(res1,res2) # $ 表示字符串結尾 p13 = 'python$' res1 = re.search(p13,str2) res2 = re.findall(p13,str2) print(res1,res2) # \b 匹配單詞邊界 p14 = r'\bpy' res1 = re.search(p14,str2) res2 = re.findall(p14,str2) print(res1,res2) # \B 匹配非單詞邊界 p15 = '\Bpy' res1 = re.search(p15,str2) res2 = re.findall(p15,str2) print(res1,res2) # 匹配分組 str3 = '1python232th32 python uedu eepython oy fdsthd saas trtython' # ()將括號中的字符作為一個分組 p16 = 'py(th)on' res1 = re.search(p16,str3) res2 = re.findall(p16,str3) print(res1,res2)
六、封裝一個自己的正則表達式的類
封裝的需求:替換測試用例中的參數
簡化參數替換的流程
封裝的思路:1、獲取測試用例數據
2、判斷該條測試用例數據是否有需要替換的參數
3、調用封裝好的正則表達式類進行參數替換
import re from common.config import conf def replace(data): """ 用來替換測試用例的參數 :param data: 用例的參數 :return: """ p = r'#(.+?)#' # 判斷測試用例中的參數是否替換 while re.search(p,data): # 查找配置文件中需要替換的測試用例參數 key = re.search(p,data).group(1) value = conf.get('test_data',key) # 替換測試用例數據參數 data = re.sub(p,value,data,count=1) return data