Python實用技法第26篇:定義實現最短匹配的正則表達式

上一篇文章: Python實用技法第25篇:正則:以不區分大小寫的方式對文本作查找和替換
下一篇文章: Python實用技法第27篇:編寫多行模式的正則表達式

一、需求🙀

咱們正在嘗試用正則表達式對文本模式作匹配,但識別出來的是最長的可能匹配。相反,咱們想將其修改成最短的可能匹配。

二、解決方案😸

這個問題一般會在匹配的文本被一對開始和結束的分隔符包起來的時候出現(例如帶引號的字符串),爲了說明這個問題,請看下面實例:正則表達式

import re

str_pat=re.compile(r'\"(.*)\"')
text1='mark say "love"'
text2='mark say "love",jingjing say "yes"'
print(str_pat.findall(text1))
print(str_pat.findall(text2))

結果:segmentfault

['love']
['love",jingjing say "yes']

在這個例子中,模式r'"(.*)"'嘗試去匹配包含在引號中的文本。可是,*操做符在正則表達式中採用的是貪心策略,因此匹配過程是基於找出最長的可能匹配來進行的。因此上面纔會出現【love",jingjing say "yes】這個匹配結果。code

要解決這個問題,只要在模式中的*操做符後面加上?修飾符就能夠了。字符串

示例:get

import re

str_pat=re.compile(r'\"(.*?)\"')
text1='mark say "love"'
text2='mark say "love",jingjing say "yes"'
print(str_pat.findall(text1))
print(str_pat.findall(text2))

結果:import

['love']
['love', 'yes']

這麼作使得匹配過程不會以貪心方式進行,也就會產生最短的匹配了。im

三、分析😈

本節提到了一個當編寫還有句點【.】字符的正則表達式常會遇到的問題。爲了解決最長匹配問題,讓匹配變爲最短匹配,須要在*或+後加上一個【?】。解決方案

上一篇文章: Python實用技法第25篇:正則:以不區分大小寫的方式對文本作查找和替換
下一篇文章: Python實用技法第27篇:編寫多行模式的正則表達式
相關文章
相關標籤/搜索