正則表達式

正則表達式html

1、正則介紹python

2、匹配一個字符正則表達式

3、量詞算法

4、分組和位置數據庫

5、函數設計模式

6、貪婪,懶惰和字符r的做用服務器

回到頂部併發

 

1、正則介紹

1.做用框架

  正則(Regular Expression) : 表達對數據的匹配  過濾  提取邏輯的表達式機器學習

  匹配結果對象 = re.match(正則, 數據)

​     從頭開始匹配 若是某一個匹配失敗 總體就失敗了

​     若是匹配成功 返回匹配結果對象

​     若是匹配失敗 返回None

  獲取匹配結果

​     匹配結果對象.group()

  "強烈"建議: 正則一概加上r字符 r字符能夠對正則表達式中的  \  進行轉義

2、匹配一個字符

1. . 字符

  點字符 : 表明匹配任意一個字符  默認除了 \n 

      re.S模式可讓 . 匹配\n  :  re.match(r"\d{3,5}.+", "123\nqq", "re.S")

      \. 與字符 點 相同 多用於在匹配郵箱時候使用

2. [] 匹配字符

  [] : 匹配其中任意一個字符

     [0-9] : 是指 0 - 9 的範圍

     [^0-9] : 取反 禁止匹配

3. \d \w \s字符

  \d : 數字字符

  \w : 單詞字符[0-9a-zA-Z_]

    在py3 中  Unicdode \w 能夠匹配漢字

    在py2 中  Ascll \w不能匹配漢字

  \s : 空白字符

3、量詞

1.{}字符 : 匹配{m,n}, 至少m次 之多n次,  {m}m次

2.*字符 : 任意次

3.+字符 : 至少一次

4.?字符 : 0次或者1次

4、分組和位置

  1.分組

    目的 : 提取出想要的部分

  2.匿名分組

目的: 從總體數據提取出 感興趣的部分數據

建立: "(正則)"

​   用戶建立的分組從1開始 0號分組已經存儲總體結果

獲取分組結果:

​   匹配結果對象.group(分組編號=0)

  ​ .group(編號,編號)

分組引用:

​   但願在正則的後續位置使用前面的分組匹配的數據

​   \分組的編號

re.match(r"嫦娥(\d+)號", "嫦娥998號").group()    
re.match(r"嫦娥(\d+)號", "嫦娥998號").group(0) 
re.match(r"嫦娥(\d+)號", "嫦娥998號").group(1) 

re.match(r"嫦娥(\d+)號 998", "嫦娥998號 998").group(1) 
re.match(r"嫦娥(\d+)號 999", "嫦娥999號 999").group(1)
# 上面寫 不靈活  每次分組數據不同所有須要改寫  
# 若是須要使用前面分組的數據繼續匹配 - 分組引用
re.match(r"嫦娥(\d+)號 \1", "嫦娥999號 999").group(1)
re.match(r"嫦娥(\d+)號 \1", "嫦娥1999號 1999").group(1) 

re.match(r"(\d{3,4})-\d{6,8}", "010-000001").group()
re.match(r"(\d{3,4})-\d{6,8}", "010-000001").group(1) 
re.match(r"(\d{3,4})-(\d{6,8})", "010-000001").group(2)

re.match(r"(\d{3,4})-(\d{6,8}) \1-\2", "010-000001 010-000001").group(2)
示例代碼

  3.命名分組

    應用場景: 默認分組沒有名稱只能按照分組編號訪問 而一旦分組編號發生變化致使正則修改

​         給每一個分組起一個名稱 編號發送變化不會影響正則的使用

    建立

​       "(?P<分組名稱>正則)"

    獲取結果

​       .group(分組名稱)

​       * 也能夠經過下標訪問

    建立分組並分組引用

​       "(?P<分組名稱>正則) (?P=分組名稱)"

re.match(r"(?P<area>\d{3,4})-(?P<no>\d{6,8}) (?P=area)-(?P=no)", "010-000001 010-000001").group(1,2)
re.match(r"(?P<area>\d{3,4})-(?P<no>\d{6,8}) (?P=area)-(?P=no)", "010-000001 010-000001").group('no')
re.match(r"((?P<area>\d{3,4})-(?P<no>\d{6,8})) (?P=area)-(?P=no)", "010-000001 010-000001").group('no')
示例代碼

  4. | 符號

r"表達式1|表達式2|表達式3" 匹配|左右任意一個表達式

r"表達式(部分1|部分2|部分3)" 匹配分組中 |左右任意一個表達式

re.match(r"^\w{4,16}@163\.com$", "123456@163.com").group()
re.match(r"^\w{4,16}@163\.com$|^\w{4,16}@263\.com$|^\w{4,16}@qq\.com$", "123456@qq.com").group()
re.match(r"^\w{4,16}@(163|263|qq)\.com$", "123456@263.com").group()
示例代碼

5、函數

  match(正則,數據) - -> 匹配對象 從頭匹配

  search(正則,數據) - -> 匹配對象 從頭開始搜索  日後面嘗試

  findall(正則,數據) --> 返回列表 查找全部

  sub(正則,替換數據,數據,次數) -- > 替換後的數據

html ="""
<div>
<p>崗位職責:</p>
<p>完成推薦算法、數據統計、接口、後臺等服務器端相關工做</p>
<p><br></p>
<p>必備要求:</p>
<p>良好的自我驅動力和職業素養,工做積極主動、結果導向</p>
<p>&nbsp;<br></p>
<p>技術要求:</p>
<p>一、一年以上 Python 開發經驗,掌握面向對象分析和設計,瞭解設計模式</p>
<p>二、掌握HTTP協議,熟悉MVC、MVVM等概念以及相關WEB開發框架</p>
<p>三、掌握關係數據庫開發設計,掌握 SQL,熟練使用 MySQL/PostgreSQL 中的一種<br></p>
<p>四、掌握NoSQL、MQ,熟練使用對應技術解決方案</p>
<p>五、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p>
<p>&nbsp;<br></p>
<p>加分項:</p>
<p>大數據,數理統計,機器學習,sklearn,高性能,大併發。</p>

</div>"""

res = re.sub(r"</?\w+>|\s|&nbsp", "", html)
print(res)
刪除制定字符案例
def add(match_obj):
    # 獲取匹配結果的數據
    value = match_obj.group()
    result = int(value) + 1
    # 返回值必須是字符串類型
    return str(result)

res = re.sub(r"\d{2,3}", add, "python=100 cp=96")
print(res)
add函數增長案例

  split(正則,數據) --> 切割後的列表 

data = "貂蟬,楊玉環:西施,王昭君 鳳姐"
res = re.split(r",|:|\s", data)
print(res)
切割案例

6、貪婪,懶惰和字符r的做用

  1.貪婪和懶惰

默認貪婪模式 儘量多匹配-匹配結果很長

​懶惰 儘量少匹配

貪婪模式變爲懶惰模式 量詞後加?便可

前提: 知足總體的匹配結果

# html 去直播找源代碼

res = re.search(r"https://.+\.jpg", html).group()  # 一個結果很長
print(res)
# res = re.search(r"https://.+?\.jpg", html).group() # 一個結果很短
# # 理解貪婪模式和非貪婪模式以後  再看下面的代碼
# print(res)
# res = re.findall(r"https://.+?\.jpg|https://.+?\.png", html)
# print(res)
# res = re.findall(r"https://.+?\.(?:jpg|png)", html)
# print(res)
# 取消分組 由於findall的結果默認是用戶建立的分組數據  須要取消用戶建立的分組從而顯示總體結果(?:正則)
網頁提取直播圖片
# 驗證貪婪和懶惰
# res = re.match(r"^(\d+?)(\d+)$", "13546456789").group(1,2)
# res = re.match(r"^(\d+?)(\d?)$", "13546456789").group(1,2)
# res = re.match(r"^(\d+)(\d?)$", "13546456789").group(1,2)
# print(res)
驗證貪婪和懶惰

  2. r

若是字符串中有雙斜槓 正則須要四反斜槓來進行匹配

​ 爲解決反斜槓困擾問題, 使用r標識數據

r"\1" ===> "\\1" 自動對數據中的\進行轉義 ——> 雙反斜槓 \

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息