Python3正規表示式 三 貪婪模式與非貪婪模式

2021-08-14 18:55:09 字數 1642 閱讀 1202

在前面兩篇文章當中已經介紹了python用正規表示式的基本運用,接下來總結一下正規表示式中的貪婪模式和非貪婪模式。

首先舉個例子:

example = "abbbbbbc"

pattern = re.compile("ab+")

貪婪模式:正規表示式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式pattern 匹配字串example,匹配到的結果就是」abbbbbb」整個字串。

非貪婪模式:在整個表示式匹配成功的前提下,盡可能少的匹配。如上面使用模式pattern 匹配字串example,匹配到的結果就只是」ab」整個字串。

在python中預設採用的是貪婪模式,使用非貪婪模式的話,只需要在量詞後面直接加上乙個問號」?」。

在第一篇文章中介紹了正規表示式當中的量詞一共有五種:

在正規表示式中一般預設採用的是貪婪模式,在上面的例子當中已經匹配到了「ab」時已經可以使整個表示式匹配成功,但是由於採用的是貪婪模式,所以還需要往後繼續匹配,檢查時候存在更長的可以匹配成功的字串。一直到匹配到最後乙個」b」的時候,後面已經沒有可以成功匹配的字串了,匹配結束。返回匹配結果「abbbbbb」。

所以,我們可以將貪婪模式理解為:在整個表示式匹配成功的前提下,盡可能多的匹配。

非貪婪模式也就是將我們例子中的正規表示式「ab+」改為」ab+?」,當匹配到「ab」時,已經匹配成功,直接結束匹配,不在向後繼續嘗試,返回匹配成功的字串」ab」。

所以,我們可以將非貪婪模式理解為:在整個表示式匹配成功的前提下,盡可能少的匹配

import re

example = "test1

test2

"greedpattern = re.compile(".*

")notgreedpattern = re.compile(".*?

")greedresult = greedpattern.search(example)

notgreedresult = notgreedpattern.search(example)

print("greedresult = %s" % greedresult.group())

print("notgreedresult = %s" % notgreedresult.group())

執行結果:

1.從應用角度看貪婪與非貪婪

貪婪與非貪婪模式影響的是被量詞修飾的子表示式的匹配行為,貪婪模式在整個表示式匹配成功的前提下,盡可能多的匹配;而非貪婪模式在整個表示式匹配成功的前提下,盡可能少的匹配。

2.從匹配原理角度看貪婪與非貪婪

能達到同樣匹配結果的貪婪與非貪婪模式,通常是貪婪模式的匹配效率較高。 所有的非貪婪模式,都可以通過修改量詞修飾的子表示式,轉換為貪婪模式。 貪婪模式可以與固化分組結合,提公升匹配效率,而非貪婪模式卻不可以。

python3正規表示式

正規表示式,又稱規則表示式。英語 regular expression,在 中常簡寫為regex regexp或re 電腦科學的乙個概念。正規表示式通常被用來檢索 替換那些符合某個模式 規則 的文字。正規表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元 及這些特定字元的組合,組成乙個...

Python3 正規表示式

常用的匹配模式 正規表示式是乙個特殊的字串行,它能幫助你方便的檢查乙個字串是否與某種模式匹配。re 模組使 python 語言擁有全部的正規表示式功能。re.match函式 re.match 嘗試從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功的話,match 就返回none。re.match...

Python3 正規表示式

正規表示式是乙個特殊的字串行,它能幫助你方便的檢查乙個字串是否與某種模式匹配。python 自1.5版本起增加了re 模組,它提供 perl 風格的正規表示式模式。re 模組使 python 語言擁有全部的正規表示式功能。compile 函式根據乙個模式字串和可選的標誌引數生成乙個正規表示式物件。該...