成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

經(jīng)驗拾憶(純手工)=> Python正則全解詳解

Luosunce / 2656人閱讀

預編譯
import re
re1 = re.compile(r"元字符 組成的正則規(guī)則")    # 元字符下面會說
re1.方法()                     # 方法下邊也會說
元字符:
表示普通字符:
    .    # 除了
外 都可以匹配的到                
    d   # 只匹配 純數(shù)字 0-9
    D   # 和 d相反, 除了數(shù)字全都匹配
    s   # 只匹配空格
    S   # 和 s相反,除了空格,全都匹配         # 我喜歡用 [sS]*? 匹配所有
    w   # 只匹配 純數(shù)字 或 大小寫字母 或 下劃線
    W   # 與 w 恰好相反,     除了 純數(shù)字、大小寫字母、下劃線 全都匹配
    []   # [abcde] 只要包含這個列表的字符,都可以匹配的到。但默認只取一個, 簡寫 [a-e]
             eg: re.compile(r"[e-h]").match("hello python ").group(0)
             >>> h
         此外:  [^abcde] 或 [^a-e] 表示 "排除",意思就是 除了abcde全匹配
    
匹配表示邊界的:
    ^    # 匹配 起始 位置,受 re.M 影響     #注意:不要和 [^123] 除123之外搞混
         eg:
            import re
            r1 = re.compile(r"^d+")
            print(r1.search("456hello123").group())
            >>> 456

    $    # 匹配 結(jié)尾 位置,受 re.M 影響
         eg:
            import re
            
            s = """
            123abc456
            678abc789
            """
            r1 = re.compile(r"d+$",re.M)    # 注意這里加入了re.M
            print(r1.findall(s))
            >>> ["456", "789"]    # 這是寫了re.M,就意味著 每一行都給你多帶帶按照規(guī)則處理
            >>> ["789"]           # 如果沒寫re.M, 那么就按照整體,去最后一行的尾部
            注: 其實re.M的本質(zhì)是 是根據(jù)
,進行 斷行,斷行后對每一行按照規(guī)則多帶帶處理
            
    : # 匹配 單詞的 邊界(除了 數(shù)字、中英字母、下劃線 的 所有符號)
        eg:
            import re
            s = "你好啊----好個P"
            r1 = re.compile(r"好")
            print(r1.findall(s))
            >>> 好    
            # 解釋:這個‘好’是,后面  的那個。因為后面的 ’好‘ 字 左邊是符號,而非單詞字符
                       
    B: # 匹配 單詞 非 邊界(包括 數(shù)字、中英字母、下劃線)
        eg:
            import re
            s = "你好啊----好個P"
            r1 = re.compile(r"好")
            print(r1.findall(s))
            >>> 好    
            # 解釋:這個‘好’是,前面  的那個。因為前面的 ’好‘ 字 左邊是中文字符。屬于非邊界
            # 所以就匹配上了
        
        再次總結(jié):  與 B:
            : 匹配邊界字符。邊界字符:(除了 數(shù)字、字母、漢字、下劃線的所有符號)
            B: 匹配非邊界字符。非邊界字符:(數(shù)字、字母、漢字、下劃線)
    
匹配表示數(shù)量的:
    *    :    0次 或 多次                    eg: 你*
    +    :    1次 或 多次                    eg:  你+
    ?    :    0次 或 一次                    eg:  你?
    {m}  :     出現(xiàn)m次                        eg:  你{3}
    {m,} :    至少 出現(xiàn)m次                   eg:  你{3,}   # 涉及到貪婪模式,不深的不要用
    {m,n}:     m次 到 n次  之間任意一次就行    eg:  你{3,6}
    
表示分組:
    |    : 相當于或運算符, 兩邊寫的是 正則表達式,  優(yōu)先選擇左邊的
    ()   :  括起來里面的內(nèi)容,就變成了分組。 可以用 .group(1)提取,如果有更多那就 group(2)..
    (?P) : 在上面分組的基礎(chǔ)上 起別名
    (?P=name)  :  根據(jù)分組的別名來使用分組
        eg:
            s = "

你好

" r1 = re.compile(r"<(?Pw+)>(w+)").match(s).group(2) print(r1) >>> 你好 數(shù)字 :提取的分組可以在 同一個正則中 復用 eg: s = "

你好

" r1 = re.compile(r"<(w+)>(w+)") # 1 代表復用第一個分組 print(r1.match(s).group(2)) # 2代表提取第二個分組 >>> 你好
匹配模式
re.M    # 多行匹配, 影響   ^ 和 $,上面講  ^ 與 $已經(jīng)詳解了。
re.I    # 忽略大小寫
        eg:
            s = "aAbB"
            r1 = re.compile(r"aabb", re.I).match(s).group()
            print(r1)
            >>> aAbB

re.S    # 提升 . 的權(quán)限,  讓 .  可以 匹配到換行符
        s = """
        hello
        python
        """
        r1 = re.compile(r".*", re.S).match(s).group()    # 注意這里 re.S
        print(r1)
        >>> hello
            python
        注意:如果不寫 re.S 那么 .* 只能匹配到第一行的空字符串,因為遇到第一個空行的
就停止了
        
re.X    # 可以給正則分行寫,并可以加注釋,
    eg:
        import re
    
        title = "1好2你3"
        r1 = re.compile(r"""
            1     # 注釋1  看這兩行
            好    # 注釋2  看這兩行,1 和 好 沒有加逗號。但是他們屬于整體的規(guī)則,你可以加注釋
        """, re.X)        # 把正則可以分行寫,  用了re.X后,分行的正則會被看作為一行
        result = r1.match(title).group()
        print(result)    # 輸出結(jié)果: 1好


貪婪模式 與 非貪婪模式
個人理解: 
    貪婪模式:(Python默認使用的就是 貪婪模式) 
        你想匹配 一個句子中的 一個單詞, 但是你寫的規(guī)則恰好可以 滿足 匹配所有單詞。
        那么它就會 貪婪的 把所有單詞 全部 都給你匹配出來。   (貪)
        
        使用方法:
            * 或 +
            
    非貪婪模式:
        即使你把規(guī)則寫的很好,并且能把所有字符串都匹配到, 但是如果你加上了  非貪婪模式。
        在滿足規(guī)則條件的前提下,只匹配一個.
        
        使用方法:
            *? 或 +?

    eg1:基于search的貪婪模式(match同此)
        我們先回憶一下:search()方法的 最核心思想就是:從前往后搜,搜到一個滿足的就直接返回。
        OK,繼續(xù)。
        
        貪婪:(默認):
            import re
            r1 = re.compile(r"d+")
            print(r1.search("你好333你好333你好").group())
            >>> 333        # 滿足規(guī)則后 盡可能貪, 所以第一串連著的 "333"  搜到了就直接返回了
        
        非貪婪(就多了個問號 ? ):
            import re
            r1 = re.compile(r"d+?")
            print(r1.search("你好333你好333你好").group())
            >>> 3          # 嗯,你的規(guī)則就是 至少一個數(shù)字,搜到了一個就可以返回了,干得漂亮。
            
    
    eg2: 基于findall的貪婪模式(如果你findall與規(guī)則,理解的不透徹,這個會有點繞的,前方高能)
        先回憶一下:findall()方法的 最核心思想就是:拿著 定死的 規(guī)則,把所有滿足規(guī)則的都提出來
        OK,繼續(xù)。
        
        貪婪(默認):
            import re
            r1 = re.compile(r"d+")
            print(r1.findall("你好333你好333你好"))
            >>> ["333", "333"]
            
            解釋: 規(guī)則是匹配至少一位數(shù)字。
                  但是 貪婪模式 提醒了 規(guī)則:“你的任務(wù)是給我盡可能的 多匹配數(shù)字”
                  findall 拿著 被貪婪化的 規(guī)則 去匹配原始字符串
                  
                  被貪婪模式 提醒過的規(guī)則果然不負眾望,  一次提一串連著的 ‘333‘  
                  findall 拿著它 提取了   兩次   ,就把所有數(shù)字提取出來了
                  結(jié)果就是    ["333", "333"]
                  
        非貪婪:
            import re
            r1 = re.compile(r"d+?")
            print(r1.findall("你好333你好333你好"))
            >>> ["3", "3", "3", "3", "3", "3"]

            解釋: 規(guī)則 同樣是 匹配至少一位數(shù)字。
                  但是 非 貪婪模式 提醒了 規(guī)則:“你的任務(wù)是給我盡可能的 少  匹配數(shù)字”
                  findall 拿著 被貪婪化的 規(guī)則 去匹配原始字符串
          
                  被貪婪模式 提醒過的規(guī)則果然不負眾望,  一次只提取一個 ‘3‘  
                  findall 拿著它 提取了   六次   ,才把所有數(shù)字提取出來了
                  結(jié)果就是    ["3", "3", "3", "3", "3", "3"]
匹配方法
match():
    """
        match()方法是 根據(jù)規(guī)則從第一個開始,向后逐個匹配,如果有一個字符匹配不上,就返回None
    """
    
    s = "hello python"
    re1 = re.compile(r"he")  
    re1.match("")
    result = re1.match(s).group() if re1.match(s) else None   # 注意:非None才有g(shù)roup方法
    print(result)        # 通過 group()方法獲得的才是最終 正則匹配的字符串
    >>> he
    
    簡單分組提?。?        s = "hello python"
        re1 = re.compile(r"h(e)llo") # 給e加個一個(),就代表添加了分組,一會要把他提出來
        result = re1.match(s).group(1) if re1.match(s) else None 
            # 注意上方的  group(1)  這個參數(shù)是1,代表 只 提取 分組 里面的內(nèi)容
                >>> e
            # 如果是 group() 或 group(0)  代表提取 整個正則規(guī)則 的內(nèi)容
                >>> hello
        print(result)    
        >>> e
    
    嵌套-平行(深度-廣度)分組提?。?        原理:分組提取先提取嵌套的,后提取平行的 (專業(yè)點就是先深度,后廣度)
        eg:
            a = "123-%%%-dd"
            result = re.compile(r"123(-(%%%)-)d(d)").match(a).groups()   
            # 或者用 group(1), group(2), group(3) 代替groups() 單個看也行
            print(result)
            >>> ("-%%%-", "%%%", "d") 

search():
    """
        search() 方法是: 從前向后按規(guī)則‘搜索’, 直到搜到位置,搜不到就返回None
    """
    s = "aaa123aaa"
    r1 = re.compile(r"d+").search(s).group()
    print(r1)     
    >>> 123

findall():
    """
        findall() 方法是: 按照正則規(guī)則,搜索所有符合規(guī)則的字符串,以列表的形式作為結(jié)果返回
    """
    s = "aaa---123---bbb"
    r1 = re.compile(r"w+").findall(s)
    print(r1)
    >>> ["aaa", "123", "bbb"]
    
    微不足道的擴展:
        a = "123-%%%-dd"
        result = re.compile(r"-(.*?)-").findall(a)
        print(result)
        >>> %%%
        # 解釋: findall() 方法中 如果規(guī)則中含有分組,那么就會只返回分組中提取的的內(nèi)容
        
finditer():
    """
        finditer() 和 findall() 使用方式一樣,只不過返回結(jié)果是 可迭代對象,easy,此處不在多說
    """
    
split():
    """
        split()方法是:按照規(guī)則去切割,切割結(jié)果以列表的方式返回
    """
    語法關(guān)聯(lián):
        我們知道字符串  有 split() 方法,可以按照一個參數(shù)損耗來切割,但是這個參數(shù)只能指定一個
        如果讓你在多種規(guī)則的前提下切割,需要怎么辦。
        巧了,正則切割split() 方法就是解決這個問題的, 實例如下:
        
    s = "aaa%%123@@bbb"                  # 可以看見,%和@符號把字符分開了,現(xiàn)在我們只想要字符
    r1 = re.compile(r"W+").split(s)     # W 大寫: 以非單詞性字符作為損耗規(guī)則,來切割
    print(r1)
    >>> ["aaa", "123", "bbb"]

sub():
    """
        sub()方法是: 按照規(guī)則匹配選出代替換的字符,然后自己 給定字符去替換
    """
    場景1:常用方式,自己給定目標字符串,按規(guī)則匹配并直接替換原始字符串
        eg:
            s = "aaa%%123@@bbb"
            r1 = re.compile(r"W+").sub("你好",s)
            print(r1)
            >>> aaa你好123你好bbb
        
    場景2:正則匹配后的結(jié)果 經(jīng)過函數(shù)操作,函數(shù)的返回值作為 替換的最終結(jié)果
        eg:
            s = "aaa%%123@@bbb"
            r1 = re.compile(r"W+").sub(lambda a:a.group()*2, s)
            print(r1)
            >>> aaa%%%%123@@@@bbb
            解釋: 按照規(guī)則匹配到的字符是 %%和@@,經(jīng)過函數(shù) 乘以2后, 就替換成了 %%%%和@@@@
            
subn():
    """
        subn() 和 sub()語法幾乎一樣,唯一的擴展功能就是 返回結(jié)果是元組,(字符串, 次數(shù))
    """
    s = "aaa%%123@@bbb"
    r1 = re.compile(r"W+").subn("你好",s)
    print(r1)
    >>> ("aaa你好123你好bbb", 2)
    
        
        

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45093.html

相關(guān)文章

  • 經(jīng)驗拾憶手工)=&gt; Python高階函數(shù)操作

    摘要:解釋就相當于把每個序列元素的每一個單獨用一個管道函數(shù)處理,再把他們按順序組合成一個新可迭代對象注意這個管道函數(shù)只能是單參數(shù)函數(shù),如果想傳遞多個參數(shù)怎么辦使用偏函數(shù)怕有些人看不懂,這里就不用了,而是用普通函數(shù)定義方式固定值固定值固定值固定值固 map In [25]: list(map(lambda a:a**2, [1,2,3,4])) Out[25]: [1, 4, 9, 16] 解...

    Elle 評論0 收藏0
  • 經(jīng)驗拾憶手工)=&gt; Python基本數(shù)據(jù)類型

    摘要:不要疑惑,告訴你答案這個代表正負號的正。雖然一點技術(shù)含量沒有,但是你要懂序列也許叫可迭代對象更為合適,但是我喜歡叫序列。 數(shù)據(jù)結(jié)構(gòu) 可變類型與不可變類型(重頭戲) 基操: 可變類型:[], {} # 可增刪改 查 不可變類型: int float str () # 無法增刪改, 只可查 升操: + 與...

    Andrman 評論0 收藏0
  • 經(jīng)驗拾憶手工)=&gt; Python三程

    摘要:多線程對于爬蟲方面也可以表現(xiàn)出較好的性能。計算密集型就別想多線程了,一律多進程。所以同一時刻最大的并行線程數(shù)進程數(shù)的核數(shù)這條我的個人理解很模糊,參考吧多線程多線程有種通過的那種方式,非常普遍,此處就不寫了。 GIL的理解 GIL這個話題至今也是個爭議較多的,對于不用應(yīng)用場景對線程的需求也就不同,說下我聽過的優(yōu)點: 1. 我沒有用過其他語言的多線程,所以無法比較什么,但是對于I/O而言,...

    Snailclimb 評論0 收藏0
  • 經(jīng)驗拾憶手工)=&gt; Python__黑魔法__

    摘要:類的繼承類繼承有三種調(diào)用方式,其實是有區(qū)別的,聽我慢慢道來第一種父類方法參數(shù)直接調(diào)用第二種方法參數(shù)直接調(diào)用在誰的類下調(diào)用,就找此類對應(yīng)的下一個就是要繼承的第三種方法參數(shù)找類名對應(yīng)的的下一個,就是繼承的,一般寫本身的類名上下文管理器上下文管理 類的繼承 類繼承有三種調(diào)用方式,其實是 有區(qū)別 的,聽我慢慢道來 class A: def say(self, name): ...

    tulayang 評論0 收藏0
  • 經(jīng)驗拾憶手工)=&gt; Python三器

    摘要:也就是給原函數(shù)加個外殼。類裝飾填充了啊我是原函數(shù)類裝飾填充了啊我是原函數(shù)說明后面關(guān)于類的裝飾器如果理解困難當做了解即可,用的也少。 可迭代對象、生成器、迭代器三者的關(guān)系 1. 迭代器一定是可迭代對象 2. 生成器是迭代器的一種 3. 可迭代對象:必須實現(xiàn) __iter__方法 4. 迭代器:必須實現(xiàn) __iter__方法 和 __next__ 方法 5. 生成器:必須實現(xiàn) __it...

    Miracle_lihb 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<