# 正則表達式入門 筆記

# 第三週學習開始啦啦啦啦
# 正則表達式由 字符和操作符 組成

******************************  基本常用的正則表達式操作符  ****************************
. 表示任何單個字符
[] 字符集,對單個字符給出取值範圍 例:[abc]表示a\b\c,[a-z]表示a到z單個字符
[^] 非字符集,對單個字符給出排除範圍 例:[^abc]表示非a或b或c的單個字符
* 前一個字符0次或無限次擴展 例:abc*表示ab、abc、abcc、abccc等
+ 前一個字符1次或無限次擴展 例:abc+表示abc、abcc、abccc等
? 前一個字符0次或1次擴展 例:abc?表示ab、abc
| 左右表達式任意一個 例:abc|def表示abc、def
{m} 擴展前一個字符m次 例:ab{2}c表示abbc
{m,n} 擴展前一個字符m至n次(含n) 例:ab{1,2}c表示abc、abbc
^ 匹配字符串開頭 例:^abc表示abc且在一個字符串的開頭
$ 匹配字符串結尾 例:^abc表示abc且在一個字符串的結尾
() 分組標記,內部只能使用|操作 例:(abc)表示abc,(abc|def)表示abc、def
\d 數字,等價於[0-9]
\w 單詞字符,等價於[A-Za-z0-9_]

!!!當正則表達式包含<轉義符>時,使用raw string

***********************************  re庫的基本操作  ***********************************
1、re.search(pattern, string, flags=0)
    在一個字符串中搜索匹配正則表達式的第一個位置,返回match對象。
    pattern:正則表達式的字符串或原生字符串表示
    string:帶匹配字符串
    flags:正則表達式使用時的控制標記
        re.I(re.IGNORECASE):忽略正則表達式的大小寫,[A-Z]能夠匹配小寫字母
        re.M(re.MULTILINE):正則表達式中的^操作能夠將給定的字符串的每一行都當作匹配開始
        re.S(re.DOTALL):正則表達式中的.操作符能夠匹配所有字符,默認匹配除換行外的所有字符
    例:
        import re
        match = re.search(r'[1-9]\d{5}', 'BIT 100081')
        print(match.group(0))

       運行結果:100081
2、re.match(pattern, string, flags=0)
    從一個字符串的開始位置起匹配正則表達式,返回match對象。其他如上。
    例:
        import re
        match = re.match(r'[1-9]\d{5}', '100081 BIT')
        if match:
            print(match.group(0))
        運行結果:100081
3、re.findall(pattern, string, flags=0)
    搜索字符串,以列表類型返回全部能匹配的子串。其他如上。
    例:
         import re
         match = re.findall(r'[1-9]\d{5}', 'BIT 110002 3521812')
         if match:
             print(match)
        運行結果:['110002', '352181']
4、re.split(pattern, string, maxsplit=0, flags=0)
    將一個字符串按照正則表達式匹配結果進行分割,返回列表類型。
    maxsplit:最大分割數,剩餘部分作爲最後一個元素輸出
    例:
        import re
        match = re.split(r'[1-9]\d{5}', 'BIT 1100020BAT3521812')
        if match:
            print(match)
        運行結果:['BIT ', '0BAT', '2']
        import re
        match = re.split(r'[1-9]\d{5}', 'BIT 1100020 BAT3521812',maxsplit=1)
        rint(match)
        運行結果:['BIT ', '0BAT3521812']
5、re.finditer(pattern, string, flags=0)
    搜索字符串,返回一個匹配結果的迭代類型,每個迭代元素是match對象。
    例:
        import re
        for m in re.finditer(r'[1-9]\d{5}', 'BIT 1100020 BAT3521812'):
            print(m.group(0))
        運行結果:110002
                 352181
6、re.sub(pattern, repl, string, count=0, flags=0)
    在一個字符串中替代所有匹配正則表達式的子串,返回替代後的字符串。
    reql:替換匹配字符串的字符串
    count:匹配的最大替換次數
    例:
        import re
        m = re.sub(r'[1-9]\d{5}','哈哈哈', 'BIT 110002 BAT3521812')
        print(m)
        運行結果:BIT 哈哈哈 BAT哈哈哈2

*********************************  re庫的另一種等價用法  *********************************
函數式用法:一次性操作
>>> rst = re.search(r'[1-9]\d{5}', 'BIT 100081')

面向對象用法:編譯後的多次操作
>>> pat = re.compile(r'[1-9]\d{5}')
>>> rst = pat.search('BIT 100081')

**********************************  re庫的 match對象  ***********************************
Match對象的方法:

    .group(0):獲得匹配後的字符串
    .start():匹配字符串在原始字符串的開始位置
    .end():匹配字符串在原始字符串的結束位置
    .span():返回(.start, .end())

Match對象的屬性:
    .string:帶匹配的文本
    .re:匹配時使用的pattern對象(正則表達式)
    .pos:正則表達式搜索文本的開始位置
    .endpos:正則表達式搜索文本的結束位置

注意:match對象只返回一次匹配對象

**********************************  re庫的貪婪匹配  ***********************************
Re庫默認採用貪婪匹配,即輸出匹配最長的字符串
例:
    import re
    match = re.search(r'PY.*N', 'PYANBNCNDN')
    print(match.group(0))

    運行結果:PYANBNCNDN

最小匹配:
*?:前一個字符0次或無限次擴展,最小匹配
+?:前一個字符1次或無限次擴展,最小匹配
??:前一個字符0次或1次擴展,最小匹配
{m,n}?:擴展前一個字符m至n次(含n),最小匹配

例:
    import re
    match = re.search(r'PY.*?N', 'PYANBNCNDN')
    print(match.group(0))

    運行結果:PYAN
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章