国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python正則表達式教程之三:貪婪/非貪婪特性

2019-11-25 16:20:23
字體:
供稿:網(wǎng)友

之前已經(jīng)簡單介紹了Python正則表達式的基礎(chǔ)捕獲,那么在這一篇文章里,我將總結(jié)一下正則表達式的貪婪/非貪婪特性。 

貪婪

默認情況下,正則表達式將進行貪婪匹配。所謂“貪婪”,其實就是在多種長度的匹配字符串中,選擇較長的那一個。例如,如下正則表達式本意是選出人物所說的話,但是卻由于“貪婪”特性,出現(xiàn)了匹配不當:

>>> sentence = """You said "why?" and I say "I don't know".""">>> re.findall(r'"(.*)"', sentence)['why?" and I say "I don/'t know']

再比如,如下的幾個例子都說明了正則表達式“貪婪”的特性:

>>> re.findall('hi*', 'hiiiii')['hiiiii']>>> re.findall('hi{2,}', 'hiiiii')['hiiiii']>>> re.findall('hi{1,3}', 'hiiiii')['hiii']

非貪婪

當我們期望正則表達式“非貪婪”地進行匹配時,需要通過語法明確說明: 

      {2,5}?    捕獲2-5次,但是優(yōu)先次數(shù)少的匹配

在這里,問號?可能會有些讓人犯暈,因為之前他已經(jīng)有了自己的含義:前面的匹配出現(xiàn)0次或1次。其實,只要記住,當問號出現(xiàn)在表現(xiàn)不定次數(shù)的正則表達式部分之后時,就表示非貪婪匹配。 

還是上面的那幾個例子,用非貪婪匹配,則結(jié)果如下:

>>> re.findall('hi*?', 'hiiiii')['h']>>> re.findall('hi{2,}?', 'hiiiii')['hii']>>> re.findall('hi{1,3}?', 'hiiiii')['hi']

另外一個例子中,使用非貪婪匹配,結(jié)果如下:

>>> sentence = """You said "why?" and I say "I don't know".""">>> re.findall(r'"(.*?)"', sentence)['why?', "I don't know"]

捕獲與非貪婪

嚴格來說,這一部分并不是非貪婪特性。但是由于其行為與非貪婪類似,所以為了方便記憶,就將其放在一起了。 

      (?=abc) 捕獲,但不消耗字符,且匹配abc

      (?!abc) 捕獲,不消耗,且不匹配abc

在正則表達式匹配的過程中,其實存在“消耗字符”的過程,也就是說,一旦一個字符在匹配過程中被檢索(消耗)過,后面的匹配就不會再檢索這一字符了。 

知道這個特性有什么用呢?還是用例子說明。比如,我們想找出字符串中出現(xiàn)過1次以上的單詞:

>>> sentence = "Oh what a day, what a lovely day!">>> re.findall(r'/b(/w+)/b.*/b/1/b', sentence)['what']

這樣的正則表達式顯然無法完成任務(wù)。為什么呢?原因就是,在第一個(/w+)匹配到what,并且其后的/1也匹配到第二個what的時候,“Oh what a day, what”這一段子串都已經(jīng)被正則表達式消耗了,所以之后的匹配,將直接從第二個what之后開始。自然地,這里只能找出一個出現(xiàn)了兩次的單詞。 

那么解決方案,就和上面提到的(?=abc)語法相關(guān)了。這樣的語法可以在分組匹配的同時,不消耗字符串!所以,正確的書寫方式應(yīng)該是:

>>> re.findall(r'/b(/w+)/b(?=.*/b/1/b)', sentence)['what', 'a', 'day']

如果我們需要匹配一個至少包含兩個不同字母的單詞,則可以使用(?!abc)的語法:

>>> re.search(r'([a-z]).*(?!/1)[a-z]', 'aa', re.IGNORECASE)>>> re.search(r'([a-z]).*(?!/1)[a-z]', 'ab', re.IGNORECASE)<_sre.SRE_Match object; span=(0, 2), match='ab'>

總結(jié)

以上就是Python正則表達式中關(guān)于貪婪的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者使用python能能帶來一定的幫助,如果有疑問大家可以留言交流,如果有疑問大家可以留言交流。下一篇文章,我會繼續(xù)總結(jié)一下Python正則表達式re模塊的一些API的用法,請繼續(xù)關(guān)注武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 云安县| 枣阳市| 乌兰县| 阳泉市| 增城市| 石楼县| 建水县| 顺平县| 辽中县| 崇仁县| 永仁县| 库车县| 正镶白旗| 永春县| 吴江市| 辽中县| 囊谦县| 长海县| 册亨县| 遵义市| 西乡县| 确山县| 家居| 周口市| 桃园市| 瓦房店市| 即墨市| 三都| 鄂托克前旗| 长丰县| 聂拉木县| 奈曼旗| 高青县| 平阴县| 青田县| 通州区| 浦江县| 洛扎县| 桐乡市| 长宁县| 巴彦淖尔市|