Regular Expression、regex或regexp,(縮寫為RE) 是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。
計算機里處理文本和數據是非常重要的事情。
### 一般匹配規則:[?](http://uliweb.clkg.org/tutorial/view_chapter/192#title_0-0-1)
1 字符串匹配
"abcd" 這種是沒有特殊規則,就是完全按照 字符去匹配。 例如:"hello,abcd" 可以匹配。 "hello,abc" 匹配不上。
~~~
>>> import re
>>> re.search("abcd","hello,abcd")
<_sre.SRE_Match object at 0x994e2c0>
>>> re.search("abcd","hello,abdc")
~~~
2 選擇匹配 gray|grey ,“gray” 和"grey " 都能匹配上。 或者用 gr(a|e)y 規則來匹配后面2個單詞 "gray","grey"。
~~~
>>> print re.search("gray|grey","gray")
<_sre.SRE_Match object at 0x994e2c0>
>>> print re.search("gray|grey","grey")
<_sre.SRE_Match object at 0x994e2c0>
>>> print re.search("gray|grey","grcy")
None
>>> print re.search("gr(a|e)y","gray")
<_sre.SRE_Match object at 0xb77268a0>
~~~
3 數量限定
~~~
‘+’ 加號代表前面的字符必須至少出現一次。(1次、或多次)。例如,“goo+gle”可以匹配google、gooogle、goooogle等;
? 問號代表前面的字符最多只可以出現一次。(0次、或1次)。例如,“colou?r”可以匹配color或者colour;
‘*’ 星號代表前面的字符可以不出現,也可以出現一次或者多次。(0次、或1次、或多次)。例如,“0*42” 可以匹配42、042、0042、00042等。
~~~
~~~
>>> re.search("goo+gle","google")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search("goo+gle", "gogle")
>>> re.search("goo+gle", "goooogle")
<_sre.SRE_Match object at 0x994e2c0>
~~~
“?” 例子
~~~
>>> re.search("colou?r","color")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search("colou?r","colour")
<_sre.SRE_Match object at 0x994e2c0>
>>> re.search("colou?r","colouur")
>>> #對比 "+"
>>> re.search("colou+r","colouur")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search("colou+r","color")
~~~
“*” 例子:
~~~
>>> re.search("goo*gle","google")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search("goo*gle","gooogle")
<_sre.SRE_Match object at 0x994e2c0>
~~~
4 [...] 括號里面包含的任意字符
b[aeou]d 匹配"bad","bed","bod","bud"
~~~
>>> re.search("b[aeoud]d","bad")
<_sre.SRE_Match object at 0x994e2c0>
>>> re.search("b[aeoud]d","bed")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search("b[aeoud]d","bud")
<_sre.SRE_Match object at 0x994e2c0>
>>> re.search("b[aeoud]d","bcd")
>>> re.search("b[aeoud]d","baed")
~~~
匹配 [0-9],[0-9a-z]
~~~
>>> re.search('b[0-9a-z]d',"b12d")
>>> re.search('b[0-9a-z]d',"b1d")
<_sre.SRE_Match object at 0xb7717e20>
>>> re.search('b[0-9a-z]d',"bad")
<_sre.SRE_Match object at 0x994e2c0>
~~~
5 多字符匹配 {n}
[0-9]{3} : []以內的字母、數字在后面字符串中出現的次數。 “hd543”,符合規則。 "hello32rew",不符合規則。
~~~
>>> re.search("[0-9]{3}","hd23")
>>> re.search("[0-9]{3}","hd232")
<_sre.SRE_Match object at 0x92ec2c0>
>>> re.search("[0-9]{3}","hd234")
<_sre.SRE_Match object at 0xb77bee20>
>>>
>>> re.search("[0-9]{4}","hd234")
>>> re.search("[0-9d]{4}","hd234")
<_sre.SRE_Match object at 0x92ec2c0>
~~~
6\. []{m,n}, 按照[]內規則匹配 m---n之間個數,m必須小于n。
7 "." 匹配任何1個字符。
~~~
>>> import re
>>> re.search('b.b',"beb")
<_sre.SRE_Match object at 0xb7280170>
>>> re.search('b.b',"bab")
<_sre.SRE_Match object at 0xb7280368>
>>> re.search('b.b',"badb")
>>> re.search('b..b',"badb")
<_sre.SRE_Match object at 0xb7280170>
>>>
~~~
8 “^” 匹配字符串的開始
~~~
>>> re.search('^bad',"badb")
<_sre.SRE_Match object at 0xb7280368>
>>> re.search('^ad',"badb")
>>> re.search('^.ad',"badb")
<_sre.SRE_Match object at 0xb7280170>
>>> re.search('^..ad',"badb")
>>>
~~~
9
"$" 匹配字符串的結尾
~~~
>>> re.search('adb$',"badb")
<_sre.SRE_Match object at 0xb7280170>
>>> re.search('.db$',"badb")
<_sre.SRE_Match object at 0xb7280368>
~~~
10
~~~
'\d' 匹配數字
‘\D' 匹配非數字
~~~
~~~
>>> re.search('\d',"badec3b2v432")
<_sre.SRE_Match object at 0xb7280368>
>>> re.search('\D',"badec3b2v432")
<_sre.SRE_Match object at 0xb7280170>
>>>
~~~
11
~~~
'\w' 匹配任意數字和字母
'\W' 非數字和字母
~~~
12
~~~
'\s' 匹配任意空白字符,相當于 [ \t\n\r\f\v]
\S 匹配任意非空白字符,相當于 [^ \t\n\r\f\v]
~~~
### 使用方法[?](http://uliweb.clkg.org/tutorial/view_chapter/192#title_0-0-2)
A)
~~~
compiled_pattern = re.compile(pattern)
result = compiled_pattern.match(string)
~~~
B)
~~~
result = re.match(pattern, string)
~~~
pattern,就是上面提到的規則。
除了match,以為還有幾個函數,我們一起做說明: match() 函數只在字符串的開始位置嘗試匹配正則表達式,也就是只報告從位置 0 開始的匹配情況。
search() 函數是掃描整個字符串來查找匹配。如果想要搜索整個字符串來尋找匹配,應當用 search()。 但search 返回第一個匹配的字符串。
split() 將字符串按照規則分成list。如果按照規則里面找不到,就不分割,返回原字符串。
~~~
>>> re.split(":","test:test1:test2")
['test', 'test1', 'test2']
~~~
findall() 函數搜索整個字符串,返回所有匹配項。返回一個list。
sub() 函數 查找并替換
~~~
>>> re.sub("one","num","one world, on dream",1)
'num world, on dream'
>>> re.sub("one","num","one world, one dream",1)
'num world, one dream'
>>> re.sub("one","num","one world, one dream",2)
'num world, num dream'
>>>
~~~
可以:
~~~
>>> p = re.compile( '(one|two|three)')
>>> p.sub( 'num', 'one word two words three words')
'num word num words num words'
~~~
匹配網址的實例:
~~~
#coding=utf-8
import re
urls=r'fdsa<a class="pic" href= "http://www.jeapedu.com ">... </a> '
s = re.findall("<a.*href.*>",urls)
print s
~~~
非貪婪匹配 + 后結束標記
~~~
all_buf = re.findall(r'<a.*?href.*?=(.*?)[> ]',buf)
for n in all_buf:
print n
~~~
簡單匹配 @ 后面的用戶正則
~~~
#s = "@fdsa;1232"
s = "fdsfds@fdsa你好.1, 232"
a = re.findall("""@(.*?)(?=[;,| '".?])""",s)
print a[0]
~~~
如果@后面沒有任何特殊符號,就結束了匹配方法,加了$:
~~~
>>> a= re.compile("@(.*?)(?=[ ,'$]|$)")
>>> print a.findall("@sina @abd, @fds")
~~~
- Python爬蟲入門
- (1):綜述
- (2):爬蟲基礎了解
- (3):Urllib庫的基本使用
- (4):Urllib庫的高級用法
- (5):URLError異常處理
- (6):Cookie的使用
- (7):正則表達式
- (8):Beautiful Soup的用法
- Python爬蟲進階
- Python爬蟲進階一之爬蟲框架概述
- Python爬蟲進階二之PySpider框架安裝配置
- Python爬蟲進階三之Scrapy框架安裝配置
- Python爬蟲進階四之PySpider的用法
- Python爬蟲實戰
- Python爬蟲實戰(1):爬取糗事百科段子
- Python爬蟲實戰(2):百度貼吧帖子
- Python爬蟲實戰(3):計算大學本學期績點
- Python爬蟲實戰(4):模擬登錄淘寶并獲取所有訂單
- Python爬蟲實戰(5):抓取淘寶MM照片
- Python爬蟲實戰(6):抓取愛問知識人問題并保存至數據庫
- Python爬蟲利器
- Python爬蟲文章
- Python爬蟲(一)--豆瓣電影抓站小結(成功抓取Top100電影)
- Python爬蟲(二)--Coursera抓站小結
- Python爬蟲(三)-Socket網絡編程
- Python爬蟲(四)--多線程
- Python爬蟲(五)--多線程續(Queue)
- Python爬蟲(六)--Scrapy框架學習
- Python爬蟲(七)--Scrapy模擬登錄
- Python筆記
- python 知乎爬蟲
- Python 爬蟲之——模擬登陸
- python的urllib2 模塊解析
- 蜘蛛項目要用的數據庫操作
- gzip 壓縮格式的網站處理方法
- 通過瀏覽器的調試得出 headers轉換成字典
- Python登錄到weibo.com
- weibo v1.4.5 支持 RSA協議(模擬微博登錄)
- 搭建Scrapy爬蟲的開發環境
- 知乎精華回答的非專業大數據統計
- 基于PySpider的weibo.cn爬蟲
- Python-實現批量抓取妹子圖片
- Python庫
- python數據庫-mysql
- 圖片處理庫PIL
- Mac OS X安裝 Scrapy、PIL、BeautifulSoup
- 正則表達式 re模塊
- 郵件正則
- 正則匹配,但過濾某些字符串
- dict使用方法和快捷查找
- httplib2 庫的使用