Python爬蟲(三)——正則表達式

1、正則表達式

  因此叫正則表達式, 是由於它們能夠識別正則字符串regular string) ;也就是說,它們能夠這麼定義:「 若是你給個人字符串符合規則,我就返回它」,或者是「若是字符串不符合規則,我就忽略它」。這在要求快速瀏覽大文檔,以查找像電話號碼和郵箱地址之類的字符串時是很是方便的。 css

  在編寫處理字符串的程序或網頁時,常常會有查找符合某些複雜規則的字符串的須要。正則表達式就是用於描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。html

  正則表達式並非Python的一部分。正則表達式是用於處理字符串的強大工具,擁有本身獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益於這一點,在提供了正則表達式的語言裏,正則表達式的語法都是同樣的,區別只在於不一樣的編程語言實現支持的語法數量不一樣;但不用擔憂,不被支持的語法一般是不經常使用的部分。若是已經在其餘語言裏使用過正則表達式,只須要簡單看一看就能夠上手了。python

圖1,正則表達式的處理過程git

 

2、正則表達式的規則

  

圖2,正則表達式規則正則表達式

 

3、python RE模塊

  re 模塊使 Python 語言擁有所有的正則表達式功能。compile 函數根據一個模式字符串和可選的標誌參數生成一個正則表達式對象。該對象擁有一系列方法用於正則表達式匹配和替換。re 模塊也提供了與這些方法功能徹底一致的函數,這些函數使用一個模式字符串作爲它們的第一個參數。編程

  3.1 re.match 函數

  re.match 嘗試從字符串的開始匹配一個模式。語法:json

re.match(pattern, string, flags=0)

  參數說明:ruby

  • pattern——匹配的正則表達式
  • string ——要匹配的字符串
  • flags——標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

  匹配成功re.match方法返回一個匹配的對象,不然返回None。markdown

  咱們可使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。編程語言

匹配對象方法 描述
group(num=0) 匹配的整個表達式的字符串,group() 能夠一次輸入多個組號,在這種狀況下它將返回一個包含那些組所對應值的元組。
groups() 返回一個包含全部小組字符串的元組,從 1 到 所含的小組號。

  實例:  

import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"

  輸出結果:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

  3.2 re.research方法

  search方法與match方法極其相似,區別在於match()函數只檢測re是否是在string的開始位置匹配,search()會掃描整個string查找匹配,match()只有在0位置匹配成功的話纔有返回,若是不是開始位置匹配成功的話,match()就返回None。一樣,search方法的返回對象一樣match()返回對象的方法和屬性。

   語法:   

re.search(pattern, string, flags=0)

   參數說明同上,返回一個匹配對象,沒有則返回none。例子:

#導入re模塊
import re
 
# 將正則表達式編譯成Pattern對象
pattern = re.compile(r'world')
# 使用search()查找匹配的子串,不存在能匹配的子串時將返回None
# 這個例子中使用match()沒法成功匹配
match = re.search(pattern,'hello world!')
if match:
    # 使用Match得到分組信息
    print match.group()
### 輸出 ###
# world

  3.3 re.split

  re.split(pattern, string[, maxsplit]),按照可以匹配的子串將string分割後返回列表。maxsplit用於指定最大分割次數,不指定將所有分割。 

import re
 
pattern = re.compile(r'\d+')
print re.split(pattern,'one1two2three3four4')
 
### 輸出 ###
# ['one', 'two', 'three', 'four', '']

  3.4 re.findall(pattern, string[, flags])

  搜索string,以列表形式返回所有能匹配的子串。

 

4、一些經常使用的正則表達式

  檢驗數字:

1 數字:

^[0-9]*$ 

2 n位的數字:

^\d{n}$

3 至少n位的數字:

^\d{n,}$

4 m-n位的數字:

^\d{m,n}$

5 零和非零開頭的數字:

^(0|[1-9][0-9]*)$ 

6 非零開頭的最多帶兩位小數的數字:

^([1-9][0-9]*)+(.[0-9]{1,2})?$ 

7 帶1-2位小數的正數或負數:

^(\-)?\d+(\.\d{1,2})?$ 

8 正數、負數、和小數:

^(\-|\+)?\d+(\.\d+)?$

9 有兩位小數的正實數:

^[0-9]+(.[0-9]{2})?$ 

10 有1~3位小數的正實數:

^[0-9]+(.[0-9]{1,3})?$ 

11 非零的正整數:

^[1-9]\d*$ 
或 
^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$ 

12 非零的負整數:

^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$ 

13 非負整數:

^\d+$ 
或
^[1-9]\d*|0$ 

14 非正整數:

^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$ 

15 非負浮點數:

^\d+(\.\d+)?$ 
或
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ 

16 非正浮點數:

^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ 

17 正浮點數:

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ 

18 負浮點數:

^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ 

19 浮點數:

^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

  校驗字符表達式:

1 漢字:

^[\u4e00-\u9fa5]{0,}$ 

2 英文和數字:

^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$ 

3 長度爲3-20的全部字符:

^.{3,20}$ 

4 由26個英文字母組成的字符串:

^[A-Za-z]+$

5 由26個大寫英文字母組成的字符串:

^[A-Z]+$

6 由26個小寫英文字母組成的字符串:

^[a-z]+$

7 由數字和26個英文字母組成的字符串:

^[A-Za-z0-9]+$ 

8 由數字、26個英文字母或者下劃線組成的字符串:

^\w+$ 
或 
^\w{3,20}$ 

9 中文、英文、數字包括下劃線:

^[\u4E00-\u9FA5A-Za-z0-9_]+$ 

10 中文、英文、數字但不包括下劃線等符號:

^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$ 

11 能夠輸入含有^%&',;=?$\"等字符

[^%&',;=?$\x22]+ 

12 禁止輸入含有~的字符:



[^~\x22]+

  特殊需求表達式

  

1 Email地址:

^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 

2 域名:

[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? 

3 InternetURL:

[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ 

4 手機號碼:

^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ 

5 電話號碼("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):

^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$

6 國內電話號碼(0511-440522二、021-87888822):

\d{3}-\d{8}|\d{4}-\d{7}

7 身份證號(15位、18位數字):

^\d{15}|\d{18}$

8 短身份證號碼(數字、字母x結尾):

^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$ 

9 賬號是否合法(字母開頭,容許5-16字節,容許字母數字下劃線):

^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 

10 密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):

^[a-zA-Z]\w{5,17}$ 

11 強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間):

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 

12 日期格式:

^\d{4}-\d{1,2}-\d{1,2}

13 一年的12個月(01~09和1~12):

^(0?[1-9]|1[0-2])$

14 一個月的31天(01~09和1~31):

^((0?[1-9])|((1|2)[0-9])|30|31)$

15 錢的輸入格式:


  • 1.有四種錢的表示形式咱們能夠接受:"10000.00" 和 "10,000.00", 和沒有 "分" 的 "10000" 和 "10,000":

    ^[1-9][0-9]*$ 
  • 2.這表示任意一個不以0開頭的數字,可是,這也意味着一個字符"0"不經過,因此咱們採用下面的形式:

    ^(0|[1-9][0-9]*)$ 
  • 3.一個0或者一個不以0開頭的數字.咱們還能夠容許開頭有一個負號:

    ^(0|-?[1-9][0-9]*)$ 
  • 4.這表示一個0或者一個可能爲負的開頭不爲0的數字.讓用戶以0開頭好了.把負號的也去掉,由於錢總不能是負的吧.下面咱們要加的是說明可能的小數部分:

    ^[0-9]+(.[0-9]+)?$ 
  • 5.必須說明的是,小數點後面至少應該有1位數,因此"10."是不經過的,可是 "10" 和 "10.2" 是經過的:

    ^[0-9]+(.[0-9]{2})?$ 
  • 6.這樣咱們規定小數點後面必須有兩位,若是你認爲太苛刻了,能夠這樣:

    ^[0-9]+(.[0-9]{1,2})?$ 
  • 7.這樣就容許用戶只寫一位小數.下面咱們該考慮數字中的逗號了,咱們能夠這樣:

    ^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$ 
  • 8.1到3個數字,後面跟着任意個逗號+3個數字,逗號成爲可選,而不是必須:

    ^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
  • 備註:這就是最終結果了,別忘了"+"能夠用"*"替代若是你以爲空字符串也能夠接受的話(奇怪,爲何?)最後,別忘了在用函數時去掉去掉那個反斜槓,通常的錯誤都在這裏


16 xml文件:

^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$ 

17 中文字符的正則表達式:

[\u4e00-\u9fa5]

18 雙字節字符:

[^\x00-\xff] (包括漢字在內,能夠用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)) 

19 空白行的正則表達式:

\n\s*\r    (能夠用來刪除空白行)

20 HTML標記的正則表達式:

<(\S*?)[^>]*>.*?</\1>|<.*? /> (網上流傳的版本太糟糕,上面這個也僅僅能部分,對於複雜的嵌套標記依舊無能爲力) 

21 首尾空白字符的正則表達式:

^\s*|\s*$ 或 (^\s*)|(\s*$) (能夠用來刪除行首行尾的空白字符(包括空格、製表符、換頁符等等),很是有用的表達式) 

22 騰訊QQ號:

[1-9][0-9]{4,} (騰訊QQ號從10000開始) 

23 中國郵政編碼:

[1-9]\d{5}(?!\d)    (中國郵政編碼爲6位數字)

24 IP地址:

\d+\.\d+\.\d+\.\d+    (提取IP地址時有用)

25 IP地址:

((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

5、參考文檔:

  • http://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html
  • http://cuiqingcai.com/977.html
  • https://wizardforcel.gitbooks.io/w3school-python/content/25.html
相關文章
相關標籤/搜索