python中的正則表達式的使用


一、正則表達式簡介

正則表達式的官方文檔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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM