1. 程式人生 > 程式設計 >詳解Python 最短匹配模式

詳解Python 最短匹配模式

問題

你正在試著用正則表示式匹配某個文字模式,但是它找到的是模式的最長可能匹配。 而你想修改它變成查詢最短的可能匹配。

解決方案

這個問題一般出現在需要匹配一對分隔符之間的文字的時候(比如引號包含的字串)。 為了說明清楚,考慮如下的例子:

>>> str_pat = re.compile(r'"(.*)"')
>>> text1 = 'Computer says "no."'
>>> str_pat.findall(text1)
['no.']
>>> text2 = 'Computer says "no." Phone says "yes."'
>>> str_pat.findall(text2)
['no." Phone says "yes.']
>>>

在這個例子中,模式 r'\"(.*)\"' 的意圖是匹配被雙引號包含的文字。 但是在正則表示式中*操作符是貪婪的,因此匹配操作會查詢最長的可能匹配。 於是在第二個例子中搜索 text2 的時候返回結果並不是我們想要的。

為了修正這個問題,可以在模式中的*操作符後面加上?修飾符,就像這樣:

>>> str_pat = re.compile(r'"(.*?)"')
>>> str_pat.findall(text2)
['no.','yes.']
>>>

這樣就使得匹配變成非貪婪模式,從而得到最短的匹配,也就是我們想要的結果。

討論

這一節展示了在寫包含點(.)字元的正則表示式的時候遇到的一些常見問題。 在一個模式字串中,點(.)匹配除了換行外的任何字元。 然而,如果你將點(.)號放在開始與結束符(比如引號)之間的時候,那麼匹配操作會查詢符合模式的最長可能匹配。 這樣通常會導致很多中間的被開始與結束符包含的文字被忽略掉,並最終被包含在匹配結果字串中返回。 通過在 * 或者 + 這樣的操作符後面新增一個 ? 可以強制匹配演算法改成尋找最短的可能匹配。

以上就是詳解Python 最短匹配模式的詳細內容,更多關於Python 最短匹配模式的資料請關注我們其它相關文章!