成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python中的正則表達(dá)式

Juven / 3223人閱讀

摘要:正則表達(dá)式就是用來描述他稱為正則集的代數(shù)的表達(dá)式,因此采用正則表達(dá)式這個術(shù)語。文本中正則表達(dá)式結(jié)束搜索的索引值與和方法的同名參數(shù)相同。對象是一個編號的正則表達(dá)式通過提供的一系列方法可以對文本進(jìn)行匹配查找。

一、概述

今天這篇文章帶領(lǐng)大家學(xué)習(xí)一下Python中的正則表達(dá)式,當(dāng)然了,正則表達(dá)式本身的內(nèi)容就足以寫好幾本書了,我們這里列出的內(nèi)容,僅僅是Python中常用的和基礎(chǔ)的一些內(nèi)容。

那么我們?yōu)槭裁匆獙W(xué)習(xí)正則表達(dá)式呢,是因為正則表達(dá)式是為了提高復(fù)雜文本分析的效率,簡單點(diǎn)說就是假設(shè)要自己想吃一份蛋炒飯,就需要有很多的流程,比如淘米,煮米,打蛋,炒飯等很多步驟,正則表達(dá)式呢就相當(dāng)于直接到樓下的餐廳去買一份蛋炒飯去吃了,所以學(xué)會了正則表達(dá)式就會節(jié)省很多時間,讓我們更快速的”吃到”我們想要的東西。

正則表達(dá)式的"祖先"可以一直上溯至對人類神經(jīng)系統(tǒng)如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經(jīng)生理學(xué)家研究出一種數(shù)學(xué)方式來描述這些神經(jīng)網(wǎng)絡(luò)。

1956 年, 一位叫 Stephen Kleene 的數(shù)學(xué)家在 McCulloch 和 Pitts 早期工作的基礎(chǔ)上,發(fā)表了一篇標(biāo)題為"神經(jīng)網(wǎng)事件的表示法"的論文,引入了正則表達(dá)式的概念。正則表達(dá)式就是用來描述他稱為"正則集的代數(shù)"的表達(dá)式,因此采用"正則表達(dá)式"這個術(shù)語。

隨后,發(fā)現(xiàn)可以將這一工作應(yīng)用于使用 Ken Thompson 的計算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要發(fā)明人。正則表達(dá)式的第一個實用應(yīng)用程序就是 Unix 中的 qed 編輯器。

如他們所說,剩下的就是眾所周知的歷史了。從那時起直至現(xiàn)在正則表達(dá)式都是基于文本的編輯器和搜索工具中的一個重要部分。

二、什么是正則表達(dá)式

正則表達(dá)式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")。

正則表達(dá)式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串。

正則表達(dá)式是繁瑣的,但它是強(qiáng)大的,學(xué)會之后的應(yīng)用會讓你除了提高效率外,會給你帶來絕對的成就感。許多程序設(shè)計語言都支持利用正則表達(dá)式進(jìn)行字符串操作。下面是一些正則表達(dá)式的語法和說明:

看了這么多的正則表達(dá)式的方法是不是感覺頭很大,沒事慢慢來,我們一點(diǎn)點(diǎn)的開始學(xué)習(xí),一點(diǎn)點(diǎn)的練習(xí)早晚就可以學(xué)會的。

三、正則表達(dá)式期初

1.元字符

下面是一些常用的元字符

代碼

說明

.

匹配除換行符意外的任意字符

w

匹配字母或數(shù)字下?lián)Q線或漢字

s

匹配任意的空白符

d

匹配數(shù)字

b

匹配單詞開始或結(jié)束

^

匹配字符串的開始

$

匹配字符串的結(jié)束

2.字符轉(zhuǎn)義

如果要查找元字符本身的話,比如查找.或者的時候就出現(xiàn)了問題:我們沒有辦法指定它們,因為他們會被解釋成別的意思,這個時候就得使用來取消這些字符的特殊意義。因此,要查找.或的時候就應(yīng)該使用.或*來查找,這時候可能就會有人問了,那如果我要查找怎么辦呢,同理用就可以了。

3.重復(fù)

常用的限定符:

代碼語法

說明

*

重復(fù)零次或更多次

+

重復(fù)一次或更多次

?

重復(fù)零次或一次

{n}

重復(fù)N次

{n,}

重復(fù)n次或更多次

{n,m}

重復(fù)n到m次

4.字符類

如果想要匹配沒有預(yù)定義元字符集合(比如元音字母a,e,I,o,u)怎么辦呢?很簡單,只需要需要在方括號里面列出它們就可以了像[aeiou]就可以匹配任何一個英文元音字母,[.?!]匹配標(biāo)點(diǎn)符號(.或?或!)

也可以通過指定一個字符返回:

像[0-9]代碼的含義與d就是完全一致的:一位數(shù)字。同理[a-z0-9A-Z]也完全等同于w(如果只考慮英文的話)

5.分枝條件

正則表達(dá)式里的分枝條件指的是有幾種規(guī)則,如果滿足其中之一的任意規(guī)則都應(yīng)當(dāng)成匹配,具體方法是用|把不同條件分隔開。

(?0d{2})?[- ]?d{8}|0d{2}[0 ]?d{8}這個表達(dá)式匹配3位區(qū)號的電話號碼,其中區(qū)號可以用小括號括起來,也可以不用,區(qū)號與本地號間可以用連字號或空格間隔,也可以沒有間隔

使用分枝條件時,要注意各個條件的順序,如果要把它改成d{5}|d{5}-d{4}的話,那么久只會匹配5位的郵編(以及9位郵編的前5位)。原因是匹配分枝條件時,將會從左到右地測試每個條件,如果滿足某個分枝的話,就不會再管其它的條件了。

6.分組

如果想要重復(fù)多個字符,可以使用小括號來指定子表達(dá)式(也叫做分組),然后就可以指定這個子表達(dá)式的重復(fù)次數(shù)。(d{1,3}.){3}d{1,3}是一個簡單的IP地址匹配表達(dá)式。如果要理解這個表達(dá)式,請按下面的順序分析:d{1,3}匹配1到3位的數(shù)字,(d{1,3}.){3}匹配3位數(shù)字加上一個英語句號(這個整體也就是這個分組)重復(fù)3次,最后再加上一個1到3位的數(shù)字(d{1,3})

注意的是IP地址中的每個數(shù)字都不能大于255,所以上面的匹配方式也會匹配到256.300.669.999這種不可能存在的IP地址,那么應(yīng)該怎么才能改進(jìn)呢?

7.反義

如果有時會需要查找一些不輸入某個能簡單定義的字符類的字符。比如想查找除了數(shù)字以外,其他任意字符都行的情況,這時候就需要用到反義,下面是一些常用的反義代碼

代碼

說明

w

匹配任意不是字母,數(shù)字,下劃線,漢字的字符

s

匹配任意不是空白符的字符

d

匹配任意非數(shù)字的字符

b

匹配不是單詞開頭或結(jié)束的位置

1

匹配除了x以外的任意字符

2

匹配除了aeiou這幾個字母以外的任意字符

8.貪婪與懶惰

當(dāng)正則表達(dá)式中包涵能接受重復(fù)的限定符時,通常的行為是(在使整個表達(dá)式能夠得到匹配的前提下)匹配盡可能多的字符,以這個表達(dá)式為例:a.*b,他將會匹配最長的以a開始,以b結(jié)束的字符串。如果用來搜索aabab的話,它會匹配整個字符串a(chǎn)abab。這也被成為貪婪匹配。

有時候我們更需要懶惰匹配,也就是匹配盡可能少的字符,前面給出的限定符都可以轉(zhuǎn)化為懶惰匹配模式,只要在它后面加上一個問號?,這樣.*?就意味著匹配任意數(shù)量的重復(fù),但是在能使整個匹配成功的前提下使用最少的重復(fù)。

下面是一些懶惰限定符:

代碼

說明

*?

重復(fù)任意次,但盡可能少重復(fù)

+?

重復(fù)1次或更多次, 但盡可能少重復(fù)

??

重復(fù)0次貨1次, 但盡可能少重復(fù)

{n,m}?

重復(fù)n次到m次, 但盡可能少重復(fù)

{n,}?

重復(fù)n次以上, 但盡可能少重復(fù)

四、Python中的re模塊

Python中通過re模塊提供對正則表達(dá)式的支持。使用re的一般步驟是先將正則表達(dá)式的字符串形式編譯為pattern實例,然后使用pattern實例處理文本并獲得匹配結(jié)果(一個match實例),最后使用match實例獲得信息,進(jìn)行其他操作

1.導(dǎo)入re模塊

2.將正則表達(dá)式編譯為pattern對象

3.使用pattern匹配文本,獲得匹配結(jié)果,無法匹配時將返回None

4.re.compile(strPattern[,flag]):

這個方法是pattern類的工程方法,用于將字符串形式的正則表達(dá)式編譯為pattern對象,第二個參數(shù)是匹配模式,去值可以使用按位或運(yùn)算符’|’表示同時生效,比如re.I|re.M’

可選值有下面六種:

Re.I(re.IGNORECASE):忽略大小寫(括號內(nèi)是完整寫法,下同)

M(MULTILINE):多行模式,改變^和$的行為

S(DOTALL):點(diǎn)任意匹配模式,改變.的行為

L(LOCALE):使預(yù)定字符類w W b B s S取決于當(dāng)前區(qū)域設(shè)定

U(UNICODE):使預(yù)定字符類w W b B s S d D取決于unicode定義的字符屬性

X(VERBOSE):詳細(xì)信息:這個模式下正則表達(dá)式可以是多行,忽略空白字符,并可以加入注釋

Re提供了眾多模塊方法用于完成正則表達(dá)式的功能,這些方法可以使用pattern實例的相應(yīng)方法替代,唯一的好處是少些了一行re.compole()代碼,但同時也無法復(fù)用編譯后的pattern對象,這些方法將在pattern類的實例方法一起介紹,如上面這個例子可以簡寫為:

5.match對象

Match對象是一次匹配的結(jié)果,包含了很多關(guān)于此次匹配的信息,可以使用match提供的可讀屬性或方法來獲取這些信息

Match屬性:

String:匹配使用的文本

Re:匹配使用pattern對象

Pos:文本中正則表達(dá)式開始搜索的索引,值與pattern.match()和pattern.seach()方法的同名參數(shù)相同。

Endpos:文本中正則表達(dá)式結(jié)束搜索的索引,值與pattern.match()和pattern.seach()方法的同名參數(shù)相同。

Lastindex:最后一個被捕獲的分組在文本中的索引,如果沒有被捕獲的分組,將為None

Lastgroup:最后一個被捕獲的分組的別名,如果這個分組沒有別名或者被捕獲的分組,將為None

Match方法:

group([group1,...]):

獲得一個或多個分組截獲的字符串;指定多個參數(shù)時將以元組形式返回。group1 可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫參數(shù)時,返回group(0) ;沒有截獲字符串的組返回None ;截獲了多次的組返回最后一次截獲的子串。

●groups(default]):

以元組形式返回全部分組截獲的字符串。相當(dāng)于調(diào)用group(1,2... last)。default表示沒有截獲字符串的組以這個值替代,默認(rèn)為None。

groupdict([default]):

返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內(nèi)。defalt含義同上。

●start([group]):

返回指定的組截獲的子串在string中的起始索引(子串第一個字符的索引) 。group默認(rèn)值為0。

●end([group):

返回指定的組截獲的子串在string中的結(jié)束索引(子串最后一個字符的索引+1 ). group默認(rèn)值為0。

●span([group]):

返回(start(group),end(group))。

●expand(template):

將匹配到的分組代入template中然后返回。template中可以使用id或g、 g引用分組,但不能使用編號0。id與g是等價的;但10將被認(rèn)為是第10個分組,如果你想表達(dá)1之后是字符"0",只能使g0。

6.pattwern

Pattern對象是一個編號的正則表達(dá)式,通過pattern提供的一系列方法可以對文本進(jìn)行匹配查找。Pattern不能直接實例化,必須使用re.compile進(jìn)行()構(gòu)造。Pattern提供了幾個可讀屬性用于獲取表達(dá)式的相關(guān)信息:

pattern:編譯時用的表達(dá)式字符串。

flags:編譯時用的匹配模式。數(shù)字形式

groups:表達(dá)式中分組的數(shù)量

groupindex:以表達(dá)式中有別名的租的別名為鍵、以改組對應(yīng)的編號為值的字典,沒有別名的租不包含在內(nèi)。

注意:在表達(dá)式前面使用’r’是用來表示字符串內(nèi)部不需要進(jìn)行額外的轉(zhuǎn)義(原生字符串),可以避免很多無法察覺的問題。

五、re模塊的方法

實例方法[re模塊方法]:

1.match(string[,pos[,endpos]])|re.match(pattern,string[,flags]):

這個方法將從string的pos下標(biāo)處嘗試匹配pattern;如果pattern結(jié)束時仍可匹配,則返回一個match對;如果匹配過程中pattern無法匹配,或則匹配未結(jié)束就已到達(dá)endpos,則返回None。

Pos和endpos的默認(rèn)值分別為0和len(string);re.match()無法指定這兩個參數(shù),參數(shù)flags用于編譯pattern時指定匹配模式。

這個方法并不是完全匹配,當(dāng)pattern結(jié)束時若string還有剩余字符,仍然十位成功。想要完全匹配可以在表達(dá)式末尾加上邊界匹配符$。

2.search(string[,pos[,endpos]])|re.search(pattern,string[,flags]):

這個方法用于查找字符串中可以匹配成功的子串,從string的pos下標(biāo)處嘗試匹配pattern,如果pattern結(jié)束時仍可匹配,則返回一個match對象;若無法匹配則將pos加1后重新嘗試匹配;知道pos=endpos時無法匹配則返回None。

Pos和endpos的默認(rèn)值分別為0和len(string);re.search()無法指定這兩個參數(shù),參數(shù)flags用于編譯pattern時指定匹配模式。

3.split(string[,maxsplit])|re.split(pattern,string[,maxsplit])’

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

4.findall(string[,pos[,endpos]])|re.findall(pattern,string[,flags]):

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

5.finditer(string[,pos[,endpos]])|re.finditer(pattern,string[.flags]):

搜索string,返回一個順序訪問每一個匹配結(jié)果(match對象)的迭代器

6.sub(repl,string[,count])|re.sub(pattern,repl,string[,count]):

使用repl替換string中的每一個匹配的子串后返回替換的字符串。當(dāng)repl是一個字符串時,可以使用id或g、g引用分組,但不能使用編號0。當(dāng)repl是一個方法時,這個方法應(yīng)當(dāng)只接受一個參數(shù)(match對象),并返回一個字符串用于替換(返回的字符串不能再引用分組)。

Count用于指定最多替換次數(shù),不指定時全部替換。

7.subn(repl,string[,count])|re.sub(pattern,repl,string[,count]):

返回(sub(repl,string[,count]),替換次數(shù))。


  • x ?

  • aeiou ?

  • 文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43608.html

    相關(guān)文章

    • Python基礎(chǔ)教程:-正則達(dá)式基本語法以及re模塊

      摘要:正則表達(dá)式關(guān)閉或可選標(biāo)志。如果所含正則表達(dá)式,以表示,在當(dāng)前位置成功匹配時成功,否則失敗。否則指的是八進(jìn)制字符碼的表達(dá)式。 正則表達(dá)式是個很牛逼的東西,不管是在javascript,還是在Python web開發(fā)(http://www.maiziedu.com/course/python-px...)中,我們都會遇到正則表達(dá)式,雖然javascript和Python的正則表達(dá)式區(qū)別不大...

      y1chuan 評論0 收藏0
    • PythonPython正則達(dá)式使用指導(dǎo)

      摘要:反斜杠的困擾與大多數(shù)編程語言相同,正則表達(dá)式里使用作為轉(zhuǎn)義字符,這就可能造成反斜杠困擾。文本中正則表達(dá)式結(jié)束搜索的索引。以元組形式返回全部分組截獲的字符串。用于指定最大分割次數(shù),不指定將全部分割。 1. 正則表達(dá)式基礎(chǔ) 1.1. 簡單介紹 正則表達(dá)式并不是Python的一部分。正則表達(dá)式是用于處理字符串的強(qiáng)大工具,擁有自己獨(dú)特的語法以及一個獨(dú)立的處理引擎,效率上可能不如str自帶的方法...

      nihao 評論0 收藏0
    • python-文本處理和正則達(dá)式

      摘要:標(biāo)記一個子表達(dá)式的開始和結(jié)束位置。用和進(jìn)行搜索和替換二者幾乎是一樣的,都是將某字符串中所有匹配正則表達(dá)式模式的部分進(jìn)行替換。 【未完成初稿】這周在工作中遇到很多需要從一段字符中增刪查改的工作,第一遍用自己寫的腳本去做,結(jié)果是可重用性不高,而且效率也不太好。其中也用到了python中的正則表達(dá)式部分re,后來就想能不能將我遇到的這類問題全部用正則去解決,具體就是python的re模塊。答...

      dailybird 評論0 收藏0
    • Python正則達(dá)式很難?一篇文章搞定他,不是我吹!

      摘要:正則表達(dá)式語法字符與字符類特殊字符以上特殊字符要想使用字面值,必須使用進(jìn)行轉(zhuǎn)義字符類包含在中的一個或者多個字符被稱為字符類,字符類在匹配時如果沒有指定量詞則只會匹配其中的一個。 1. 正則表達(dá)式語法 1.1 字符與字符類 1 特殊字符:.^$?+*{}| 以上特殊字符要想使用字面值,必須使用進(jìn)行轉(zhuǎn)義 2 字符類 1. 包含在[]中的一個或者多個字符被稱為字符類,字符類在匹配時如果沒有指...

      dcr309duan 評論0 收藏0
    • 使用Python正則達(dá)式操作文本數(shù)據(jù)

      摘要:在中,使用的內(nèi)置模塊處理正則表達(dá)式操作。使用正則表達(dá)式對象在字符串中搜索模式。編寫和使用正則表達(dá)式在中創(chuàng)建正則表達(dá)式的第一步是導(dǎo)入模塊正則表達(dá)式使用模式字符串表示,模式字符串是指定所需搜索模式的字符串。 showImg(https://segmentfault.com/img/remote/1460000019166945?w=504&h=300); 來源 | 愿碼(ChainDes...

      Yuanf 評論0 收藏0
    • Python 正則達(dá)式 re 模塊簡明筆記

      摘要:假設(shè)現(xiàn)在想把字符串你好,,世界中的中文提取出來,可以這么做你好,,世界注意到,我們在正則表達(dá)式前面加上了兩個前綴,其中表示使用原始字符串,表示是字符串。本文標(biāo)題為正則表達(dá)式模塊簡明筆記本文鏈接為參考資料正則表達(dá)式 簡介 正則表達(dá)式(regular expression)是可以匹配文本片段的模式。最簡單的正則表達(dá)式就是普通字符串,可以匹配其自身。比如,正則表達(dá)式 hello 可以匹配字符...

      lastSeries 評論0 收藏0

    發(fā)表評論

    0條評論

    Juven

    |高級講師

    TA的文章

    閱讀更多
    最新活動
    閱讀需要支付1元查看
    <