正則表達式處理文本有如疾風掃秋葉,絕大部分編程語言都內置支持正則表達式,它應用在諸如表單驗證、文本提取、替換等場景。爬蟲系統更是離不開正則表達式,用好正則表達式往往能收到事半功倍的效果。
介紹正則表達式前,先來看一個問題,下面這段文本來自豆瓣的某個網頁鏈接,我對內容進行了縮減。問:如何提取文本中所有郵箱地址呢?
html = """  <style>   .qrcode-app{    display: block;    background: url(/pics/qrcode_app4@2x.png) no-repeat;   }  </style>  <div class="reply-doc content">   <p class="">34613453@qq.com,謝謝了</p>   <p class="">30604259@qq.com麻煩樓主</p>  </div>  <p class="">490010464@163.com<br/>謝謝</p>  """如果你還沒接觸過正則表達式,我想對此會是一籌莫展,不用正則,似乎想不到一種更好的方式來處理,不過,我們暫且放下這個問題,待學習完正則表達式之后再來考慮如何解決。
字符串的表現形式
Python 字符串有幾種表現形式,以u開頭的字符串稱為Unicode字符串,它不在本文討論范圍內,此外,你應該還看到過這兩種寫法:
>>> foo = "hello">>> bar = r"hello"
前者是常規字符串,后者 r 開頭的是原始字符串,兩者有什么區別?因為在上面的例子中,它們都是由普通文本字符組成的串,在這里沒什么區別,下面可以證明
>>> foo is barTrue>>> foo == barTrue
但是,如果字符串中包括有特殊字符,會是什么情況呢?再來看一個例子:
>>> foo = "/n">>> bar = r"/n">>> foo, len(foo)('/n', 1)>>> bar, len(bar)('//n', 2)>>> foo == barFalse>>>"/n" 是一個轉義字符,它在 ASCII 中表示換行符。而 r"/n" 是一個原始字符串,原始字符串不對特殊字符進行轉義,它就是你看到的字面意思,由 "/" 和 "n" 兩個字符組成的字符串。
定義原始字符串可以用小寫r或者大寫R開頭,比如 r"/b" 或者 R"/b" 都是允許的。在 Python 中,正則表達式一般用原始字符串的形式來定義,為什么呢?
舉例來說,對于字符 "/b" 來說,它在 ASCII 中是有特殊意義的,表示退格鍵,而在正則表達式中,它是一個特殊的元字符,用于匹配一個單詞的邊界,為了能讓正則編譯器正確地表達它的意義就需要用原始字符串,當然也可以使用反斜杠 "/" 對常規定義的字符串進行轉義
>>> foo = "http://b">>> bar = r"/b">>> foo == barTrue
正則基本介紹
正則表達式由普通文本字符和特殊字符(元字符)兩種字符組成。元字符在正則表達式中具有特殊意義,它讓正則表達式具有更豐富的表達能力。例如,正則表達式 r"a.d"中 ,字符 'a' 和 'd' 是普通字符,'.' 是元字符,. 可以指代任意字符,它能匹配 'a1d'、'a2d'、'acd' ,它的匹配流程是:
新聞熱點
疑難解答