python正規表示式 貪婪 非貪婪

2021-09-30 16:48:42 字數 2644 閱讀 9230

主要就是.* 與.*?的區別,.* 是貪婪的,.*?是非貪婪的例子如下:

import re 

line = "cats are smarter than dogs"

matchobj1 = re.match( r'(.*)are(.*?)(.*)', line)

matchobj2 = re.match( r'(.*)are(.+?)(.*)', line)

>>>matchobj1.group(1),matchobj1.group(2),matchobj1.group(3)

('cats ', '', ' smarter than dogs')

>>>matchobj2.group(1),matchobj2.group(2),matchobj2.group(3)

('cats ', ' ', 'smarter than dogs')

分析:.* 是貪婪的,.*?是非貪婪的,are精確匹配,所以( .* )即group(1)匹配到的肯定是』cats ',.*?是非貪婪的,所以只要後面的滿足,(.*?)可以匹配任意長度,於是( . ? )即group(2)就匹配為空,最後(.)即group(3)貪婪匹配,就匹配後面所有的。. *? 與.+?唯一區別在於前者可以為空,後者至少匹配乙個字元。

除此之外,+ 以及也是貪婪的。+? ?就是非貪婪的。

import re

content = 'hello 1234567 world_this is a regex demo'

result1 = re.match('^he(.*)(\d+)(.*)demo$', content)

result2 = re.match('^he(.*)(\d+?)(.*)demo$', content)

result3 = re.match('^he(.*?)(\d+)(.*)demo$', content)

result4 = re.match('^he(.*?)(\d+?)(.*)demo$', content)

result5 = re.match('^he(.*?)(.+?)(.*)demo$', content)

result6 = re.match('^he(.*?)(.+)(.*)demo$', content)

result7 = re.match('^he(.)(.*)(.+)demo$', content)

考慮上面七種情況結果分別是什麼(注意:下面有的字元是空格,有的為空,不一樣的):

>>>result1.group(1),result1.group(2),result1.group(3)

('llo 123456', '7', ' world_this is a regex ')

>>>result2.group(1),result2.group(2),result2.group(3)

('llo 123456', '7', ' world_this is a regex ')

>>>result3.group(1),result3.group(2),result3.group(3)

('llo ', '1234567', ' world_this is a regex ')

>>>result4.group(1),result4.group(2),result4.group(3)

('llo ', '1', '234567 world_this is a regex ')

>>>result5.group(1),result5.group(2),result5.group(3)

('', 'l', 'lo 1234567 world_this is a regex ')

>>>result6.group(1),result6.group(2),result6.group(3)

('', 'llo 1234567 world_this is a regex ', '')

>>>result7.group(1),result7.group(2),result7.group(3)

('llo ', '1234567 world_this is a regex', ' ')

我把正規表示式的乙個小模組總結為以下三個基本元素構成:

下面是一些例子:

.* 貪婪匹配盡可能多的任意字元,可以匹配為空。

.*? 非貪婪匹配盡可能少的任意字元,可以匹配為空。

\d+ 貪婪匹配盡可能多的數字,不可以匹配為空,至少匹配乙個數字。

\d+? 非貪婪匹配盡可能少的數字,不可以匹配為空,至少匹配乙個數字。

. 貪婪匹配盡可能多的任意字元,最多m位,最少n位。

.? 非貪婪匹配盡可能少的任意字元,最多m位,最少n位。

.+? 非貪婪匹配盡可能少的任意字元,不可以匹配為空,至少匹配乙個任意字元。

.+ 貪婪匹配盡可能多的任意字元,不可以匹配為空,至少匹配乙個任意字元。

.? 貪婪匹配,可以匹配0或1個任意字元。

.?? 非貪婪匹配,可以匹配0或1個任意字元(不過這兩個基本不會有人用)

正規表示式 貪婪和非貪婪

源字串 aatest1 bbtest2 cc 正規表示式一 匹配結果一 test1 bbtest2 貪婪 正規表示式二 匹配結果二 test1 這裡指的是一次匹配結果,所以沒包括test2 非貪婪 貪婪與非貪婪模式影響的是被量詞修飾的子表示式的匹配行為,貪婪模式在整個表示式匹配成功的前提下,盡可能多...

正規表示式 貪婪非貪婪模式

貪婪與非貪婪模式影響的是被量詞修飾的子表示式的匹配行為,貪婪模式在整個表示式匹配成功的前提下,盡可能多的匹配,而非貪婪模式在整個表示式匹配成功的前提下,盡可能少的匹配。非貪婪模式只被部分nfa引擎所支援。1.舉乙個例子 string str abcaxc patter p ab.c 貪婪匹配 正規表...

正規表示式 貪婪與非貪婪

在一段時間內,一直不知道.和.之間的區別,一直單純的覺得兩者之間並沒有什麼區別,都是匹配任意字元,知道今天才知道其中的區別 首先從乙個簡單的問題的問題開始思考 有這樣乙個字串aaabaaab,和這樣的乙個正則.b,那麼.匹配的會是aaab還是aaabaaab呢?由此問題引發出來的就是貪婪與非貪婪模式...