Python使用正則表達式(Regular Expression)超詳細


1、導入re庫python

python使用正則表達式要導入re庫。正則表達式

import re
在re庫中。正則表達式一般被用來檢索查找、替換那些符合某個模式(規則)的文本。
ps:另外不少人在學習Python的過程當中,每每由於沒有好的教程或者沒人指導從而致使本身容易放棄,爲此我建了個Python交流.裙 :一久武其而而流一思(數字的諧音)轉換下能夠找到了,裏面有最新Python教程項目可拿,不懂的問題多跟裏面的人交流,都會解決哦!編程

2、使用正則表達式步驟網絡

一、尋找規律;函數

二、使用正則符號表示規律;學習

三、提取信息,若是每個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。spa

3、正則表達式中常見的基本符號對象

1.點號「.」教程

    一個點號能夠代替除了換行符(\n)之外的任何一個字符,包括但不限於英文字母、數字、漢字、英文標點符號和中文標點符號。圖片

2.星號「*」

    一個星號能夠表示它前面的一個子表達式(普通字符、另外一個或幾個正則表達式符號)0次到無限次。

3.問號「?」

    問號表示它前面的子表達式0次或者1次。注意,這裏的問號是英文問號。

4.反斜槓「\」

    反斜槓在正則表達式裏面不能單獨使用,甚至在整個Python裏都不能單獨使用。反斜槓須要和其餘的字符配合使用來把特殊符號變成普通符號,把普通符號變成特殊符號。如:「\n」。

5.數字「\d」

    正則表達式裏面使用「\d」來表示一位數字。再次強調一下,「\d」雖然是由反斜槓和字母d構成的,可是要把「\d」當作一個正則表達式符號總體。

6.小括號「()」

小括號能夠把括號裏面的內容提取出來。

4、常見的正則表達式舉例

1.  .*?(匹配全部內容)

例如:'<title>(.*?)</title>'   將網頁的標題爬取下來。

二、\w 單詞字符[A-Za-z0-9_], "+" 匹配前一個字符1次或無限次 例如:一我的的郵箱是這樣的lixiaomei@qq.com,那麼咱們如何從一大堆的字符串把它提取出來呢? 

pattern: \w+@\w+\.com


思考:若郵箱爲hello123@heuet.edu.com,如何匹配?

pattern:\w+@(\w+\.)?\w+\.com
?表明了匹配0次或者1次括號分組內的匹配內容,"()"則表示被括內容是一個分組,分組序號從pattern字符串起始日後依次排列。由於是匹配0次或1次,那麼就意味着括號內的部分是無關緊要的,因此這個pattern就可能匹配以上兩種郵箱格式。

擴展: \w+@(\w+\.)*\w+\.com 模式就更厲害了," * " 能夠匹配0次或無限次。

5、re庫的核心函數

 

一、compile()函數 (無關緊要)

•     函數定義: compile(pattern, flag=0)

•     函數描述:編譯正則表達式pattern,而後返回一個正則表達式對象。

爲何要對pattern進行編譯呢?《Python核心編程》裏面是這樣解釋的:

使用預編譯的代碼對象比直接使用字符串要快,由於解釋器在執行字符串形式的代碼前都必須把字符串編譯成代碼對象。

二、match()函數

•     函數定義: match(pattern, string, flag=0)

•     函數描述:只從字符串的最開始與pattern進行匹配,匹配成功返回匹配對象(只有一個結果),不然返回None。

 

問題來了,爲何result1結果有這麼多的東西啊?貌似最後一個纔是要匹配的對象。這個要怎麼提取出來呀?

    彆着急,咱們如今獲得的是匹配對象,須要用必定的方法提取,後面會在《匹配對象的方法》章節來解決這個問題,繼續往下看。
三、search()函數

函數定義: search(pattern, string, flag=0)
函數描述:與match()工做的方式同樣,可是search()不是從最開始匹配的,而是從任意位置查找第一次匹配的內容。若是全部的字串都沒有匹配成功,返回None,不然返回匹配對象。


四、findall()函數

函數定義: findall(pattern, string [,flags])
函數描述:查找字符串中全部出現的正則表達式模式,並返回一個匹配列表


上面同時列出了match、search、findall三個函數用法。findall與match和search不一樣的地方是它會返回一個全部無重複匹配的列表。若是沒找到匹配部分,就返回一個空列表。6、匹配對象的方法(提取)

以上re模塊函數的返回內容能夠分爲兩種:

    返回匹配對象:就是上面如 <_sre.SRE_Match object; span=(0, 5), match='12345'>這樣的對象,可返回匹配對象的函數有match、search、finditer。
    返回一個匹配的列表:返回列表的就是 findall。
所以匹配對象的方法只適用match、search、finditer,而不適用與findall。

經常使用的匹配對象方法有這兩個:group、groups、還有幾個關於位置的如 start、end、span就在代碼裏描述了。

一、group方法

方法定義:group(num=0)
方法描述:返回整個的匹配對象,或者特殊編號的字組


再看下面的實例:

 

這裏就須要用到咱們以前提到的分組概念。

分組的意義在於:咱們不只僅想獲得匹配的整個字符串,咱們還想獲得整個字符串裏面的特定子字符串。如上例中,整個字符串是「我12345+abcde」,可是想獲得 「abcde」,咱們就能夠用()括起來。所以,你能夠對pattern進行任何的分組,提取你想獲得的內容。

二、groups方法

方法定義:groups(default =None)
方法描述:返回一個含有全部匹配子組的元組,匹配失敗則返回空元組


7、re模塊的屬性(flag)

re模塊的經常使用屬性有如下幾個:

re.I: 匹配不分大小寫;(經常使用)
re.L: 根據使用的本地語言環境經過\w, \W, \b, \B, \s, \S實現匹配;
re.M: ^和$分別匹配目標字符串中行的起始和結尾,而不是嚴格匹配整個字符串自己的起始和結尾;
re.S: 「.」(點號)一般匹配除了\n(換行符)以外的全部單個字符,該標記表示「.」(點號)可以匹配所有字符;(經常使用)
re.X: 經過反斜線轉義,不然全部空格加上#(以及在該行中全部後續文字)都被忽略,除非在一個字符類中或者容許註釋而且提升可讀性;

 

注意:

若是咱們定義了compile編譯,須要先將flag填到compile函數中,不然填到匹配函數中會報錯; 若是沒有定義compile,則能夠直接在匹配函數findall中填寫flag。
附錄:

正則表達式中語法一覽表

另外不少人在學習Python的過程當中,每每由於沒有好的教程或者沒人指導從而致使本身容易放棄,爲此我建了個Python交流.裙 :一久武其而而流一思(數字的諧音)轉換下能夠找到了,裏面有最新Python教程項目可拿,不懂的問題多跟裏面的人交流,都會解決哦!

本文的文字及圖片來源於網絡加上本身的想法,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。

相關文章
相關標籤/搜索