正則表達(dá)式入門-python代碼

題記

本文介紹了Python對于正則表達(dá)式的支持,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫的完整介紹及使用示例。

正則表達(dá)式在很多的應(yīng)用中都有使用到,特別是在網(wǎng)絡(luò)爬蟲中格式化html后取出自己需要的屬性,在字符串的匹配和查找中也有很多的應(yīng)用。

本文主要使用python對正則表達(dá)式進(jìn)行說明,并配合合適的代碼。

如何匹配手機(jī)號碼

正則表達(dá)式的規(guī)則,一開始看的時(shí)候,會感覺規(guī)則太多太亂,毫無規(guī)律可尋,看完了幾個(gè)例子以后,慢慢的發(fā)現(xiàn)一些常用的表達(dá)式以后,寫起后面的規(guī)則就容易得多了。

這里以如何匹配手機(jī)電話號碼為例子

最簡單的手機(jī)規(guī)律為11個(gè)數(shù)字,正則表達(dá)式為:

\d{11}

這樣我們就認(rèn)為凡事字符串中有11位數(shù)字就認(rèn)為是手機(jī)號碼,但是現(xiàn)實(shí)中還有另外一些規(guī)則,12345678912這也是11個(gè)數(shù)字,但是我們現(xiàn)在并不會認(rèn)為他是手機(jī)號碼,所以進(jìn)一步的把規(guī)則寫細(xì)了。

我們還可以進(jìn)一步的細(xì)分為,13x開頭,14x開頭,17(13678)開頭,18x開頭,后面再帶8位的數(shù)字,還有另一種情況是170的情況,其中第四位為[0589]中的一個(gè)數(shù),再帶7位數(shù)字。
表達(dá)式可以寫為:

(13\d|14[57]|15[^4,\D]|17[13678]|18\d)\d{8}|170[0589]\d{7}

正則表達(dá)式語法

我們剛才用到的\d 在正則表達(dá)式中,代表著數(shù)字的意思,還可以用[0-9]來表示一個(gè)數(shù)字。語法比較多,但是常用的并不是很多,圖中表示的是常見的語法。

字符串匹配:

語法 含義
\d 數(shù)字
\D 非數(shù)字
\s 空白符
\S 非空白符
\w 單詞字符
\W 非單詞字符

數(shù)量匹配:

語法 含義
* 匹配前面字符0次到無限次
+ 匹配前面字符1次到無限次
? 匹配前面字符0到1次
{m} 匹配前面字符m次
{m,n} 匹配前面字符m到n次

匹配邊界:

語法 含義
^ 匹配字符串開頭
$ 匹配字符串末尾

圖中的表達(dá)式都有專門的例子介紹,可以大概的看看,需要用到的時(shí)候在專門來進(jìn)行查詢。

python中的re模塊

在python中,有專門的模塊來負(fù)責(zé)正則表達(dá)式,就是re模塊。

字符串是否匹配規(guī)則

比如在用戶注冊里,我們要求用戶輸入的手機(jī)號碼,符合手機(jī)號碼的規(guī)律,可以用正則表達(dá)式來限制。

查看字符串中
是否有符合要求的字符串,還是以剛才的手機(jī)號碼為例:

import re
str = '15259340987'
# 將正則表達(dá)式編譯成Pattern對象
pattern = re.compile('152\d{8}')
# 使用Pattern匹配文本,獲得匹配結(jié)果,無法匹配時(shí)將返回None
match = pattern.match(str)
if match:
    # 使用Match獲得分組信息
    print match.group()

這里可以看出正則表達(dá)式,用的是

re.compile('152\d{8}')

這個(gè)表達(dá)式比

(13\d|14[57]|15[^4,\D]|17[13678]|18\d)\d{8}|170[0589]\d{7}

是嚴(yán)格非常多的,他只匹配,152開頭的手機(jī)號碼,當(dāng)然表達(dá)式可以根據(jù)你自己的需要來選擇,這里只是給一個(gè)實(shí)例。

找出所有符合規(guī)則的字符串

在網(wǎng)頁爬蟲中,我們需要找出網(wǎng)頁的說有鏈接,用正則匹配就非常容易做到,查看網(wǎng)頁源代碼中的html,帶有網(wǎng)頁鏈接的代碼為


正則表達(dá)式可以寫成:

href="(.*?)"

python代碼為:

import re
str = '
# 匹配
links = re.findall('href="(.*?)"', str)

for link in links:
    print link

# 輸出為: 
# http://tech.sina.com.cn/t/2017-08-17/doc-ifykcppx8531845.shtml

找出了所有需要的鏈接。

re模塊中重要的接口

  • re.compile(pattern, flags=0)

    這個(gè)方法是Pattern類的工廠方法,用于將字符串形式的正則表達(dá)式編譯為Pattern對象。 第二個(gè)參數(shù)flag是匹配模式,取值可以使用按位或運(yùn)算符'|'表示同時(shí)生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)與re.compile('(?im)pattern')是等價(jià)的。

    語句

    prog = re.compile(pattern)
    result = prog.match(string)

    result = re.match(pattern, string)
    等價(jià),第二種寫法較為方便。

  • re.search(pattern, string, flags=0)
這個(gè)方法用于查找字符串中可以匹配成功的子串。從string的pos下標(biāo)處起嘗試匹配pattern,如果pattern結(jié)束時(shí)仍可匹配,則返回一個(gè)Match對象;若無法匹配,則將pos加1后重新嘗試匹配;直到pos=endpos時(shí)仍無法匹配則返回None。 
pos和endpos的默認(rèn)值分別為0和len(string));re.search()無法指定這兩個(gè)參數(shù),參數(shù)flags用于編譯pattern時(shí)指定匹配模式。 
  • re.match(pattern, string, flags=0)

    這個(gè)方法將從string的pos下標(biāo)處起嘗試匹配pattern;如果pattern結(jié)束時(shí)仍可匹配,則返回一個(gè)Match對象;如果匹配過程中pattern無法匹配,或者匹配未結(jié)束就已到達(dá)endpos,則返回None。
    pos和endpos的默認(rèn)值分別為0和len(string);re.match()無法指定這兩個(gè)參數(shù),參數(shù)flags用于編譯pattern時(shí)指定匹配模式。
    注意:這個(gè)方法并不是完全匹配。當(dāng)pattern結(jié)束時(shí)若string還有剩余字符,仍然視為成功。想要完全匹配,可以在表達(dá)式末尾加上邊界匹配符'$'。

  • re.split(pattern, string, maxsplit=0, flags=0)

    按照能夠匹配的子串將string分割后返回列表。maxsplit用于指定最大分割次數(shù),不指定將全部分割。

  • re.findall(pattern, string, flags=0)

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

  • re.sub(pattern, repl, string, count=0, flags=0)

    使用repl替換string中每一個(gè)匹配的子串后返回替換后的字符串。
    當(dāng)repl是一個(gè)字符串時(shí),可以使用\id或\g<id>、\g<name>引用分組,但不能使用編號0。
    當(dāng)repl是一個(gè)方法時(shí),這個(gè)方法應(yīng)當(dāng)只接受一個(gè)參數(shù)(Match對象),并返回一個(gè)字符串用于替換(返回的字符串中不能再引用分組)。
    count用于指定最多替換次數(shù),不指定時(shí)全部替換。

常用的正則表達(dá)式語句

  • 匹配郵箱:\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}

  • 匹配中文:[\u4e00-\u9fa5]

  • 匹配IP(IPV4):(\d+).(\d+).(\d+).(\d+)

  • 匹配身份證:\d{15}|\d{17}[0-9Xx]

  • 匹配手機(jī)號:(13\d|14[57]|15[^4,\D]|17[13678]|18\d)\d{8}|170[0589]\d{7}

正則表達(dá)式工具

正則表達(dá)式語法比較復(fù)雜,開始沒有經(jīng)驗(yàn)的話,調(diào)試起來比較麻煩,現(xiàn)在網(wǎng)上有很多的正則表達(dá)式工具,能幫助我們快速的進(jìn)行試驗(yàn)。有客戶端的工具也有web工具,用起來都較為方便。

用的較多的是RegexBuddy這一款工具,如圖,他可以自動(dòng)的生成各種語言版本的正則表達(dá)式的例子:
如下

RegexBuddy.png

更多入門教程可以參考:[http://www.bugingcode.com/python_start/] (http://www.bugingcode.com/python_start/)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • re模塊手冊 本模塊提供了和Perl里的正則表達(dá)式類似的功能,不關(guān)是正則表達(dá)式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,198評論 0 13
  • 本文介紹了Python對于正則表達(dá)式的支持,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫的完整介紹及使用示例...
    Python程序媛閱讀 1,453評論 0 22
  • 1. 正則表達(dá)式基礎(chǔ) 1.1. 簡單介紹 正則表達(dá)式并不是Python的一部分。正則表達(dá)式是用于處理字符串的強(qiáng)大工...
    隨風(fēng)化作雨閱讀 414評論 0 0
  • 最近對理財(cái)感興趣,無意間看了這本,看了免費(fèi)的部分哈哈,摘錄了自己用的。后期雞肋。 《小狗錢錢的人生整理術(shù)》博多舍費(fèi)...
    G言閱讀 546評論 0 1
  • 林徽因說:時(shí)間是最好的良藥,當(dāng)你覺得力不從心的時(shí)候,莫如將一切都交付給時(shí)間,它會讓你把該忘記的都忘記,讓你漫不經(jīng)心...
    格格西閱讀 300評論 0 0

友情鏈接更多精彩內(nèi)容