1. 程式人生 > >python之正則表示式(基礎篇)

python之正則表示式(基礎篇)

前言

在向網頁進行了提交請求之類的之後,我們可以得到了網頁的返回內容,裡面自然而然會有我們想要的資料,但是html元素文字這麼多,我們不可能一 一去找我們需要的資料,這時就需要用到正則表示式了,正則表示式是學爬蟲必須學的內容,而且不止python可以用,java等其他語言都可以用,所以學了好處大大。

正文

什麼是正則表示式?

正則表示式就是一個特殊的字元序列,可以用於檢測一個字串是否與我們的所設定的字串相匹配。功能有快速檢索文字和快速替換一些文字的操作。

python裡面有個處理正則表示式的庫 re。有個方法

findall(pattern,string,flags)

用來匹配正則達式,我們就先用這個方法處理下。

引數如下:

pattern:正則表示式
string:要進行匹配的字串
flags:匹配的模式
結果是一個匹配內容的列表。

常見的匹配模式

模式 描述
\w 匹配字母、數字及下劃線
\W 匹配不是字母、數字及下劃線的字元
\s 匹配任意空白字元,等價於[\t\n\r\f]
\S 匹配任意非空字元
\d 匹配任意數字,等價於[0-9]
\D 匹配任意非數字字元
\A 匹配字串開頭
\Z 匹配字串結尾,如果存在換行,只匹配到換行前的結束字串
\z 匹配字串結尾,如果存在換行,同時還會匹配換行符
\G 匹配最後匹配完成的位置
\n 匹配一個換行符
\t 匹配一個製表符
^ 匹配一行字串的開頭
$ 匹配一行字串的結尾
. 匹配任意字元,除了換行符,當re.DATALL標記被指定時,則可以匹配包括換行符的任意字元
[…] 用來表示一組字元,單獨列出,比如[amk]匹配a、m或k
[^…] 不在[]中的字元,比如[^abc]匹配除了a、b、c之外的字元
* 匹配0個或多個表示式
+ 匹配1個或多個表示式
? 匹配0個或1個前面的正則表示式定義的片段,非貪婪模式
{n} 精確匹配n個前面的表示式
{n,m} 匹配n到m次由前面正則表示式定義的片段,貪婪模式
a|b 匹配a或b
() 匹配括號內的表示式,也表示一個組

‘\d’ : 這個表示匹配單個0-9數字
‘\D’ : 與\d相反,匹配數字以外的內容
用程式碼來感受下:

import re#這個庫是用來使用正則表示式的
a='gfsxg+sad12sakdj34nva5kfh6k78'
r=re.findall('\d',a)#這個就是根據\d的正則表示式來查詢對應字元,其中\d是對應0-9的數字
#查詢非數字用\D
r1=re.findall('\D',a)
print(r)
print(r1)

結果:

['1', '2', '3', '4', '5', '6', '7', '8']
['g', 'f', 's', 'x', 'g', '+', 's', 'a', 'd', 's', 'a', 'k', 'd', 'j', 'n', 'v', 'a', 'k', 'f', 'h', 'k']

可以看到找出了字串中的數字和非數字

如果我們在匹配一個字串時,中間內容是有多個變化的,我們需要應變多種不同的字元,如這個字串:

a='aac,abc,acc,adc,aec,afc,agc'

如果需要匹配這個字串時,我們就需要用到 [ ] ,用中括號括起來的字元,裡面的內容表示或關係,那來看看程式碼:

import re
a='aac,abc,acc,adc,aec,afc,agc'
#現在查詢上面的中間字元為b或者g的字串
#這個要求可以用到字符集來實現
r=re.findall('a[bg]c',a)#[]表示字符集,裡面的內容是或關係
print(r)

結果:

# 結果
['abc', 'agc']

上面匹配了中間字元是b或者是g的字串,匹配中間字元非c和非f,可以在前面加個 ^ 符號:

import re
a='aac,abc,acc,adc,aec,afc,agc'
#現在查詢上面的中間字元為b或者g的字串
#這個要求可以用到字符集來實現
r=re.findall('a[^bg]c',a)#[]表示字符集,裡面的內容是或關係
print(r)

結果:

['aac', 'acc', 'adc', 'aec', 'afc']

上面只處理了中間字元為b者g的字串,但是沒有匹配全部的,若要匹配全部,可以加個 - 符號,表示範圍,如下:

import re
r=re.findall('a[b-f]c',a)#[b-f]就是表示從b到f
print(r)

結果

['abc', 'acc', 'adc', 'aec', 'afc']

概括字符集:
用一個 \ + 字母 表示一系列的字元的元字元,只能匹配單個字元,常用的如下

  • \w:匹配數字和字元「不包括&符號」只匹配單詞,數字和下劃線
  • \W:與\w相反,這個包括空格和回車
  • \s:匹配空格字元,如空格,回車和製表符
  • \S:與\s相反
  • .:匹配除換行符之外的其他字元
    還有前面的\d和\D也是

有個小技巧:如果想要匹配所有字元,就可以把上面的兩個相反的合併起來就可以了。

程式碼如下:

#概括字符集,就是用一個\加個字母來表示一類字元,比如剛開始的\d,\D
import re
a='fdsg\n134\rs3$ ghj%tyu36\t5&'
r=re.findall('\w',a)#這個是匹配數字和單詞
print(r)
#也可以匹配非數字非單詞
r=re.findall('\W',a)
print(r)
#匹配空格字元和製表符等其他字元
r=re.findall('\s',a)
print(r)
#匹配除換行符之外的其他字元
r=re.findall('.',a)
print(r)

結果:

['f', 'd', 's', 'g', '1', '3', '4', 's', '3', 'g', 'h', 'j', 't', 'y', 'u', '3', '6', '5']
['\n', '\r', '$', ' ', '%', '\t', '&']
['\n', '\r', ' ', '\t']
['f', 'd', 's', 'g', '1', '3', '4', '\r', 's', '3', '$', ' ', 'g', 'h', 'j', '%', 't', 'y', 'u', '3', '6', '\t', '5', '&']

數量詞:
當一個字元需要連續重複匹配多次時,就要用到這個。如匹配三個字元組成的字串:
[a-zA-z]{3} ,大括號裡面的表示重複次數。
若要匹配三到六個字元,大括號的就需要這樣寫:{3,6}.

程式碼如下:

#數量詞,當一個字元需要多次重複匹配時就需要用到
import re
a='python java0000php12 html4 css'
r=re.findall('[a-z]{3}',a)#重複多次就用大括號,括號內的數表示重複的次數
print(r)
#也可以重複一個範圍,表示匹配3到6個字元
r=re.findall('[a-z]{3,6}',a)
print(r)#這樣就可以把單詞都找出來了

結果:

['pyt', 'hon', 'jav', 'php', 'htm', 'css']
['python', 'java', 'php', 'html', 'css']

其他數量詞表示:
* :匹配零次或無限多次
+:匹配一次或以上
?:匹配零次或者一次

a='pytho243python34pythonn'
#*表示匹配對應內容0次或者無限次
r=re.findall('python*',a)#這個就是代表對n字元的數量詞匹配
print(r)
#+表示匹配內容1次或者無限次
r=re.findall('python+',a)
print(r)
#?表示可以匹配0次或者1次,注意這個?和上面的非貪婪代表的意思不一樣
r=re.findall('python?',a)
print(r)
# 結果
['pytho', 'python', 'pythonn']
['python', 'pythonn']
['pytho', 'python', 'python']

貪婪匹配:正則表示式預設為貪婪匹配,即匹配符合字串的最大長度,如上面的[a-zA-z]{3,6},他會趨於匹配長度為6的字串,匹配到條件不滿足時才停止匹配。
非貪婪匹配:就是趨於匹配長度最小的字串,匹配滿足第一個條件就會停止匹配。

總結

本文只是介紹了正則表示式的基礎用法,之後會有一篇稍微高階的用法。