Python – re 模組的 Regular Expression 語法

Loading

測試環境為 CentSO 8 (虛擬機)

在 Python 可以透過 re 模組來使用 Regular Expression (正規表達式) 來處理資料, 常用的 re 函數請參考 – https://benjr.tw/105370 , 這邊來看一下常用 Regular Expression 語法.

[root@localhost ~]# python3
Python 3.6.8 (default, Sep 10 2021, 09:13:53)
[GCC 8.5.0 20210514 (Red Hat 8.5.0-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re

正規表示式字元可以使用下面的的特殊符號來表示:

  • ^ 表示匹配的字元串在行首.
    下面範例用來剔除字串前的空白字元 (\s) , + 表示 “重複” 一個到無窮多個的字元.

    >>> re.sub('^\s+' ,'' , '    This is a book   ' );
    'This is a book   '
    
  • $ 表示匹配的字元串在行尾.
    下面範例用來剔除字串後的空白字元.(\s) , + 表示 “重複” 一個到無窮多個的字元.

    >>> re.sub('\s+$' ,'' , '    This is a book   ' );
    '    This is a book'
    
  • . 表示為任一字元.
  • * 表示 “重複” 零個到無窮多個的字元.
  • + 表示 “重複” 一個到無窮多個的字元.
    下面範例用來剔除 HTML 語法的標籤(TAG).

    >>> re.sub("<.+>",'' , "<h2 title=I'm a header>The title Attribute</h2>");
    ''
    

    .+
    . 表示為任一字元 , + 表示 “重複” 一個到無窮多個的字元.

  • ? 表示 “重複” 零個到一個的字元.
    下面範例用來剔除 HTML 語法的標籤(TAG).

    >>> re.sub("<.+?>",'' , "<h2 title=I'm a header>The title Attribute</h2>");
    'The title Attribute'
    

    .+?
    . 表示為任一字元. + 表示 “重複” 一個到無窮多個的字元 , ? 表示 “重複” 零個到一個的字元.

    .+ 與 .+? 使用上不同.

    • .+ 找出盡可能多的字元,上面的範例.
      <.+> 會找出盡可能多的字元 以 < 為開頭 ,以 > 為結尾 ,結果就是找到 <h2 title=I’m a header>The title Attribute</h2> 一整個字串.
    • .+? 找出盡可能少的字元,上面的範例.
      <.+?> 會找出盡可能少的字元 以 < 為開頭 ,以 > 為結尾 ,結果就是找到 <h2 title=I’m a header>與 </h2> 兩個字串.
  • A|B , (A|B) 可以是 A 或是 B.
    A|B 表示 A 與 B 都會被取代.

    >>> re.sub("A|C|B" , '' , "ABCDEF");
    'DEF'
    
  • {n} 配對次數 n 次(須為整數).
  • [ ] 包含 [ ] 內的任一字元,可以使用 [0-9] 代表從數字 0-9 , 或是 [a-z].
  • {n,m} 配對次數從 n 到 m 次(皆須為整數,n 需小於等於 m , n<=m).
  • [^ ] 不包含 [ ] 內的任一字元.
    以下範例用來取代掉非數字(只保留數字).

    >>> re.sub( '[^0-9]+' , '' , '0988-123456');
    '0988123456'
    

    以下範例用來取代掉非數字與.小點數 (只保留數字與小數點).

    >>> re.sub( '[^0-9 , .]+', '' , 'PI=3.1415');
    '3.1415'
    >>> re.sub( '[^0-9 , ^.]+', '' , 'PI=3.1415' );
    '3.1415'
    
  • \d 符合一個數字(digit) 字元.
  • \D 符合一個非數字(non-digit) 字元.
  • \w 符合一個英文(word) 字元.
  • \W 符合一個非英文(non-word) 字元.
  • \s 符合一個空白(white-space) 字元.
  • \S 符合一個非空白(non-white-space) 字元.
  • () 表示將字串(表達式 : sub-expression) 分組為一個子字串 (子表達式 : sub-expression),搭配 \N 來使用.
  • \N (實際需使用 \\N) N 須為 1~9 間的數字,代表在字串中找到的第 N個匹配的子字串 (sub-expression).
    下面範例用來將字串(名 姓)轉換成為(姓, 名).

    >>> re.sub( '^(.*) (.*)$','\\2, \\1' , 'Chris Hemsworth' );
    'Hemsworth, Chris'
    

    ^(.*) (.*)$ 與 \\2, \\1

    • ^ 表示匹配的字元串在行首.
    • $ 表示匹配的字元串在行尾.
    • . 表示為任一字元.
    • * 表示 “重複” 零個到無窮多個的字元.
      .* 表示為任意字元.
    • () 表示將字串(表達式 : sub-expression) 分組為一個子字串 (子表達式 : sub-expression),搭配 \N 來使用.
    • \N (實際需使用 \\N) N 須為 1~9 間的數字,代表在字串中找到的第 N個匹配的子字串 (sub-expression).
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料