day012--python-正則表達式

来源:https://www.cnblogs.com/june-L/archive/2019/10/03/11616864.html
-Advertisement-
Play Games

正則表達式是一個特殊的字元序列,它能幫助你方便的檢查一個字元串是否與某種模式匹配。 一、元字元 1) . --匹配任意字元(不包括換行符) 2) ^ --匹配開始位置,多行模式下匹配每一行的開始 3) $ --匹配結束位置,多行模式下匹配每一行的結束 4) * --匹配前一個元字元0到多次 5) + ...


正則表達式是一個特殊的字元序列,它能幫助你方便的檢查一個字元串是否與某種模式匹配。

一、元字元

  1) .     --匹配任意字元(不包括換行符)
  2) ^    --匹配開始位置,多行模式下匹配每一行的開始
  3) $    --匹配結束位置,多行模式下匹配每一行的結束
  4) *    --匹配前一個元字元0到多次
  5) +    --匹配前一個元字元1到多次
  6) ?    --匹配前一個元字元0到1次
  7) {m,n}   --匹配前一個元字元m到n次
  8) \\   --轉義字元,跟在其後的字元將失去作為特殊元字元的含義,例如\\.只能匹配.,不能再匹配任意字元
  9) []   --字元集,一個字元的集合,可匹配其中任意一個字元
  10) |   --邏輯表達式 或 ,比如 a|b 代表可匹配 a 或者 b
  11) (...)   -- 分組,預設為捕獲,即被分組的內容可以被單獨取出,預設每個分組有個索引,從 1 開始,按照"("的順序決定索引值
  12) (?iLmsux)   -- 分組中可以設置模式,iLmsux之中的每個字元代表一個模式,用法參見 模式 I
  13) (?:...)   -- 分組的不捕獲模式,計算索引時會跳過這個分組
  14) (?P<name>...)   -- 分組的命名模式,取此分組中的內容時可以使用索引也可以使用name
  15) (?P=name)   -- 分組的引用模式,可在同一個正則表達式用引用前面命名過的正則
  16) (?#...)   -- 註釋,不影響正則表達式其它部分,用法參見 模式 I
  17) (?=...)   -- 順序肯定環視,表示所在位置右側能夠匹配括弧內正則
  18 (?!...)   -- 順序否定環視,表示所在位置右側不能匹配括弧內正則
  19) (?<=...)   -- 逆序肯定環視,表示所在位置左側能夠匹配括弧內正則
  20) (?<!...)   --逆序否定環視,表示所在位置左側不能匹配括弧內正則
  21) (?(id/name)yes|no)   -- 若前面指定id或name的分區匹配成功則執行yes處的正則,否則執行no處的正則
  22) \number   -- 匹配和前面索引為number的分組捕獲到的內容一樣的字元串
  23) \A   -- 匹配字元串開始位置,忽略多行模式
  24) \Z   -- 匹配字元串結束位置,忽略多行模式
  25) \b   -- 匹配位於單詞開始或結束位置的空字元串
  26) \B   -- 匹配不位於單詞開始或結束位置的空字元串
  27) \d   -- 匹配一個數字, 相當於 [0-9]
  28) \D   -- 匹配非數字,相當於 [^0-9]
  29) \s   -- 匹配任意空白字元, 相當於 [ \t\n\r\f\v]
  30) \S   -- 匹配非空白字元,相當於 [^ \t\n\r\f\v]
  31) \w   -- 匹配數字、字母、下劃線中任意一個字元, 相當於 [a-zA-Z0-9_]
  32) \W   -- 匹配非數字、字母、下劃線中的任意字元,相當於 [^a-zA-Z0-9_]


二、函數 (參見 python 模塊 re 文檔)
  2.1 compile(pattern, flags=0)
    給定一個正則表達式 pattern,指定使用的模式 flags 預設為0 即不使用任何模式,然後會返回一個 SRE_Pattern
  示例:
    regex = re.compile(".+")
    print regex
    # >>> <_sre.SRE_Pattern object at 0x00000000026BB0B8>

  這個對象可以調用其他函數來完成匹配,一般來說推薦使用 compile 函數預編譯出一個正則模式之後再去使用,這樣在後面的代碼中可以很方便的復用它,當然大部分函數也可以不用 compile 直接使用,具體見 findall 函數

  示例:
    s = '''first line
    second line
    third line'''

    # 調用 findall 函數
    print regex.findall(s)
    #>>> ['first line', 'second line', 'third line']
    # 調用 search 函數
    print regex.search(s).group()
    # >>> first lin

  2.2 escape(pattern)
    轉義 如果你需要操作的文本中含有正則的元字元,你在寫正則的時候需要將元字元加上反斜扛 \ 去匹配自身, 而當這樣的字元很多時,寫出來的正則表達式就看起來很亂而且寫起來也挺麻煩的,這個時候你可以使用這個函數,用法如下

  示例:
    s = ".+\d123"
    regex_str = re.escape(".+\d123")
    # 查看轉義後的字元
    print regex_str
    # >>> \.\+\\d123

    # 查看匹配到的結果
    for g in re.findall(regex_str, s):
    print g
    # >>> .+\d123


  2.3 findall(pattern, string, flags=0)
    參數 pattern 為正則表達式, string 為待操作字元串, flags 為所用模式,函數作用為在待操作字元串中尋找所有匹配正則表達式的字串,返回一個列表,如果沒有匹配到任何子串,返回一個空列表。

  示例:
    s = '''first line
    second line
    third line'''

    # compile 預編譯後使用 findall
    regex = re.compile("\w+")
    print regex.findall(s)
    # >>> ['first', 'line', 'second', 'line', 'third', 'line']

    # 不使用 compile 直接使用 findall
    print re.findall("\w+", s)
    # >>> ['first', 'line', 'second', 'line', 'third', 'line']

 

  2.4 finditer(pattern, string, flags=0)
    參數和作用與 findall 一樣,不同之處在於 findall 返回一個列表, finditer 返回一個迭代器, 而且迭代器每次返回的值並不是字元串,而是一個 SRE_Match (參見 第四小節 re 內置對象用法) 對象,這個對象的具體用法見 match 函數。

   示例:
    s = '''first line
    second line
    third line'''

    regex = re.compile("\w+")
    print regex.finditer(s)
    # >>> <callable-iterator object at 0x0000000001DF3B38>
    for i in regex.finditer(s):
    print i
    # >>> <_sre.SRE_Match object at 0x0000000002B7A920>
    # <_sre.SRE_Match object at 0x0000000002B7A8B8>
    # <_sre.SRE_Match object at 0x0000000002B7A920>
    # <_sre.SRE_Match object at 0x0000000002B7A8B8>
    # <_sre.SRE_Match object at 0x0000000002B7A920>
    # <_sre.SRE_Match object at 0x0000000002B7A8B8>


  2.5 match(pattern, string, flags=0)
    使用指定正則去待操作字元串中尋找可以匹配的子串, 返回匹配上的第一個字串,並且不再繼續找,需要註意的是 match 函數是從字元串開始處開始查找的,如果開始處不匹配,則不再繼續尋找,返回值為 一個 SRE_Match 對象,找不到時返回 None

  示例:
    s = '''first line
    second line
    third line'''

    # compile
    regex = re.compile("\w+")
    m = regex.match(s)
    print m
    # >>> <_sre.SRE_Match object at 0x0000000002BCA8B8>
    print m.group()
    # >>> first

    # s 的開頭是 "f", 但正則中限制了開始為 i 所以找不到
    regex = re.compile("^i\w+")
    print regex.match(s)
    # >>> None

   2.6 purge() 

    當你在程式中使用 re 模塊,無論是先使用 compile 還是直接使用比如 findall 來使用正則表達式操作文本,re 模塊都會將正則表達式先編譯一下, 並且會將編譯過後的正則表達式放到緩存中,這樣下次使用同樣的正則表達式的時候就不需要再次編譯, 因為編譯其實是很費時的,這樣可以提升效率,而預設緩存的正則表達式的個數是 100, 當你需要頻繁使用少量正則表達式的時候,緩存可以提升效率,而使用的正則表達式過多時,緩存帶來的優勢就不明顯了, 這個函數的作用是清除緩存中的正則表達式,可能在你需要優化占用記憶體的時候會用到。

  2.7 search(pattern, string, flags=0)
   函數類似於 match,不同之處在於不限制正則表達式的開始匹配位置

  示例:
    s = '''first line
    second line
    third line'''

    # 需要從開始處匹配 所以匹配不到
    print re.match('i\w+', s)
    # >>> None

    # 沒有限制起始匹配位置
    print re.search('i\w+', s)
    # >>> <_sre.SRE_Match object at 0x0000000002C6A920>

    print re.search('i\w+', s).group()
    # >>> irst

  2.8 split(pattern, string, maxsplit=0, flags=0)
    參數 maxsplit 指定切分次數, 函數使用給定正則表達式尋找切分字元串位置,返回包含切分後子串的列表,如果匹配不到,則返回包含原字元串的一個列表

    示例:
    s = '''first 111 line
    second 222 line
    third 333 line'''

    # 按照數字切分
    print re.split('\d+', s)
    # >>> ['first ', ' line\nsecond ', ' line\nthird ', ' line']

    # \.+ 匹配不到 返回包含自身的列表
    print re.split('\.+', s, 1)
    # >>> ['first 111 line\nsecond 222 line\nthird 333 line']

    # maxsplit 參數
    print re.split('\d+', s, 1)
    # >>> ['first ', ' line\nsecond 222 line\nthird 333 line']

  2.9 sub(pattern, repl, string, count=0, flags=0)
    替換函數,將正則表達式 pattern 匹配到的字元串替換為 repl 指定的字元串, 參數 count 用於指定最大替換次數

  示例:
    s = "the sum of 7 and 9 is [7+9]."

    # 基本用法 將目標替換為固定字元串
    print re.sub('\[7\+9\]', '16', s)
    # >>> the sum of 7 and 9 is 16.

    # 高級用法 1 使用前面匹配的到的內容 \1 代表 pattern 中捕獲到的第一個分組的內容
    print re.sub('\[(7)\+(9)\]', r'\2\1', s)
    # >>> the sum of 7 and 9 is 97.

    # 高級用法 2 使用函數型 repl 參數, 處理匹配到的 SRE_Match 對象
    def replacement(m):
      p_str = m.group()
      if p_str == '7':
        return '77'
      if p_str == '9':
        return '99'
    return ' '
    print re.sub('\d', replacement, s)
    # >>> the sum of 77 and 99 is [77+99].

    # 高級用法 3 使用函數型 repl 參數, 處理匹配到的 SRE_Match 對象 增加作用域 自動計算
    scope = {}
    example_string_1 = "the sum of 7 and 9 is [7+9]."
    example_string_2 = "[name = 'Mr.Gumby']Hello,[name]"

    def replacement(m):
      code = m.group(1)
      st = ''
      try:
        st = str(eval(code, scope))
      except SyntaxError:
        exec code in scope
      return st

    # 解析: code='7+9'
    # str(eval(code, scope))='16'
    print re.sub('\[(.+?)\]', replacement, example_string_1)
    # >>> the sum of 7 and 9 is 16.


    # 兩次替換
    # 解析1: code="name = 'Mr.Gumby'"
    # eval(code)
    # raise SyntaxError
    # exec code in scope
    # 在命名空間 scope 中將 "Mr.Gumby" 賦給了變數 name

    # 解析2: code="name"
    # eval(name) 返回變數 name 的值 Mr.Gumby
    print re.sub('\[(.+?)\]', replacement, example_string_2)
    # >>> Hello,Mr.Gumby 

  2.10 subn(pattern, repl, string, count=0, flags=0)
   作用與函數 sub 一樣, 唯一不同之處在於返回值為一個元組,第一個值為替換後的字元串,第二個值為發生替換的次數

  2.11 template(pattern, flags=0)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用Python內置函數:bin()、oct()、int()、hex()可實現進位轉換。 先看Python官方文檔中對這幾個內置函數的描述: bin(x)Convert an integer number to a binary string. The result is a valid Pytho ...
  • "Flask的使用以及返回值(其中Response後續詳細單獨補充)" "Flask的路由解讀以及其配置" "Flask的請求擴展" "Flask中的cookie和session" "Flask中的request和response" "Flask中的渲染變數" "Flask中的CBV以及正則表達式" ...
  • 第一次寫博客,正好在回顧Java的時候用到了比較器,記錄一下使用的方法。 Java比較器多用於對象數組的排序,主要用到comparable和comparator介面 1、使用comparable介面 首先將需要實現排序對象的類實現comparable介面,實現後覆寫comparaTo(T other ...
  • 1、HashMap源碼解析(JDK8) 基礎原理: 對比上一篇《Java中的容器(集合)之ArrayList源碼解析》而言,本篇只解析HashMap常用的核心方法的源碼。 HashMap是一個以鍵值對存儲的容器。 hashMap底層實現為數組+鏈表+紅黑樹(鏈表超過8時轉為紅黑樹,JDK7為數組+鏈 ...
  • 我們將生產者、消費者、庫存、和調用線程的主函數分別寫進四個類中,通過搶奪非線程安全的數據集合來直觀的表達在進行生產消費者模型的過程中可能出現的問題與解決辦法。 我們假設有一個生產者,兩個消費者來共同搶奪庫存里的資源,而生產者和消費者都以線程來實現。 庫存對象只有是唯一的才會出現搶奪一個資源的可能,所 ...
  • vue實現選擇圖片文件後預覽 利用h5的api可以實現選擇文件並實現預覽 readAsDataURL 方法會讀取指定的 Blob 或 File 對象。讀取操作完成的時候,readyState 會變成已完成DONE,並觸發 loadend 事件,同時 result 屬性將包含一個data:URL格式的 ...
  • 面向對象三大特性:封裝、繼承、多態 繼承的概念: 在定義類時,可以從已有類當中提取想要的內容 被繼承的類稱為父類、基類、超類,新定義的類稱為子類、派生類 註意:如果派生類中的屬性與基類屬性重名,那麼派生類的屬性會覆蓋掉基類的屬性。包括初始化函數。 派生類在初始化函數中需要繼承和修改初始化過程,使用’ ...
  • T1 動態逆序對 題目 【題目描述】 給出一個長度為n的排列a(1~n這n個數在數列中各出現1次)。每次交換兩個數,求逆序對數%2的結果。 逆序對:對於兩個數a[i],a[j](i<j),若a[i]>a[j],則(a[i],a[j])為1個逆序對。 【輸入格式】 第一行一個正整數n。 接下來一行n個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...