1. 程式人生 > >Python正則表示式中的貪心模式和非貪心模式

Python正則表示式中的貪心模式和非貪心模式

宣告:最近發現有人利用我在百度雲盤裡免費分享的127課Python視訊盈利,並聲稱獲得我的授權。在此,我宣告,文末百度雲盤裡的Python視訊是免費的,不會授權給任何人或機構進行銷售。如果再發現有人賣這些視訊,我將訴諸於法律對其進行嚴厲打擊。

分割線========

正則表示式並不是Python獨有的,而是一套獨立的語法,很多程式語言都支援。不同語言中使用的正則表示式語法並不完全一樣,但大體都是類似的。

之前已經推送過Python中使用正則表示式的一些例子,詳見文末的相關閱讀。本文重點介紹一下貪心模式和非貪心模式的用法和區別。在預設情況下,正則表示式是按照貪心模式去匹配的,也就是去匹配能夠匹配到的儘可能多的內容。例如:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

在上面的程式碼中,正則表示式中第一個\b表示匹配單詞頭,後面還有個字母b,表示匹配以字母b開頭的單詞,後面一個圓點.表示匹配任意字元(包括空格),然後加號+表示前面的任意字元出現一次或多次,最後一個\b表示匹配單詞尾。那麼問題來了,什麼算是單詞尾呢?空白字元和標點符號都算單詞尾,但是正則表示式預設使用貪心模式,也就是匹配儘可能多的內容,所以上面的程式碼匹配到的文字中最後一個單詞尾。如圖:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

那如何才能只匹配以字母b開始的單詞而不是像上面這樣子呢?可以使用非貪心模式。非貪心模式是使用問號“?”完成的,在正則表示式中,如果問號前面是普通字元或子模式,表示問號前面的字元或子模式可以出現也可以不出現。但是如果問號緊跟在+、*和{m,n}這樣的內容後面,則表示非貪心模式,也就是匹配儘可能少的內容。以上面的問題為例,改為非貪心模式,例如:

640?wx_fmt=png

下面的程式碼進一步演示了貪心模式和非貪心模式的區別:

640?wx_fmt=png

當然,回到本文最初的問題,如果只是為了匹配以字母b開始的單詞,是不用這麼麻煩,直接使用\w就好了,因為\w只能匹配字母、數字或下劃線,而不能匹配空格。例如:

640?wx_fmt=png

----------相關閱讀----------

教學課件

系列題庫分享

隨機分享的技術文章

閒聊

----------喜大普奔----------

1、董付國老師Python系列教材:

《Python程式設計基礎》(2018年2月第6次印刷)

《Python程式設計(第2版)》(2018年2月第5次印刷)

《Python可以這樣學》(2018年2月第5次印刷)(本書已被引入臺灣發行繁體版)

《Python程式設計開發寶典》(2018年2月第3次印刷)

《中學生可以這樣學Python》

《Python程式設計基礎(第2版)》(2018年3月隆重上市)

2、董老師120課免費視訊地址: https://pan.baidu.com/s/1jJeAs8Q 密碼: px59

3、董老師CSDN學院9套“Python可以這樣學”收費視訊課程彙總地址:https://edu.csdn.net/search?keywords=%E8%91%A3%E4%BB%98%E5%9B%BD&type=0

相關推薦

Python表示式貪心模式貪心模式

宣告:最近發現有人利用我在百度雲盤裡免費分享的127課Python視訊盈利,並聲稱獲得我的授權。

Python表示式的簡單應用示例演示

前一陣子小編給大家連續分享了十篇關於Python正則表示式基礎的文章,感興趣的小夥伴可以點選連結進去檢視。今天小編給大家分享的是Python正則表示式的簡單應用和示例演示,將前面學習的Python正則表示式做一個概括。 下面的栗子是用於提取高考日期,一般來說,我們填寫日期都會寫2018年6月7日,但

關於python表示式匹配分組的問題

在爬取網頁資訊時,我們不妨會用到Python正則表示式。之前一直沒有太明白關於正則表示式匹配分組的問題,今天終於搞清楚了,所以特意寫一下讓自己印象深刻。 myPage = requests.get(url).content.decode("gbk") 通過requests我們在網頁得到了這樣

Python表示式的re.S的作用

在Python的正則表示式中,有一個引數為re.S。它表示“.”(不包含外側雙引號,下同)的作用擴充套件到整個字串,包括“\n”。看如下程式碼: import re a = '''asdfhellopass: 123 worldaf '''

Python表示式的常用符號

Python正則表示式中常用的符號 簡介 正則表示式之所以叫做正則表示式,是因為他們可以識別正則字串;源字一本書中的定義是:“如果你給我的字串符合規則,我就返回它”,或者是“如果字串不符合規則,我就忽略它”。Python正則表示式在編寫網路爬蟲程式碼時使用可

python表示式擴充套件符號擴充套件一些訓練小mark

關於正則式的簡要介紹: 1.擴充套件符號 2.一些正則式訓練 # -*- coding: utf-8 -*- """ Created on Sat Jan 6 19:20:43 2018 @

python表示式的懶惰匹配貪婪匹配

第一次碰到這個問題的時候,確實不知道該怎麼辦,後來請教了一個大神,加上自己的理解,才瞭解是什麼意思,這個東西寫python的會經常用到,而且會特別頻繁,在此寫一篇部落格,希望可以幫到一些朋友。例:一個字串 “abcdacsdnd”    ①懶惰匹配        regex

Python表示式--每日一點 檢索替換

簡單的對上期的search和match進行一下簡單補充,兩者最大的區別在於match是從開始部分進行匹配,沒有匹配到就返回空,而search是整句掃描進行匹配 好了,開始今天的內容 大

python表示式的分組 group

組是通過 "(" 和 ")" 元字元來標識的。 "(" 和 ")" 有很多在數學表示式中相同的意思;它們一起把在它們裡面的表示式組成一組。舉個例子,你可以用重複限制符,象 *, +, ?, 和 {m,n},來重複組裡的內容,比如說(ab)* 將匹配零或更多個重複的 "ab

詳解表示式的\B\b

對於正則表示式的中\B和\b 有些地方會出現弄不懂的情況 或許你看了下面這篇部落格 你就能夠對\B和\b認識加深了 根據檢視API可以知道 \B和\b都是邊界匹配符 先說說\b這個單詞邊界吧!竟然想了解 首先必須清楚什麼叫單詞邊界!我們可以以\b為分

關於表示式數量詞的貪婪與貪婪模式

在匹配正則的時候或許會遇到返回的結果多幾個字元或者少幾個字元,什麼原因呢,這個就是正則的貪婪與非貪婪模式,假設,我的匹配字元是: a = 'asdf444adfadf   adfsadf' 正則表示式的貪婪模式: [a-z]{2,6} 列印結果 ['asdf',

關於表示式——捕獲型括號捕獲型括號

對於括號中的子表示式,正則表示式會將匹配的子表示式進行儲存。 <pre class="javascript" name="code">var regular = /^Subject:(\d)/ var str = "Subject:1 as something"

Python表示式裡的單行re.S多行re.M模式

Python正則表示式裡的單行re.S和多行re.M模式   Python 的re模組內建函式幾乎都有一個flags引數,以位運算的方式將多個標誌位相加。其中有兩個模式:單行(re.DOTALL, 或者re.S)和多行(re.MULTILINE, 或者re.M)模式。它們初看上去不好理解,但是有

表示式的貪婪模式懶惰模式

1,需求:從這段字串的匹配出<h3></h3>中的內容 <h3>abd</h3><h3>bcd</h3><h3>dfsd</h3> 我們可以寫這兩種正則表示式來實現 1,<h3>.{0,}<

python表示式模組researchmatch方法的區別

re.search(pattern, string, flags=0)¶ Scan through string looking for the first location where the regular expression pattern produces a m

js表示式的貪婪模式貪婪模式

在講貪婪模式和惰性模式之前,先回顧一下JS正則基礎: 寫法基礎: ①不需要雙引號,直接用//包含 => /wehfwue123123/.test(); ②反斜槓\表示轉義 =>/\.jpg$/ ③用法基礎:.test(str); 語法: ①錨點類 /^a/=&g

python表示式re m.groupm.groups的解釋

先看程式碼 instance: 究其因: 正則表示式中的三組括號把匹配結果分成三組 m.group() == m.group(0) == 所有匹配的字元(即匹配正則表示式整體結果) group(1) 列出第一個括號匹配部分,group(2)

Python表示式的貪婪模式貪婪模式

貪婪模式是把所有匹配的獲取到,非貪婪模式只取到第一個匹配到的字串,在python中findall和match的區別。 http://blog.csdn.net/qq_33447462/article/details/51485900 .*與.*?的區別:

python 表示式找出字串的純數字

1、簡單的做法 >>> import re >>> re.findall(r'\d+', 'hello 42 I'm a 32 string 30') ['42', '32', '30'] 然而,這種做法使得字串中非純數字也會識別 >

Java表示式相關類PatternMatcher的使用

在Java中,java.util.regex包定義了正則表示式使用到的相關類,其中最主要的兩個類為:Pattern、Matcher:   Pattern 編譯正則表示式後建立一個匹配模式;   Matcher 使用Pattern例項提供的正則表示式對目標字串進行匹