請問python的正則模塊有封裝好的庫嗎?

已邀請:

李晨

贊同來自:


我正在用python的一個爬蟲框架寫爬蟲,爬蟲框架自帶pyquery來解析html獲取想要的內容。但是在使用的過程中感覺不是太通用。有以下兩點問題:



  • 同一個網站中聯系人的位置老是變動,因為前面的信息個數不一樣。html結構變動後pyquery就不能正常獲取想要的數據瞭。

  • 有時候目標節點裡還有子節點或是同節點有其它不需要的字符串,獲取數據時就會多餘很多不需要的字符。


基於以上需求想使用正則表達式來獲取想要的內容。但是python的正則表達式對中文支持的不是太好,需要轉碼才能匹配,規則也不好測試。

請問python有沒有封裝好的正則類呢?輸入包含有中文的正則表達式也能自動轉碼匹配的


--cut--


eph在2015-12-19 12:20:31回答到:


Python 正則表達式對中文支持沒有任何問題,可以在 unicode 下匹配,可以在 GBK 編碼下匹配,也可以在 UTF8 編碼匹配。隻要正則表達式和字符串都是 unicode,或者采用相同的編碼,不會有任何問題。至於比如說用 GBK 編碼的正則匹配 UTF8 的字符串,無論哪個正則引擎都做不到,因為這完全不是正則的問題。


在編碼問題上,正則匹配和字符串匹配的性質是一樣的,如果覺得正則難以理解,可以思考一下字符串匹配。


例如,“搜索”這個詞在 Python 中常見的形式有三種:



  • unicode 字符串 u'\u641c\u7d22'

  • GBK 編碼字符串 '\xcb\xd1\xcb\xf7'

  • UTF8 編碼字符串 '\xe6\x90\x9c\xe7\xb4\xa2'


u'搜' in u'搜索' 在 unicode 下進行匹配,實際上就是 u'\u641c' in u'\u641c\u7d22''搜' in '搜索' 則有點復雜,如果在 GBK 編碼的文件或終端下,等價於 '\xcb\xd1' in '\xcb\xd1\xcb\xf7';在 UTF8 編碼的文件或終端下,等價於 '\xe6\x90\x9c' in '\xe6\x90\x9c\xe7\xb4\xa2'。但以上三種情況都是 True。然而如果一個字符串是 GBK,另一個是 UTF8,相當於 '\xcb\xd1' in '\xe6\x90\x9c\xe7\xb4\xa2',自然是 False 瞭。


但這裡其實隱藏瞭一個陷阱,編碼後的字符串長度大於 2,GBK 編碼下中間兩個字符 '\xd1\xcb' 其實是 GBK 編碼下的“閹”字。所以可以在 GBK 編碼的文件或終端下執行以下語句:


>>> '閹' in '搜索'
True


如果是在 unicode 下,則“搜索”這個詞的長度是 2,不會發生這種問題。所以如果先將字符串都轉成 unicode 就不容易犯錯。除非你對編碼問題理解得足夠透徹,否則不建議對編碼後的字符串進行正則匹配,雖然這是完全可行的。

要回復問題請先登錄註冊